抽象类:
因为继承的关系,子类的功能可以越来越具体,相对来说,父类
更加一般化,通用化。因为父类封装了子类的共同行为,所以,
在定义时,我们可以定义方法的逻辑。有的时候,在父类中无法完成
子类的功能需求,此时,不如不写,即不写方法体,代码简单化。
但是此方法必须使用abstract修饰,那么此类型也必须使用abstract
修饰,即抽象类
1、抽象方法与抽象类
1)用abstract修饰的方法,不需要写方法体,但是得用分号来结尾
2)有抽象方法的类,必须使用abstract声明(修饰)
2、抽象类不能实例化
1) 抽象类不能创建对象,没有意义
2) 抽象类可以提供构造器
3) 抽象类中可以没有抽象方法
4) abstract和final不能同时修饰一个类型
3、继承抽象类
1)若一个类继承了抽象类,那么这个类必须重写(实现)抽象类的所有抽象方法
2)若一个类没有实现抽象类的所有抽象方法, 那么这个类必须使用abstract修饰
4、抽象类的意义:
1)给不同的子类定义一个父类
2)抽象类可以封装子类的共同特征与共同行为
3)虽然子类方法可能有不能的实现逻辑,但是
方法的定义一致。
接口:
有时我们需要从多个不相关的类中设计出一个子类型,而java继承
是单继承的特点,无法满足我们的需求,所以,我们可以使用接口来达到
多继承的目的。
接口实际上就是一种规范制度。 (规范与规则的理解)
接口的特点:
(1)接口使用interface关键字,而不是class,
但是我们可以理解成接口是特殊的抽象类
(2)接口里只能有抽象方法和常量
(3)接口不能实例化,没有任何意义
(4)接口不能提供构造方法
接口中的常量:
默认使用修饰词为public static final
接口中的方法
默认使用public abstract
接口的实现
(1)子类需要实现接口中的所有抽象方法,
(2)使用implements关键字进行实现
(3)如果子类没有实现所有抽象方法,那么子类需要使用abstract修饰
(4)子类可以实现多个接口,接口间使用逗号分开
接口间的继承
(1)接口与接口之间可以使用继承。
子接口继承了父接口的抽象方法
(2)支持多继承
======================================
多态:面向对象的特征之一 (重写属于多态)
向上造型:
父类型的变量引用子类型的对象
(1) 父类型的变量指向不同的子类型对象,
调用的功能有不同的实现
Animal a = new Dog();
a.noise();//叫
a = new Cat();
a.noise();//叫
(2)不同的父类型变量指向同一个对象有不同的功能
ZhengYangDoor a = new ZhengYangDoor();
a.theftproof();//防盗
a.openDoor();//开门
InterA ia = a;
ia.theftproof();
向下造型:
将父类型(接口)的变量赋值给子类型或者是其他父类型(接口)的变量
Animal a = new Dog();
Dog dog =(Dog)a;
dog.吃骨头();
Cat cat = (Cat)a;//编译通过,语法正确,运行期间,造型错误
cat.扑捉老鼠();
运行期间有可能会发生类造型异常:java.lang.ClassCastException
为了避免出现错误:我们需要使用关键字instanceof来判断
对象是不是要转换成的类型
if(a instanceOf Cat){
Cat cat = (Cat)a;
}
-------------------------------
(1) 员工都有完成工作的行为
当员工是老板时,完成...工作
是人事 完成...工作
是讲师
(2)张三这个人处在不同的环境下 有不同的功能
内部类:
是定义在一个类的内部的新类型。即内部类,另外一个类称之为
外部类。
根据位置不同:
可以有 成员内部类
方法内部类(局部内部类)
带static修饰词的类 静态内部类
没有名称的类: 匿名内部类
最不常用的:方法内部类,静态内部类
方法内部类:定义在方法中,相当于局部变量,仅限于在方法中使用
定义时不能使用修饰词,可以直接访问外部类的非静态成员变量
静态内部类:也是以类的成员来定义的,只不过多了一个修饰词static
可以直接访问外部类的静态成员
相对而言,成员内部类和匿名内部类比较常用。
成员内部类:以类的成员来定义,可以使用任何修饰词来修饰。
成员内部类访问外部类的成员
方法内隐藏一个指向外部类对象的引用。
外部类名.this.
成员内部类的使用:
创建对象:
要先创建一个外部类的对象outer
然后使用外部类对象去使用new调用内部类的构造器实例化
Inner inner = outer.new Inner(有参传参);
外部类访问成员内部类的成员
在外部类添加一个内部类的成员变量进行访问
匿名内部类:
没有名字的类型,写在外部类的方法中,只用一次,不需要定义类的结构,
通常都是为了实现接口,抽象类或某一现有的类的子类
子类没有名称,所以称之匿名
当我们想使用某个类,抽象类或接口的子类对象时,因为我们只想用一次,我们就可以不定义子类
的结构,因此可以使用匿名内部类的写法,没有子类名称,写法可以向上造型,=后面是new
我们想使用的类的名称(可以有参){};大括号里重写接口或抽象类里的所有抽象方法,或
重写某一个实现方法。