语法类问题
关于==符号的使用
答: 在 equals 默认情况下,判断的是两个对象的地址值,若地址相同返回true equals不重写的情况,**等价于==**
equals存在的意义就是让程序员重写自己的判断准则
枚举是多例模式
//1.枚举类型
public enum sex{ GRIL,BOY }
//2.枚举反编译
public final class sex extends java.lang.Enum<sex> {
public static final sex GRIL;
public static final sex BOY;
public static sex[] values();
public static sex valueOf(java.lang.String);
static {};
}
javac sex.java 编译 javap sex.class 反编译 在反编译中可以发现,枚举类型是 static final ,而且枚举构造器是私有的。
枚举是多例模式
关于变量,常量,静态变量,静态常量 问题
答:**
1. 首先区分什么叫静态与非静态 ? [ **static 修饰** ]
- 静 态:对于该类的对象来说,都只有一个。叫作类变量。
- 非静态:每个该类的对象都各有一个拷贝。叫作成员变量。
2. 首先区分什么叫变量与常量 ? [ **final 修饰** ]
- 变量:可以修改值。
- 常量:无法修改值。
总结: 静态变量: static double arg ; 静态常量: static final double arg; **
static final 修饰静态成员变量 ( 2种赋值方式 )
public class Demo {
//1.初始定义时
public static final String NAME_1="Hello";
//2.静态代码块
public static final String NAME_2;
static{ NAME_2="Hi"; }
}
final 修饰成员变量( 3种赋值方式 )
public class Demo {
//1.初始定义时
public final String NAME_1="Hello";
//2.实例代码块中
public final String NAME_2;
{ NAME_2="Hi"; }
//3.构造函数中
Demo(){NAME_2="Hi";}
}
构造器问题
子类构造器的调用顺序
1. 先调用父类的构造器
- 子类构造器第一行默认隐藏含有Super( ),写不写都存在
- 子类可以调用兄弟构造器**,默认的Super与this不冲突**
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. 在子类中可以定义,[ **返回类型,方法名,参数** ] 与父类一致的方法
- 但不能加上 **overwrite 的注解**
2. 定义的方法被认为是子类的私有方法,子类自己的静态方法
- 既不是重写也不是重载
子类继承父类的公有方法,内存分配情况
答:非静态方法是在实例化后再引用到那个父类的方法区
子类继承后的方法重写注意事项
- 重写的方法与父类方法签名(方法名称和参数列表)相同
- 子类重写的方法访问修饰符范围不能低于父类
- 顺序: public > project > 缺省 > private
- 父类的私有方法不能被重写
- static修饰的方法不能被重写
- 返回值类型:
- 如果父类中方法返回值类型是八大基本类型、String和void,则必须相同
- 如果是其他引用类型,则重写方法中返回值类型相同或其父类返回类型的子类。
- 关于异常,子类重写方法异常范围要小于父类方法异常或没有异常。
子类重写后如何调用父类的方法 ?
答:通过中转,利用其他成员函数,在函数中通过 Super.Method( ) 调用父类重写前的方法
内部类问题
静态内部类的加载顺序问题
答:静态内部类不会自动初始化,只有调用静态内部类的方法,静态域,或者构造方法的时候才会加载 故而可以用来设计单例模式 ** 详情解释传送门: https://www.yuque.com/qingxuan-u4juc/gmwol6/kg7cs3#0ztEK
抽象类问题
抽象类是否含有构造器 ?能否创建对象 ?
答:**
1. 抽象类**含有构造器** [ 构造函数 ]
1. 抽象类不能创建对象
- 抽象类代表了抽象,抽象不能被实体化
- **动物**代表抽象:没有具体的对象叫动物
- **老虎**代表具体:具体可以创建的对象
抽象类的构造器能否被定义为 private ?
答: 可以,但是没有意义
抽象类存在的意义就是被继承实现具体化,若构造器被定义为 private 则无法继承,失去了存在的意义
构造器定义private正确的用法:
此类为工具类,不想被人实例化出对象,其中所有的方法为 public static 如 lang.math
接口类问题
类必须实现接口中的所有方法,否则类必须定义为抽象类
接口是否含有构造器 ? 接口能否创建对象 ?
答: 接口是更彻底的抽象,不含有构造器,自然也不能创建对象 注意: 抽象类**含有构造器,但是不能创建方法
接口新增的特性
JDK1.8之前接口只能定义 常量和抽象方法 **
1. **public static final**** int i=1;**
1. **public abstract void Method();**
JDK1.8后接口不再纯洁,新增默认方法,静态方法,JDK1.9后新增私有方法**
- **默认方法:**
1. 必须用 default 修饰
1. 默认会自动加 public 修饰
1. 只能用接口的**实现类的对象**来调用
- **静态方法:**
1. 可以直接加 static 修饰
1. 默认会加 public 修饰
1. 接口的静态方法只能用**接口的类名称本身调用 ( 预防二义性 )**
- **私有方法:----**只能**给默认方法****和实现****类调用**
1. 其实就是私有的实例方法,必须加 private 修饰
**
父类成员方法与接口默认方法相同时,子类怎么调用 ?
答:父类是亲爹,接口是干爹,就近原则调用父类的成员方法
extends 与 implements 顺序问题
答:**extends 必须在 implements 前面
关于实现多接口,多接口含有相同的默认方法时的问题
答:实现类必须重写该冲突方法 默认方法是给实现类调用的,因此必须重写来解决二义性问题
面向对象类问题
多态的编译和运行,以及多态的弊端问题
答:多态编译方法看左边,运行看右边。故子类特有方法无法调用,需要强转
- 编译时查看父类是否有此方法,若没有则报错
- 运行时调用子类的重写方法,若没有则调用父类的方法。
多态编译变量看左边,运行看左边。—————变量没有多态 **