面向对象进阶二
- 一、包、final、权限修饰符、代码块
- 1.1 包
- 1.2 final关键字
- 1.3 权限修饰符
- 1.4 代码块
- 1.4.1 局部代码块(已淘汰,了解)
- 1.4.2 构造代码块(了解内容)
- 1.4.3 静态代码块
- 二、抽象方法和抽象类
- 三、接口
- 3.1 接口中的成员特点
- 3.2 类和接口的关系
- 3.3 接口的升级规则
- 3.3.1 JDK8以后接口中新增的方法:
- 3.3.2JDK9以后接口中新增的方法:
- 3.3.3总结
- 3.4 接口的应用
- 3.5 适配器设计
- 四、内部类
- 4.1 成员内部类
- 4.2 静态内部类
- 4.3 局部内部类
- 4.4 匿名内部类
一、包、final、权限修饰符、代码块
1.1 包
包就是文件夹,管理各种不同的Java类。
● 使用同一个包中的类时,不需要导包。
● 使用java.lang包中的类时,不需要导包。
● 其他情况都需要导包
● 如果同时使用两个包中的同名类,需要用全类名。
1.2 final关键字
final关键字可修饰方法、类、变量。
● 修饰方法:该方法为最终方法,不能被重写;
● 修饰类:该方法为最终类,不能被继承;
● 修饰变量:只能赋值一次,不能更改,其实也就是常量。
常量:
实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性。
命名规范:
- 单个单词:全部大写
- 多个单词:全部大写,单词之间用下划线隔开
final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。
final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,对象内部的可以改变。
1.3 权限修饰符
权限修饰符:是用来控制一个成员能够被访问的范围的。
可以修饰成员变量,方法,构造方法,内部类。
1.4 代码块
1.4.1 局部代码块(已淘汰,了解)
用大括号括起来的范围。
作用:提前结束变量的生命周期
1.4.2 构造代码块(了解内容)
定义:写在成员位置的代码块。
作用:可以将多个构造方法中重复的语句抽取出来。
执行时机:在创建本类对象时会先执行构造代码块的内容,再执行构造方法。
1.4.3 静态代码块
格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次。
使用场景:在类加载的时候,做一些数据初始化的时候使用。
二、抽象方法和抽象类
修饰词:abstract。
作用:
抽取共性时无法确定方法体,就把该方法写成抽象的,强制让子类进行重写。
● 抽象方法:将共性的行为(方法)抽取到父类之后。
由于每一个子类执行的内容是不一样,所以,在父类中不能确定具体的方法体。
该方法就可以定义为抽象方法。
● 抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类。
定义格式:
抽象方法:public abstract 返回值类型 方法名(参数列表)
抽象类: public abstract class 类名{}
抽象类和抽象方法的注意事项:
● 抽象类不能实例化(创建对象);
● 抽象类中不一定有抽象方法,有抽象方法的类-定是抽象类;
● 可以有构造方法;
● 抽象类的子类:
- 要么重写抽象类中的所有抽象方法
- 要么是抽象类
三、接口
abstract在对方法体不确定时进行修饰,侧重于该类事物的性质。而接口更偏向于是对行为的“抽象”。
3.1 接口中的成员特点
- 成员变量:只能是常量;默认修饰符:public static final
- 构造方法:没有
- 成员方法:只能是抽象方法;默认修饰符:public abstract
3.2 类和接口的关系
- 类和类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承。
- 类和接口的关系:实现关系,可以单实现, 也可以多实现,还可以在继承一个类的同时实现多个接口。
- 接口和接口的关系:继承关系,可以单继承,也可以多继承。(如果实现类实现了最下面的子接口,那么就需要重写所有的抽象方法)
3.3 接口的升级规则
3.3.1 JDK8以后接口中新增的方法:
允许在接口中定义默认方法,需要使用关键字default修饰
作用:解决接口升级的问题
接口中默认方法的定义格式:
- 格式: public default返回值类型方法名(参数列表) { }
范例: public default void show() { } - 接口中默认方法的注意事项:
① 默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字。
② public可以省略, default不能省略。
③ 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写。
允许在接口中定义定义静态方法,需要用static修饰
-
接口中静态方法的定义格式: public static返回值类型方法名(参数列表){ }
范例: public static void show(){ } -
接口中静态方法的注意事项:
① 静态方 法只能通过接口名调用,不能通过实现类名或者对象名调用
② public可以省略, static不 能省略
3.3.2JDK9以后接口中新增的方法:
允许在接口中定义私有方法:
格式1: private 返回值类型方法名(参数列表){ }
范例1: private void show(){ }
格式2: private static返回值类型方法名(参数列表){ }
范例2: private static void method() { }
3.3.3总结
- JDK7以前:接口中只能定义抽象方法。
- JDK8: 接口中可以定义有方法体的方法。(默认、 静态)
- JDK9: 接口中可以定义私有方法。
- 私有方法分为两种: 普通的私有方法,静态的私有方法
3.4 接口的应用
- 接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了。
- 当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。
3.5 适配器设计
1.当一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以适配器设计模式
2.书写步骤:
编写中间类XXXAdapter,实现对应的接口;
对接口中的抽象方法进行空实现,让真正的实现类继承中间类,并重写需要用的方法;
为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰。
四、内部类
类的五个成员:属性、方法、构造方法、代码块、内部类。
内部类就是在一个类内,再创建的一个类。将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。
内部类是外部类的一部分,且单独出现时没有意义。
① 内部类可以直接访问外部类的成员(包括私有的);
② 外部类不能直接访问内部类的成员,必须创建对象。
内部类分为:成员内部类、静态内部类、局部内部类、匿名内部类四种。前三种均属于了解内容,可能在源码中才会看。
- 成员内部内,类定义在了成员位置 (类中方法外称为成员位置,无static修饰的内部类)
- 静态内部类,类定义在了成员位置 (类中方法外称为成员位置,有static修饰的内部类)
- 局部内部类,类定义在方法内
- 匿名内部类,没有名字的内部类,可以在方法中,也可以在类中方法外。
4.1 成员内部类
使用格式:外部类.内部类
获取成员内部类对象:
① 外部类.内部类 变量 = new 外部类().new 内部类();
② 在外部类中定义一个方法提供内部类的对象。
编写成员内部类的注意点:
- 成员内部类可以被一些修饰符所修饰,比如: private,默认,protected,public,static等
- 在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量。
- 创建内部类对象时,对象中有一个隐含的Outer.this记录外部类对象的地址值。
4.2 静态内部类
属于成员内部类的特殊情况。有static修饰,属于外部类本身的。
- 拓展1:静态内部类可以直接访问外部类的静态成员。
- 拓展2:静态内部类不可以直接访问外部类的非静态成员,如果要访问需要创建外部类的对象。
- 拓展3:静态内部类中没有银行的Outer.this。
使用格式:外部类.内部类
创建静态内部类的对象:部类.内部类 变量 = new 外部类.内部类构造器;
调用非静态方法的格式:先创建对象,用对象调用
调用静态方法的格式:外部类名.内部类名.方法名();
4.3 局部内部类
局部内部类:定义在方法中的类。
4.4 匿名内部类
匿名内部类 :是内部类的简化写法。他是一个隐含了名字的内部类。
格式:
new 类名或者接口名() {
重写方法;
};
包含了:
- 继承或者实现关系
- 方法重写
- 创建对象
整体就是一个类的子类对象或者一个接口的实现类对象。