本系列博客是韩顺平老师java基础课的课程笔记,吐血推荐的一套全网最细java教程,获益匪浅 韩顺平java课程
目录(P394-P423)
1 final
2 抽象类
3 接口
4 内部类
1️⃣ 局部内部类
2️⃣🍓匿名内部类
3️⃣成员内部类
4️⃣静态内部类
1 final
- 基本介绍
- final可以修饰类 属性 方法 和局部变量
- 当不希望类被继承时,可以用final修饰
- 当不希望父类的某个方法被覆盖/重写时,可以使用final修饰方法
- 当不希望父类的某个属性值被修改时,可以使用final修饰该属性
public final double fax=0.08
- 当不希望某个局部变量(方法中的变量)被修改时,可以使用final修饰该局部变量
- 使用细节
- final修饰的属性又叫做常量,一般用XX_XX_XX来命名
- final修饰的属性在定义时,必须赋值,并且以后不能修改,赋值可以在如下位置之一:1. 定义时,2. 构造器中 3. 代码块中
- 如果final修饰的属性是静态的,则初始化的位置执行是在1.定义时 2. 静态代码块中,不能在构造器中赋值
因为final修饰的静态变量在类加载的时候就需要初始化,而构造器是在类加载时下运行的 - final类不可以继承,但是可以实例化对象
- 一般来说,如果一个类已经是final类了,就没有必要将该方法修饰成final方法
- final方法不能修饰构造器
- final和static一般搭配使用,效率更高,不会导致类的加载,底层编译器做了优化处理
- 包装类(interger double float boolean)等都是final ,string也是final
2 抽象类
- 问题引入
- 父类方法不确定性:当父类的某些方法需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,这个类对应的就是抽象类
- 抽象方法是没有实现的方法(方法中没有方法体)
- 介绍
- 当一个类中存在抽象方法时,必须将这个方法声明为抽象类
- 抽象方法没有方法体
- abstract class animal{abstract public void eat();}
- 一般来说,抽象类会被继承,由子类来实现
- 抽象类的价值更多的在于设计,设计者设计好之后,子类继承并实现抽象类(是考官比较爱问的知识点,在框架和设计模式中使用较多)
- 细节
- 抽象类不能实例化
- 抽象类不一定包含抽象方法
- 一旦类包含了抽象方法,就必须将这个类声明为abstract
- abstract 只能修饰类和方法,不能修饰属性和其他
- 抽象类可以有任意成员(抽象类的本质还是类)
- 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非他自己也声明为abstract类
- 抽象方法不能使用private final static 来修饰,因为这些关键字都是和重写相违背的
- 抽象类的应用:模板设计模式
3 接口
- 基本介绍
- 定义
- 接口就是给出一些没有实现的方法,等到某个类使用的时候,再根据具体情况吧这些方法写出来
- 语法
- interface 接口名{属性,方法}
- class 类名 implements 接口{自己的属性,自己的方法,必须实现的接口的所有抽象方法}
- 小结
- 在jdk7.0以前,接口中的所有方法都没有方法体,即全部都是抽象方法
- jdk8.0以后,接口中可以有静态方法,默认方法(用default关键字修饰),也就是说接口中可以有方法的具体实现
- 定义
- 细节
- 接口不能被实例化
- 接口中所有方法都是public方法,在接口中,抽象方法可以省略abstract关键字
- 一个普通类实现接口,就必须将接口中的所有方法都实现,可以使用alt+enter快捷键来批处理
- 抽象类实现接口,可以不用实现接口的方法(因为抽象类中允许抽象方法存在)
- 一个类可以同时实现多个接口
- 接口的修饰符只能是public和默认,这一点和类的修饰符是一样的
- 接口中的属性,只能是final的,并且是public static final 修饰的。比如受int a=1 实际上是public static final int a=1
- 接口中属性的访问形式是 接口名.属性名
- 接口不能继承别的类,但是可以继承多个别的接口
- 接口实现 VS 继承
- 理解
- 可以将接口理解为对继承机制的一种补充
- 小猴子和老猴子之间是继承关系,但是如果小猴子想拥有小鸟的飞翔能力,就应该向小鸟学习,实现它的飞翔功能。(先天拥有和后天学习的区别)
- 当子类继承了父类就自动拥有了父类的功能,如果子类需要扩展功能,可以通过实现接口的方式进行扩展
- 小结
- 接口和继承解决的问题不同
- 继承的价值在于:解决代码的复用性和可维护性
- 接口的价值在于:设计好各种规范,让其他类去实现这些方法
- 接口比继承更加灵活
- 继承必须满足is-a的关系,但是接口只需要满足like-a的关系即可
- 接口在一定程度上实现了代码的解耦 (即 接口的规范性+动态绑定)
- 接口和继承解决的问题不同
- 理解
- 接口多态特性
- 多态参数
- 在老师给的案例中,接口类型的形参,既可以接受手机对象,也可以接收相继对象(只要是实现了接口的类都可以接受)
- 接口类型的变量,可以指向实现了该接口的对象实例(类似于继承关系中的向上转型)
- 多态数组
- 一个USB(接口)数组中,既可以接收手机对象,也可以接收相机对象(接口数组中能存放实现了该接口的类的对象实例)
- 多态的传递性
- (可以将接口实现类比与继承关系)
- 小结
- 多态参数
4 内部类
- 基本介绍
- 一个类的内部又完整地嵌套了另一个类结构,被嵌套的类称为内部类,嵌套其他类的类称为外部类。是类的五大成员之一。内部类最大的特点是可以直接访问私有属性,并且可以体现类与类之间的包含关系。
- 类的五大成员:属性 方法 构造器 代码块 内部类
- 使用场景:当只想用一次某一个类,下一次不想再用时
- 基本语法
- 内部类分类
- 定义在外部类局部位置上(比如方法内)
- 1️⃣ 局部内部类(有类名)
- 2️⃣ 匿名内部类(没有类名,重点🍓💥💥)
- 定义在外部类的成员位置上(属性或者方法位置)
- 3️⃣ 成员内部类(没有static修饰)
- 4️⃣ 静态内部类(有static修饰)
- 定义在外部类局部位置上(比如方法内)
-
1️⃣ 局部内部类
-
🍓定义在外部类的局部位置上(通常是在方法中或者代码块中),并且有类名
- 局部内部类可以访问外部类的所有成员,包括私有的
- 不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的,但是可以使用final修饰,因为局部变量也可以使用final。加上final之后,说明这个内部类是不能被其他类继承的。
- 🍓作用域:仅仅在定义它的方法或者代码块中
- 局部内部类访问外部类的成员:直接访问
- 外部类访问局部类的成员:在方法中创建内部类对象,再访问
- 外部其他类不能访问局部内部类(因为局部内部类的低位是一个局部变量)
- 如果外部类和局部内部类的成员重名时,内部类访问成员默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问
-
-
2️⃣🍓匿名内部类
- 基本介绍
- 匿名内部类是定义在外部类的局部位置,比如说方法中,并且没有类名的一种类
- 基本语法
- 基于接口
- tiger的编译类型是接口,运行类型就是匿名内部类。jdk在底层创建了匿名内部类之后,立即创建了匿名实例,并且把地址返回给tiger
- 匿名内部类使用一次就不能再继续使用了(但是创建过的对象引用是可以继续再使用的)
- 基于类
- 细节
- 匿名内部类既是一个类的定义,同时本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特征。
- 不能直接访问外部类的所有成员,包括私有的
- 不能添加类的访问修饰符,因为它的地位就是一个局部变量
- 作用域:仅仅在定义它的方法或代码块中
- 匿名内部类访问外部成员:直接访问
- 外部其他类不可以访问匿名内部类
- 如果外部类和匿名内部类的成员重名时,匿名内部类的访问遵循就近原则,如果想访问外部类的成员,使用 外部类名.this.成员 去访问
- 最佳实践
- 把匿名内部类当做实参直接传递,简洁高效
- 基本介绍
-
3️⃣成员内部类
- 说明:定义在外部类的成员位置,并且没有static修饰
- 可以访问外部类的所有成员,包括私有的
- 可以添加任意访问修饰符,因为它本质就是一个成员
- 语法
- 作用域和外部类的其他成员一样,为整个类体
- 成员内部类访问外部类:直接访问
- 外部类访问成员内部类:创建对象再访问
- 外部其他类访问成员内部类有两种方式:
- 把内部类当做外部类的一个成员
- 在外部内在写一个方法,返回内部类的对象
- 外部类和成员内部类的成员重名时,内部类的访问,遵循就近原则,如果想访问外部类的成员,则可以使用 外部类名.this.成员 去访问
-
4️⃣静态内部类
- 说明:定义在外部类的成员位置,并且有static修饰
- 可以直接访问外部类的所有静态成员,包括私有的,但是不能直接访问非静态成员
- 可以添加任意的访问修饰符,因为它的地位就是一个成员
- 作用域和其他成员一样,为整个类体
- 静态内部类访问外部类:直接访问
- 外部类访问静态内部类:创建对象,再访问
- 外部其它类访问静态内部类的两种方式
- 通过类名直接访问
- 在外部类中创建一个方法,返回类的实例
- 如果外部类和静态内部类的成员重名时,静态内部类访问时,遵循就近原则,如果想访问外部类的成员,则可以使用 外部类名.成员名 去访问