抽象类
抽象类和抽象方法必须用abstract关键字修饰
格式
抽象方法只需要声明不需实现,需要子类实现
格式:abstract class 类名 {}
public abstract void eat();(抽象方法可以没有返回值和有返回值)
抽象内中可以定义属性和方法(构造方法也可以);
有抽象方法的类是抽象类,抽象类必须被继承,(所有的)抽象方法必须被重写
抽象类不能实例化 具体由子类去实例化
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
抽象类的子类
要么是抽象类
多态
多态
:一个对象的多种状态的行为
多态的三个条件:.要有继承 ,有方法重写,有父类引用指向子类对象
多态的好处 :提高了程序的维护性(由继承保证)
提高了程序的扩展性(由多态保证)
多态的弊端
不能访问子类特有功能
多态中的转型
向上转型
从子到父
父类引用指向子类对象
向下转型
从父到子
父类引用转为子类对象
public static void main(String[] args) {
Person[] p = new Person[2];
p[0] = new Teacher();
p[1] = new Student();//向上转型 只能调用父类提供的方法和属性
for(Person per:p){
per.test();
//判断一个对象是否属于当前这个类
if(per instanceof Teacher){
Teacher t = (Teacher)per;//向下转型,才能调用子类的方法(还能调用父类的方法)
t.teach();
}
if(per instanceof Student){
Student stu = (Student)per;
stu.study();
}
}
}
}
对象转型
一个基类的引用类型变量可以指向其子类的对象,向上转型
Animal
a
=
new
Dog(
"金毛"
,
"黄色"
); //Animal是基类,Dog是子类
一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)
Dog
d
=
new
Dog(
"萨摩耶"
,
"白色"
);
System.
out
.println(
"我的毛色是:"
+
d
.
furColor
);
//furColor属性是Dog类的成员变量量
Animal
a
=
new
Dog(
"金毛"
,
"黄色"
);
//Animal是基类,Dog是子类
System.
out
.println(
"我的⽑毛⾊色是:"
+
a.furColor
);
//异常,Animal基类无法访问,Dog类的furColor属性
可以使用引用变量instance类名 来判断该引⽤变量所指向的对象是否属于该类
Dog
d
=
new
Dog(
"萨摩耶"
,
"白色"
);
if
(
d
instanceof
Animal){
System.
out
.println(
"引⽤用对象d是Animal类型"
);
}
子类的对象可以当做基类的对象来使⽤,称作向上转型,反之成为向下转型
Dog
d
=
new
Dog(
"萨摩耶"
,
"白色"
);
Animal
animal
=
d
;
//向上转型
使用子类的特有功能
A:创建子类对象调用方法即可。
B:把父类的引用强制转换为子类的引用。(向下转型)
对象间的转型问题:
向上转型
: Fu f = new Zi();
向下转型
: Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。
向上转型
* 虽然实例化创建的为子类对象,但是申明的为父类,
* 向上转型只能调用父类提供的方法和属性,不能调用子类提供的属性和方法
Person p = new Teacher();
p.setName("张三");
向下转型可以调用父类以及子类提供的所有公有化的属性或方法
Teacher t = (Teacher)p;//向下转型,基于向上转型
t.setName("张六");
t.setAge(20);
Person stu = new Student();
/向上转型 子类对象调用父类对象 提供的方法和属性
Person p = new Student();
p.setName("张三");
p.setAge(22);
//向下转型 调用父类以及子类提供的所有公有化的属性或方法
Student s = (Student) p;
s.setSchool("八维");
s.setGrade("高中");
s.show();
Person pe = new Teacher("一中", "java讲师", "java");
pe.setName("李老师");
pe.setAge(40);
pe.show();
}
}