语法类问题

关于==符号的使用

答: equals 默认情况下,判断的是两个对象的地址值,若地址相同返回true equals不重写的情况,**等价于==**
equals存在的意义就是让程序员重写自己的判断准则


枚举是多例模式

  1. //1.枚举类型
  2. public enum sex{ GRIL,BOY }
  3. //2.枚举反编译
  4. public final class sex extends java.lang.Enum<sex> {
  5. public static final sex GRIL;
  6. public static final sex BOY;
  7. public static sex[] values();
  8. public static sex valueOf(java.lang.String);
  9. static {};
  10. }

javac sex.java 编译 javap sex.class 反编译 在反编译中可以发现,枚举类型是 static final ,而且枚举构造器是私有的。

枚举是多例模式


关于变量,常量,静态变量,静态常量 问题

答:**

  1. 1. 首先区分什么叫静态与非静态 [ **static 修饰** ]
  2. - 态:对于该类的对象来说,都只有一个。叫作类变量。
  3. - 非静态:每个该类的对象都各有一个拷贝。叫作成员变量。
  4. 2. 首先区分什么叫变量与常量 [ **final 修饰** ]
  5. - 变量:可以修改值。
  6. - 常量:无法修改值。

总结: 静态变量: static double arg ; 静态常量: static final double arg; **

static final 修饰静态成员变量 ( 2种赋值方式 )

  1. public class Demo {
  2. //1.初始定义时
  3. public static final String NAME_1="Hello";
  4. //2.静态代码块
  5. public static final String NAME_2;
  6. static{ NAME_2="Hi"; }
  7. }

final 修饰成员变量( 3种赋值方式 )

  1. public class Demo {
  2. //1.初始定义时
  3. public final String NAME_1="Hello";
  4. //2.实例代码块中
  5. public final String NAME_2;
  6. { NAME_2="Hi"; }
  7. //3.构造函数中
  8. Demo(){NAME_2="Hi";}
  9. }

构造器问题

子类构造器的调用顺序

  1. 1. 先调用父类的构造器
  2. - 子类构造器第一行默认隐藏含有Super( ),写不写都存在
  3. - 子类可以调用兄弟构造器**,默认的Superthis不冲突**
  4. 2. 再调用自身的构造器

this和super不能同时出现

super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。



**


继承问题

关于实现多接口,接口包含重复抽象方法问题

Java类不允许多继承是因为父类相同方法的二义性,若多个接口抽象方法相同呢 ?

传送门:https://www.yuque.com/qingxuan-u4juc/gmwol6/et4kil

关于实现多接口,接口包含重复默认方法问题 ** 传送门:https://www.yuque.com/qingxuan-u4juc/gmwol6/qye289/edit#byQ2Q

子类能否继承父类构造器问题 ?

答:子类不能继承父类的构造器 [ 构造函数 ],但是可以通过 super 使用

子类能否继承父类的私有成员变量 / 私有方法 ?


成员变量官方解释:

子类不能继承private其父类的成员。但是,如果超类具有用于访问其私有字段的公共或受保护的方法,则子类也可以使用这些方法。

成员变量个人理解:

答:子类能继承父类的私有成员变量 ,只是无法直接使用。

  1. - 需要通过公共接口,或者暴力手段反射来获取
  2. - 父类的私有变量也确实在子类的内存中

私有方法官方解释:

私有方法不能被继承,乌龟的屁股,规定

子类能否继承父类的 静态变量 / 方法 ?

答:子类不能继承父类的静态**变量静态方法,虽然可以直接使用,但是并未继承 解释:**

  1. - 子类可以用,只是因为父类的共享,**共享不代表继承**
  2. - 你爸把车给你开,不代表你继承了你爸的车
  3. - 静态变量是类变量只有唯一的一个存储在父类的静态区中
  4. - 静态方法是类方法只有唯一的一个存储在父类的静态区中

子类能否重写父类的静态方法和私有方法 ?

答:不能,**都没继承谈何重写**

解释:

  1. 1. **静态方法**
  2. - 重写的意义:得到父类的方法,并感觉父类不好用才去重写
  3. - 静态方法子类并未继承,谈不上得到,因此无法重写
  4. 2. **私有方法**
  5. - **规定,****规定不能重写**
  6. - 并且私有方法也无法继承

