文章目录
- 1. 封装
- 2. 继承
- 3. 多态
- 3.1 理解什么是多态性
- 3.2 什么是多态
- 3.3 多态的使用
- 3.4 多态的使用前提
- 类的继承关系
- 调用的方法必须重写
- 3.5 多态性只适用于 方法,不适用于属性
- 多态性是运行时行为(动态绑定)
- 3.6 向下转型
- 向下转型 示意图
- 3.7 多态举例
- 3.8 instanceof 的使用
- 对象 instanceof 类 返回结果是boolean型
1. 封装
- 把一类事物抽出共有的属性和动作,封装到一个类中
2. 继承
- 抽出几个事物类ABCD共有的属性和方法封装到一个通用类中,然后让事物类ABCD继承通用类
3. 多态
3.1 理解什么是多态性
- 一个事物的多种形态
3.2 什么是多态
- 对象的多态
- 父类的引用指向子类的对象(或者 子类的对象赋值给父类的引用)
3.3 多态的使用
- 虚拟方法的调用
使用了多态之后
在编译期,只能调用父类中声明的方法
在运行期,实际执行的却是子类重写父类的方法
总结:
编译看左边,执行看右边
3.4 多态的使用前提
类的继承关系
调用的方法必须重写
- 父类 Person
package com.lchh.javase;
public class Person {
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, String speak) {
super();
this.name = name;
this.speak = speak;
}
private String name;
private String speak;
public void doing() {
System.out.println("person doing...");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSpeak() {
return speak;
}
public void setSpeak(String speak) {
this.speak = speak;
}
}
- 子类 Student
package com.lchh.javase;
public class Student extends Person{
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, String speak) {
super(name, speak);
// TODO Auto-generated constructor stub
}
private String score;
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
public void study() {
System.out.println("student study...");
}
public void doing() {
System.out.println("student doing...");
}
}
- 测试类 PersonTest
package com.lchh.javase;
public class PersonTest {
public static void main(String[] args) {
Person person = new Person();
person.doing();
Person p = new Student();
/**
* 编译器认为 Person p 声明的引用指向是 new Person()对象
* 但是在实际运行代码的时候, 指向的是 子类 new Student()
* 子类Student() 重写了父类的 doing() 方法
* 所以最终执行的是子类的 doing() 方法
*/
p.doing();
/**
* 编译期报错,因为编译器认为 Person p 指向的是 Person()对象,
* 所以无法执行 Person类的子类 Student类 的独有方法 study()
*/
//p.study();
}
}
- 执行结果:
3.5 多态性只适用于 方法,不适用于属性
多态性是运行时行为(动态绑定)
3.6 向下转型
向下转型 示意图
3.7 多态举例
package com.lchh.javase;
public class AnimalTest {
public static void main(String[] args) {
animalDo(new Dog());
System.out.println("*********");
Animal animal = new Cat();
animalDo(animal);
System.out.println("****进行向下转型****");
Cat cat = (Cat) animal;
cat.behavior();
System.out.println("****强转有风险*****");
Dog dog = (Dog) animal;
dog.behavior();
}
public static void animalDo(Animal animal) {
animal.eat();
animal.shout();
}
}
class Animal{
public void eat() {
System.out.println("动物 进食");
}
public void shout() {
System.out.println("动物 嚎叫");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗子 吃骨头");
}
@Override
public void shout() {
System.out.println("狗子 汪汪汪");
}
public void behavior() {
System.out.println("狗 我能看门护院");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("cat 吃鱼");
}
@Override
public void shout() {
System.out.println("猫咪 喵喵喵");
}
public void behavior() {
System.out.println("猫 我能捉老鼠");
}
}
- 打印结果
狗子 吃骨头
狗子 汪汪汪
*********
cat 吃鱼
猫咪 喵喵喵
****进行向下转型****
猫 我能捉老鼠
****强转有风险*****
Exception in thread "main" java.lang.ClassCastException: class com.lchh.javase.Cat cannot be cast to class com.lchh.javase.Dog (com.lchh.javase.Cat and com.lchh.javase.Dog are in unnamed module of loader 'app')
at com.lchh.javase.AnimalTest.main(AnimalTest.java:18)
3.8 instanceof 的使用
对象 instanceof 类 返回结果是boolean型
- 上面举例代码修改为
System.out.println("****强转有风险*****");
if(dog instanceof Dog){
Dog dog = (Dog) animal;
dog.behavior();
}
- 不会运行报错,但 instaceof的结果为false