更新日志
- 直接实现多个接口
- 扩展一个类(extends),然后实现一个或多个接口
- 通过内部类去继承其他类
1.2 子类继承父类
认清方法的 重写 和 重载
**
- 方法的重写,子类不能缩小父类方法的权限 (上面的标注的地方是错误的)
- 方法的重写(覆盖):方法声明和父类相同,满足重新条件 (参考第二个)
- 方法的重载:参数列表不同,满足方法重载的条件 (参考第三个和第四个)
二、封装
三、多态
3.1 多态初始化过程
public class Base
{
private String baseName = "base";
public Base()
{
callName();
}
public void callName()
{
System. out. println(baseName);
}
static class Sub extends Base
{
private String baseName = "sub";
public void callName()
{
System. out. println (baseName) ;
}
}
public static void main(String[] args)
{
// 多态创建子类的对象,会调用父类的 callName() ,发现子类也有 callName() ,会优先调用子类的方法,但是子类的 callName() 未初始化,索引打印的值为 null
Base b = new Sub();
}
}
父类创建子类时,先会初始化基类的对象,然后才能创建派生类
创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null
四、构造方法
4.1 用户不能调用构造方法,只能通过 new 关键字自动调用
答案是错误的,这里说的是外部情况,但是我们没有考虑内部情况
- 在类内部,用户可以通过 this.构造方法名() 调用,参数决定调用的对应的构造方法
- 在子类中用户可以通过 super.父类构造方法() 调用 (参数决定调用的对应的父类的构造方法)
- 反射机制对于任意一个类,在运行期间都能知道这类的所有属性和方法,也包括构造方法
六、类与对象
6.1 Java 创建对象的说法正确的是 (5种方式)
- 使用 new 关键字(最常用) objectName obj = new ObjectName();
- 使用 对象 clone() 方法:ObjectName obj = obj.clone()
- 使用反射的Class类的 new Instance() 方法: ObjectName obj = ObjectName.class.newInstance();
- 使用反射的Constructor类的newInstance()方法: ObjectName obj = ObjectName.class.getConstructor.newInstance();
- 使用反序列化(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 之后,因为接口是是一种特殊的抽象类,由其他的类来实现的接口中所有的方法。而且接口可以去继承一个已有的接口
- default
- abstract
接口中修饰字段的修饰符
- public
- static
- final
接口中修饰方法的修饰符
八、序列化
一个 Java 实现序列化接口会发生什么?
- 序列化的是对象,不是类,类变量不会序列化
- Java 序列化时,不保存静态变量
- transient 和 static 修饰的变量不会被序列化
public class DataObject implements Serializable{
private static int i=0;
private String word=" ";
public void setWord(String word){
this.word=word;
}
public void setI(int i){
Data0bject. i=I;
}
}
DataObject object=new Data0bject ( );
object.setWord("123"); // word 123
object. setI(2); // 0
九、类加载的生命周期
- 静态变量
- 静态代码块
- 成员变量
- 实例代码块
- 构造方法