1.代码块
静态代码块:随着类的加载而执行,只会执行一次;一般用于初始化整个应用程序的资源
构造代码块:随着对象的创建而执行,优先于构造方法执行;一般用于所有对象都必须初始化的资源
普通代码块:放在方法的内部,放在普通代码块里面的变量会快速的释放
执行顺序:
静态代码块->构造代码块->构造方法
2.单例设计模式
需求:让一个类只产生一个对象
恶汉式:程序加载速度会慢一点,但是线程安全
1.私有化构造方法:让外部无法直接创建对象
2.创建一个私有的静态的本类对象的一个变量
3.提供一个公共的静态的返回值类型是本类对象的一个方法
懒汉式:程序加载速度会快一点,但是线程不安全
1.私有化构造方法:让外部无法直接创建对象
2.声明一个私有的静态的本类类型的一个变量
3.提供一个公共的静态的返回值类型是本类对象的一个方法
在方法体的内部,判断返回的变量是否是null,如果是就创建一个本类对象
3.继承
概述:把多个类中相同的属性和行为抽取到一个新的类中,然后其它的类继承这个新类,即可拥有父类中所有非私有的成员
被继承的类:父类,超类,基类
继承的类:子类,派生类
继承的格式:class 子类名 extends 父类名
子类不仅可以继承父类的成员,还可以定义自己特有的成员
继承的好处:
提高了代码的复用性,将一些重复的代码放在父类中
提高了代码的维护性,更改一下东西的时候,可以直接从父类下手
继承特点:
java中类和类之间只支持单继承,多层继承,不支持多继承
继承注意事项:
父类中的私有成员,子类无法继承
父类的构造方法,子类无法继承,但是可以通过super调用
不能为了部分的功能去继承一个父类
继承中成员变量的关系:
通过子类方法访问一个变量查找顺序:
首先在子类的方法局部范围找
再在子类的成员范围找
再在父类成员范围找
最后找不到就会报错
this:代表本类的引用 super:代表父类的引用
访问子父类的成员变量:
this.成员变量; super.成员变量;
访问子父类的成员方法:
this.成员方法名(参数); super.成员方法名(参数);
访问子父类的构造方法:
this(参数); super(参数);
继承中构造方法的关系:
子类创建对象成功之前,首先会先创建父类的对象,子类持有父类的引用
在每一个子类的构造方法的第一行可执行代码都会去访问父类的无参构造方法:super();
如果父类中没有空参构造方法怎么办?
手动去调用父类的有参构造方法
在父类创建一个无参构造方法
也可以使用this调用本类的构造方法
this和super调用构造方法的代码都必须放在可执行代码的第一行
继承中成员方法的关系:
通过子类对象访问方法的查找顺序:
首先在子类范围找
再在父类范围找
最后找不到就会报错
方法的重写:当子类不满意父类的方法实现时,可以在子类中定义一个一模一样的方法,但是方法体子类自己实现
装饰者设计模式:子类重写的方法可以保留父类的方法的功能,还可以额外添加一些功能
方法重写的注意事项:
父类的私有方法不能重写
子类重写的方法的权限不能比父类的更低
子类重写父类的静态方法,子类的方法也必须是静态的
方法重写特性:如果子类自己有方法,就调用子类自己的
4.final关键字
修饰类:保护类不被继承
修饰方法:保护方法不被重写
修饰变量:变成常量,只能被赋值一次
5.多态
概述:就是某一个事物在不同环境下表现的不同状态
水:
零度以下:固态
常温:液态
100度以上:气态
多态的前提:类和类以及接口之间有关系
多态的体现:父类引用指向子类对象
多态的效果:有方法的重写
多态的成员访问特点:
成员变量:编译看左边,运行看左边
成员方法:编译看左边,运行看右边
静态方法:编译看左边,运行看左边
多态的弊端:使用父类引用无法调用子类特有方法
怎么解决呢?
使用数据类型强制转换:目标数据类型 对象名 = (目标数据类型)(要转换的值);
转型:
向上转型:从子到父,父类引用指向子类对象
注意:子父类之间有继承或者实现关系
向下转型:从父到子,把父类引用强转成子类引用
注意:目标数据类型和父类实际指向的对象类型要保持一致
多态的好处:
提高代码的复用性,统一一个接口的参数,用父类类型类接收
6.抽象类
概述:有些功能父类无法给出具体的实现时,可以声明在父类中,但不给出具体的实现;
java中规定一个没有方法体的方法必须定义成抽象方法,一个包含抽象方法的类必须定义成抽象类
格式:
abstract class 类名{
abstract 修饰符 返回值类型 方法名(参数);
}
成员特点:
成员变量:变量,常量
成员方法:
具体方法:提高代码复用性
抽象方法:限定子类必须实现某个功能
构造方法:有的,因为抽象类里面有具体的成员,子类可能会使用
抽象类如何实例化?
抽象类是无法直接new的,可以根据多态的思想,创建一个子类继承抽象类,然后实现所有的抽象方法;然后创建子类对象调用抽象方法,这个叫做抽象类多态
抽象类子类要么实现所有的抽象方法,要么继续定义成抽象类
抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
7.接口
概述:有些额外的功能可以定义在接口中,体现事物的扩展性
格式:interface 接口名{}
成员特点:
成员变量:只能是常量,默认修饰符:public static final
成员方法:JDK1.8之前只能是抽象方法,默认修饰符:public abstract
JDK1.8之后可以用default修饰定义默认方法
构造方法:没有的
接口如何实例化?
接口是无法直接new对象的,可以根据多态的思想,创建一个子类实现接口里面的所有方法;然后创建子类对象调用抽象方法,这个叫做接口的多态
实现的格式:class 类名 implements 接口名
接口的子类要么实现所有的抽象方法,要么继续定义成抽象类
8.类和接口以及彼此之间的关系
类和类:继承关系
单继承,多层继承,不能多继承
类和接口:实现关系
单实现,多实现,多层实现还可以继承一个类的同时实现多个接口
接口和接口:继承关系
单继承,多继承,多层继承
9.权限修饰符
public:任何地方都可以访问
private:只能类的内部可以访问
protected:在同一个类或同一个包或者子类中都可以访问
默认修饰符:在同一个类或同一个包中都可以访问
10.内部类
概述:就是在类的内部定义一个类
分类:
成员内部类:就是在成员位置定义一个类
局部内部类:就是在方法内部定义一个类
访问特点:
内部类可以直接访问外部类的所有成员,包括私有成员
外部类需要创建对象才能访问内部类的成员
访问成员内部类的成员:
访问非静态的成员内部类的非静态成员:
外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
对象名.成员;
访问静态内部类的非静态成员:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
对象名.成员;
访问静态内部类的静态成员:
外部类名.内部类名.成员;
静态成员内部类中不一定有静态成员,但是有静态成员的内部类一定是一个静态内部类
怎么访问私有的成员内部类?
创建一个公共的方法提供给外部调用,公共方法内部创建私有内部类对象调用成员
访问局部内部类的成员:
在局部内部类所在的方法内部创建对象,调用局部内部类的成员
JDK1.8之前,局部内部类访问局部变量需要final
JDK1.8之后,局部内部类访问局部变量不需要final,其实就是省略了,但是本质上还是一个常量
11.匿名内部类
概述:就是一个没有名字的,在类的内部直接new类名或者接口名创建一个匿名对象
格式:
new 类名或接口名(){
要重写或者实现的方法;
}
本质:其实就是一个继承了类或者实现了接口的匿名子类对象
最常见的用法:使用匿名内部类创建对象当做实参传递给方法