更新日志

  • 2020年10月5日 牛客网 Java 刷题

    一、继承

    1.1 Java 如何实现多继承

    Java 只支持单继承,但是如果要实现多继承,有如下的方式

  1. 直接实现多个接口
  2. 扩展一个类(extends),然后实现一个或多个接口
  3. 通过内部类去继承其他类

1.2 子类继承父类

认清方法的 重写重载
**
image.png

  • 方法的重写,子类不能缩小父类方法的权限 (上面的标注的地方是错误的)
  • 方法的重写(覆盖):方法声明和父类相同,满足重新条件 (参考第二个)
  • 方法的重载:参数列表不同,满足方法重载的条件 (参考第三个和第四个)

    二、封装

三、多态

3.1 多态初始化过程

  1. public class Base
  2. {
  3. private String baseName = "base";
  4. public Base()
  5. {
  6. callName();
  7. }
  8. public void callName()
  9. {
  10. System. out. println(baseName);
  11. }
  12. static class Sub extends Base
  13. {
  14. private String baseName = "sub";
  15. public void callName()
  16. {
  17. System. out. println (baseName) ;
  18. }
  19. }
  20. public static void main(String[] args)
  21. {
  22. // 多态创建子类的对象,会调用父类的 callName() ,发现子类也有 callName() ,会优先调用子类的方法,但是子类的 callName() 未初始化,索引打印的值为 null
  23. Base b = new Sub();
  24. }
  25. }

父类创建子类时,先会初始化基类的对象,然后才能创建派生类

创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null

四、构造方法

4.1 用户不能调用构造方法,只能通过 new 关键字自动调用

答案是错误的,这里说的是外部情况,但是我们没有考虑内部情况

  1. 在类内部,用户可以通过 this.构造方法名() 调用,参数决定调用的对应的构造方法
  2. 在子类中用户可以通过 super.父类构造方法() 调用 (参数决定调用的对应的父类的构造方法)
  3. 反射机制对于任意一个类,在运行期间都能知道这类的所有属性和方法,也包括构造方法

六、类与对象

6.1 Java 创建对象的说法正确的是 (5种方式)

  1. 使用 new 关键字(最常用) objectName obj = new ObjectName();
  2. 使用 对象 clone() 方法:ObjectName obj = obj.clone()
  3. 使用反射的Class类的 new Instance() 方法: ObjectName obj = ObjectName.class.newInstance();
  4. 使用反射的Constructor类的newInstance()方法: ObjectName obj = ObjectName.class.getConstructor.newInstance();
  5. 使用反序列化(ObjectInputStream)的readObject()方法: try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME))) { ObjectName obj = ois.readObject(); }

整理至牛客网

6.2 Java 中类之间的关系

USES-A:依赖关系,A类会用到B类,这种关系具有偶然性,临时性。但B类的变化会影响A类。这种在代码中的体现为:A类方法中的参数包含了B类。
关联关系:A类会用到B类,这是一种强依赖关系,是长期的并非偶然。在代码中的表现为:A类的成员变量中含有B类。
HAS-A:聚合关系,拥有关系,是关联关系的一种特例,是整体和部分的关系。比如鸟群和鸟的关系是聚合关系,鸟群中每个部分都是鸟。
IS-A:表示继承。父类与子类,这个就不解释了。
要注意:还有一种关系:组合关系也是关联关系的一种特例,它体现一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分的关系,但这种整体和部分是不可分割的。

七、接口

7.1 接口的修饰符

JDK 1.8 之后,因为接口是是一种特殊的抽象类,由其他的类来实现的接口中所有的方法。而且接口可以去继承一个已有的接口

  1. default
  2. abstract

接口中修饰字段的修饰符

  1. public
  2. static
  3. final

接口中修饰方法的修饰符

  1. public
  2. abstract

    7.2 接口的多继承问题

    接口可以继承多个接口
    interface extends interface1,interface2…

八、序列化

一个 Java 实现序列化接口会发生什么?

  • 序列化的是对象,不是类,类变量不会序列化
  • Java 序列化时,不保存静态变量
  • transient static 修饰的变量不会被序列化


  1. public class DataObject implements Serializable{
  2. private static int i=0;
  3. private String word=" ";
  4. public void setWord(String word){
  5. this.word=word;
  6. }
  7. public void setI(int i){
  8. Data0bject. i=I;
  9. }
  10. }
  11. DataObject object=new Data0bject ( );
  12. object.setWord("123"); // word 123
  13. object. setI(2); // 0

九、类加载的生命周期

  • 静态变量
  • 静态代码块
  • 成员变量
  • 实例代码块
  • 构造方法