面向对象进阶
static
static 成员变量和实例成员变量的内存原理
当类被加载到方法区时,static成员变量被初始化,保存在堆内存的静态变量区。但这时还没有值。
在对象创建之后,实例成员变量初始化,并且保存在堆内存的对象中。
static 方法和实例方法的内存保存原理
static 方法在类加载到方法区时,就一起加载进来了。并且保存在方法区。
创建实例后,才加载,保存在方法区。
最佳实践:什么时候使用静态成员方法,什么时候使用实例方法
- 表示对象自己的行为的,且方法中需要访问实例成员的,则该方法必须申明成实例方法
- 如果该方法是以执行一个共用功能为目的,则可以申明成静态方法
最佳实践:工具类实现时需要注意什么
- 类中都是一些静态方法,每个方法都是以完成一个共用的功能为目的,直接用类名即可访问
- 工具类无需创建对象,建议将工具类的构造器进行私有
最佳实践:什么时候使用 static 代码块
在启动系统时对静态资源进行初始化,则建议使用静态代码块完成数据的初始化操作。
比如斗地主游戏,在启动游戏房间的时候,应该提前准备好54张牌,后续才可以直接使用这些牌数据。当系统启动的同时需要准备好54张牌数据,此时可以用静态代码块完成。
单例模式中,饿汉单例模式如何实现
- 定义一个类,把构造器私有
- 定义一个静态变量存储一个对象
单例模式中,懒汉单例设计模式如何实现
- 在真正需要该对象的时候,才去创建一个对象
- 定义一个类,把构造器私有
- 定义一个静态变量存储一个对象
- 提供一个返回单例对象的方法
饿汉单例模式和懒汉单例设计模式,实现上有什么不同
饿汉单例模式,初始化类时就给单例赋值,调用时直接返回。
懒汉单例模式,初始化类时不给单例赋值,调用时再赋值、返回。
子类可以继承父类的什么,而不能继承什么
基本上都可以继承,注意
- 不能继承父类的构造器,只会在自身构造器的第一行隐式地调用父类构造器,父类构造器用于初始化父类对象
- 子类可以继承父类的私有成员,但是无法访问
- 子类是否继承父类的静态成员有争议,但可以直接使用父类的静态成员
最佳实践:重写
- 方法前加@Override注解,可以校验重写是否正确,同时可读性好
- 重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致
- 私有方法和静态方法不能被重写
- 重写时,子类的访问权限必须大于等于父类
常见错误:父类中没有无参数构造器,只有有参构造器,实例化子类对象时会出现什么现象
会报错。因为子类构造器第一行会默认调用父类无参构造器。
子类构造器中可以通过书写 super(…),手动调用父类的有参数构造器