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