对于 Java初级选手的学习 接口和继承这一基础部分学完了 但是还有相应练习 及拓展——uml图
重大部分(之前的对象转型也是)
final
抽象类 内部类
默认方法
final 修饰符:
final修饰类,方法,基本类型变量,引用的时候分别有不同的意思。
1、当类被修饰成final的时候,表示该类不能够被继承
其子类会出现编译错误
2、当类的方法被修饰成final,那么该方法在子类中,不能够被重写
3、final修饰基本类型变量,表示该变量只有一次赋值机会
这在之前是学习过的。 作用类似于限定符
4、final修饰引用
引用被修饰成final,表示该引用只有1次指向对象的机会
5、常量指的是可以公开,直接访问,不会变化的值
也就是这里的itemTotalNumber 是一个常量。
值得注意的是:
string 本就是个类 在其他对其进行继承的时候 是不能被继承的
抽象类 内部类:
抽象类:
在类中声明一个方法,这个方法没有实现体,是一个“空”方法
这样的方法就叫抽象方法,使用修饰符“abstract"
当一个类有抽象方法的时候,该类必须被声明为抽象类
1、抽象类的抽象方法 子类继承了抽象类的属性和方法
这些子类就必须提供不一样的方法实现。也就是要对其进行写入代码 实现其功能
2、抽象类可以没有抽象方法 但是一旦一个类被声明为抽象类,就不能够被直接实例化,也就是无法实例化对象
抽象类和接口的区别:
区别1:
子类只能继承一个抽象类,不能继承多个
子类可以实现多个接口
区别2:
抽象类可以定义
public,protected,package,private
静态和非静态属性
final和非final属性
但是接口中声明的属性,只能是
public
静态
final的
即便没有显式的声明
也只能赋值一次。
注: 抽象类和接口都可以有实体方法。 接口中的实体方法,叫做默认方法
内部类分为四种:
非静态内部类
静态内部类
匿名类
本地类
1、非静态内部类可以直接在一个类里面定义
语法: new 外部类().new 内部类()
作为该类(外部类)下的的非静态内部类,是可以直接访问外部类的private实例属性的
2、在一个类里面声明一个静态内部类。
语法:new 外部类.静态内部类();
因为没有一个外部类的实例,所以在静态内部类里面不可以访问外部类的实例属性和方法
除了可以访问外部类的私有静态成员外,静态内部类和普通类没什么大的区别
name 这个属性在外部类 所以编译器会显示错误
3、匿名类指的是在声明一个类的同时实例化它,使代码更加简洁精练
通常情况下,要使用一个接口或者抽象类,都必须创建一个子类
有的时候,为了快速使用,直接实例化一个抽象类,并“当场”实现其抽象方法。
既然实现了抽象方法,那么就是一个新的类,只是这个类,没有命名。
这样的类,叫做匿名类
4、本地类可以理解为有名字的匿名类
内部类与匿名类不一样的是,内部类必须声明在成员的位置,即与属性和方法平等的位置。
本地类和匿名类一样,直接声明在代码块里面,可以是主方法,for循环里等等地方
注意:
在匿名类中使用外部的局部变量,外部的局部变量必须修饰为final
默认方法:
默认方法是JDK8新特性,指的是接口也可以提供具体方法了,而不像以前,只能提供抽象方法
给接口,增加了一个默认方法 ,这个方法有实现体,并且被声明为了default
也就是 default public void…
为什么会有默认方法:
也是为了高效
假设没有默认方法这种机制,那么如果要为接口增加一个新的方法,那么所有实现了该接口的类,都需要做改动——也就是其要每一个拿出来 增添方法。很麻烦
但是引入了默认方法后,原来的类,不需要做任何改动,并且还能得到这个默认方法
通过这种手段,就能够很好的扩展新的类,并且做到不影响原来的类
当一个子类同时继承两个接口 且两个接口有相同的方法 引用该方法是调用哪个接口的呢 答案是 编译出错 必须对其进行重写 所以这种模棱两可的问题是不存在的。