注意:

  1. 1. 在子类中可以定义,[ **返回类型,方法名,参数** ] 与父类一致的方法
  2. - 但不能加上 **overwrite 的注解**
  3. 2. 定义的方法被认为是子类的私有方法,子类自己的静态方法
  4. - 既不是重写也不是重载


子类继承父类的公有方法,内存分配情况

答:非静态方法是在实例化后再引用到那个父类的方法区

子类继承后的方法重写注意事项

  • 重写的方法与父类方法签名(方法名称和参数列表)相同
  • 子类重写的方法访问修饰符范围不能低于父类
    • 顺序: public > project > 缺省 > private
  • 父类的私有方法不能被重写
  • static修饰的方法不能被重写
  • 返回值类型:
    • 如果父类中方法返回值类型是八大基本类型、String和void,则必须相同
    • 如果是其他引用类型,则重写方法中返回值类型相同或其父类返回类型的子类
    • 关于异常,子类重写方法异常范围要小于父类方法异常或没有异常

子类重写后如何调用父类的方法 ?

答:通过中转,利用其他成员函数,在函数中通过 Super.Method( ) 调用父类重写前的方法


内部类问题

静态内部类的加载顺序问题

答:静态内部类不会自动初始化,只有调用静态内部类的方法,静态域,或者构造方法的时候才会加载 故而可以用来设计单例模式 ** 详情解释传送门: https://www.yuque.com/qingxuan-u4juc/gmwol6/kg7cs3#0ztEK


抽象类问题

抽象类是否含有构造器 ?能否创建对象 ?

答:**

  1. 1. 抽象类**含有构造器** [ 构造函数 ]
  2. 1. 抽象类不能创建对象
  3. - 抽象类代表了抽象,抽象不能被实体化
  4. - **动物**代表抽象:没有具体的对象叫动物
  5. - **老虎**代表具体:具体可以创建的对象

抽象类的构造器能否被定义为 private ?

答: 可以,但是没有意义

抽象类存在的意义就是被继承实现具体化,若构造器被定义为 private 则无法继承,失去了存在的意义

构造器定义private正确的用法:

此类为工具类,不想被人实例化出对象,其中所有的方法为 public staticlang.math


接口类问题

类必须实现接口中的所有方法,否则类必须定义为抽象类

接口是否含有构造器 ? 接口能否创建对象 ?

答: 接口是更彻底的抽象,不含有构造器,自然也不能创建对象 注意: 抽象类**含有构造器,但是不能创建方法

接口新增的特性

JDK1.8之前接口只能定义 常量和抽象方法 **

  1. 1. **public static final**** int i=1;**
  2. 1. **public abstract void Method();**

JDK1.8后接口不再纯洁,新增默认方法,静态方法,JDK1.9后新增私有方法**

  1. - **默认方法:**
  2. 1. 必须用 default 修饰
  3. 1. 默认会自动加 public 修饰
  4. 1. 只能用接口的**实现类的对象**来调用
  5. - **静态方法:**
  6. 1. 可以直接加 static 修饰
  7. 1. 默认会加 public 修饰
  8. 1. 接口的静态方法只能用**接口的类名称本身调用 ( 预防二义性 )**
  9. - **私有方法:----**只能**给默认方法****和实现****类调用**
  10. 1. 其实就是私有的实例方法,必须加 private 修饰

**

父类成员方法与接口默认方法相同时,子类怎么调用 ?

答:父类是亲爹,接口是干爹,就近原则调用父类的成员方法

extends 与 implements 顺序问题

答:**extends 必须在 implements 前面

关于实现多接口,多接口含有相同的默认方法时的问题

答:实现类必须重写该冲突方法 默认方法是给实现类调用的,因此必须重写来解决二义性问题


面向对象类问题

多态的编译和运行,以及多态的弊端问题

答:多态编译方法看左边,运行看右边。故子类特有方法无法调用,需要强转

  1. - 编译时查看父类是否有此方法,若没有则报错
  2. - 运行时调用子类的重写方法,若没有则调用父类的方法。

多态编译变量看左边,运行看左边。—————变量没有多态 **