一、static关键字
1、static是什么
静态的意思,可以修饰成员变量,也可以修饰成员方法
2、成员变量的分类
1)静态成员变量
①有static修饰,属于类,与类一起加载,内存中只有一份,可以被共享访问
②什么时候使用?如果信息要被共享,只需要一份就用静态成员变量,比如:系统在线人数
③访问规则
建议用类名访问:类名.静态成员变量
注意:同一个类中,访问静态变量成员可以省略类名不写
理论上也可以这样访问:对象名.静态成员变量(不推荐)
2)实例成员变量
①无static修饰,属于对象,每个对象中都存在一份实例成员变量。比如:name, age
②什么时候使用?比如:name, age每个对象中都有这些信息,而且信息还不同时,定义成实例成员变量
③访问规则:只能用---对象名.实例成员变量
3、成员方法的分类
1)静态成员方法
①有static修饰,属于类,与类一起加载,可以被共享访问
②什么时候使用?如果是做一个通用功能,可以用静态成员方法
③访问规则
建议使用类名访问:类名.静态方法
注意:同一个类中,访问静态成员可以省略类名不写
理论上也可以这么访问:对象名.静态成员方法(不推荐)
④静态成员方法的应用:工具类
是什么?工具类中都是静态方法,为了完成一个公用功能
好处:一次编写,处处可调,提高代码的复用性,提高开发效率
注意:建议把工具类的构造器私有化,因为工具类无需对外创建对象,它的方法都是静态方法,直接用类名访问即可
2)实例成员方法
①无static修饰,属于对象,必修用对象触发访问
②什么时候使用?如果这个方法属于对象,而且要直接访问对象的实例成员,则声明成示例方法
③访问规则:只能用---对象名.实例成员方法
二、static的应用知识
1、代码块
1)类的5大成分之一(成员变量、成员方法、构造器、代码块、内部类)
2)分类
①静态代码块(重点)
格式:static{}
特点:属于类,与类一起优先加载,自动触发执行一次
作用:可以用于在程序启动时,进行静态资源的初始化操作
②实例代码块(几乎不用)
格式:{}
特点:属于对象的,每次调用构造器构建对象前都会执行一次,再执行构造器
作用:可以用于初始化实例资源
2、单例设计模式
1)单例
是一种设计模式,是为了解决某个问题
2)单例能解决的问题
保证一个类对外只能产生一个对象
3)如何实现单例
①饿汉式单例
特点:拿对象时,对象已经存在了
实现步骤:
A:私有构造器
B:定义静态成员变量存储一个对象
C:代码
public class SingleInstance(){
//1、定义一个类,将构造器私有化
private SingleInstance(){}
//2、对外提供一个静态对象
//饿汉单例是在获取对象前,就已经准备好了一个对象
//这个对象只能通过类名访问,所以定义成static的
public static SingleInstance instance = new SingleInstance();
}
②懒汉式单例
特点:要拿对象的时候,才开始创建对象
实现步骤:
A:构造器私有
B:定义静态成员变量,暂时不存对象
C:代码
public class SingleInstance2(){
//定义要给静态成员变量负责存储一个对象,只加载一次,只有一份
//专业的做法是:这里可以私有化,避免给别人挖坑
private static SingleInstance2 instance2;
//将构造器私有化
private SingleInstance2(){}
//对外提供一个静态的获取对象的方法
public static SingleInstance2 getInstance2(){
if(instance2 == null){
//第一次来拿对象:此时需要创建对象
instance2 = new SingleInstance2();
}
return instance2;
}
}
三、面向对象的三大特征之继承
1、继承概述以及使用继承的好处
1)什么是继承
Java允许一个类通过extends与另一个类建立父子关系,这就是继承
2)格式
子类 extends 父类
3)特点
子类继承父类后,就可以直接使用父类中public修饰的属性和行为
4)核心优点
提高代码的复用性,多个子类的相同代码可以放在父类中,增强了类的扩展性
2、继承的设计规范、内存运行原理
1)设计规范
子类共用属性和行为放在父类,子类独有属性和行为放在子类那里
2)内存原理
子类对象实际上是由子父类这两张设计图共同创建出来的
3、继承的特点
1)Java是单继承模式,一个类只能继承一个直接父类
2)Java不支持多继承,但是支持多层继承
3)Java中所有的类都是Object类的子类
4、继承后:方法重写
1)概念
子类重写了一个声明与父类一样的方法,覆盖父类的方法,子类认为父类的该方法不好用,以后用自己重写的方法
2)在重写的方法中需要保留父类方法的内容该怎么办
①使用super关键字
②先使用super关键字调用父类同名方法,再继续编写子类独有的方法
3)重写方法建议加上一个重写校验注解:@Override
①作用1:要求必须是正确重写的才不报错
②作用2:可读性好
4)重写的要求
①重写方法的名称和形参列表必须与父类被重写方法的名称和形参列表一致(重点)
②私有方法不能重写
③静态方法不能重写
④重写方法的访问权限要 >= 被重写方法的访问权限
5、继承后:成员变量和成员方法的访问特点
1)就近原则
①先去子类局部范围找
②然后子类成员范围找
③最后父类成员范围找,如果父类范围还没有找到,则报错
2)this.子类自己的成员变量
3)在子类方法中访问父类成员怎么办?super.父类成员变量/父类成员方法
6、继承后:子类构造器的特点
1)特点:子类的全部构造器默认都会先访问父类的无参构造器
2)why?先有爸爸才有儿子。先调用它爸爸的构造器初始化父类的数据,再调用自己的构造器初始化自己的数据
3)代码层面:默认子类构造器的第一行都有一个super(),访问父类的无参构造,写不写都有
7、继承后:子类构造器访问父类有参构造器
1)调用父类有参数构造器,初始化继承自父类的数据
2)super(...)根据参数调用父类构造器