目录
接口作为引用类型存在,当作 成员变量,可以用来扩展,毕竟还有方法未实现,充满着其他可能性
final
为了避免随意改写的情况,Java提供了 final 关键字,
用于修饰不可改变内容。
final: 不可改变
类:被修饰的类,不能被继承。
方法:被修饰的方法,不能被重写。
变量:被修饰的变量,不能被重新赋值。
修饰类
查询API发现像 public final class String 、 public final class Math 、 public final class Scanner
等,很多我们学习过的类,都是被final修饰的,目的就是供我们使用,而不让我们所以改变其内容。
修饰内部方法
修饰局部变量
此处对象的地址不再发生变化,但是地址指向的内容可以改变
public class FinalDemo2 {
public static void main(String[] args) {
// 创建 User 对象
final User u = new User();
// 创建 另一个 User对象
u = new User(); // 报错,指向了新的对象,地址值改变。
// 调用setName方法
u.setName("张三"); // 可以修改
}
}
final修饰成员变量
被final修饰的常量名称,一般都有书写规范,所有字母都大写。
权限修饰符
四种权限修饰符
编写代码时,如果没有特殊的考虑,建议这样使用权限:
成员变量使用 private ,隐藏细节。
构造方法使用 public ,方便创建对象。
成员方法使用 public ,方便调用方法。
内部类
一个类只有在另一个类内部才有作用。
什么是内部类
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。
人,心脏,动力
成员内部类 :定义在类中方法外的类。
class 外部类 {
class 内部类{
}
}
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
访问特点
内部类可以直接访问外部类的成员,包括私有成员。
外部类要访问内部类的成员,必须要建立内部类的对象。
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
变量定义位置不影响调用,他是先编译的,后运行
类对象内部使用
成员内部类
成员内部类 :定义在类中方法外的类。
外部调用内部类间接方法
直接调用
假如类成员变量,内部类成员变量,内部类局部变量重名
方法内部类
只有方法才能使用它,但是他可以使用自己,间接调用
权限修饰符的使用规范
匿名内部类必须继承一个父类或者实现一个父接口。
new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};
局部类的使用方法的局部变量要求
存在区域不同,final,局部对象比局部变量生命长,因此是把局部 变量内容复制过来,即使其消失,也能使用正确的不变的数据
匿名内部类
匿名内部类 :是内部类的简化写法。它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象。
成员内部类,局部内部类,局部内部类中的匿名内部类(常用)
匿名对象方法使用
很容易理解,匿名内部类是继承了接口,正常流程是继承接口创建子类,子类重写内部方法体,子类再创建对象,对象再调用方法,匿名内部类则是一步到位,直接根据接口重写了方法体并立即调用
匿名对象则是已经有了相关的类,隐藏的步骤比匿名内部类少,很合理吧
通常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递。代码如下:
也可以直接简化
第四章 引用类型用法总结
类作为数据类型存在
类作为成员变量时,对它进行赋值的操作,实际上,是赋给它该类的一个对象。
而一个对象具备的数据结构和方法是及其丰富的,这为复杂和简洁带来了可能
接口作为引用类型存在,当作 成员变量,可以用来扩展,毕竟还有方法未实现,充满着其他可能性
我们使用一个接口,作为成员变量,以便随时更换技能,这样的设计更为灵活,增强了程序的扩展性。
接口作为成员变量时,对它进行赋值的操作,实际上,是赋给它该接口的一个子类对象。
作为成员变量,依然具有函数性质,使用内部方法
上面是常规操作,先创建接口,然后创建类重写方法体,然后根据类创建对象,另外一个类再创建新的对象,然而这些步骤可以简化,可以使用匿名内部类简化对象创建操作,对接口实例化
进一步简化
我们使用一个接口,作为成员变量,以便随时更换技能,这样的设计更为灵活,增强了程序的扩展性。
接口作为成员变量时,对它进行赋值的操作,实际上,是赋给它该接口的一个子类对象。
接口作为返回值和参数类型:
这里以list举个例子,arraylist是对象,源代码里接口有list
当接口作为方法的参数时,需要传递什么呢?当接口作为方法的返回值类型时,需要返回什么呢?对,其实都是它的子类对象。
ArrayList 类我们并不陌生,查看API我们发现,实际上,它是 java.util.List 接口的实现类。所以,当我们看见 List 接口作为参数或者返回值类型时,当然可以将 ArrayList 的对象进行传递或返回。
也就是说当接口作为方法参数时刻,接收的参数和返回的参数就是他的子类对象,这个其实就是向下转型,很合理吧