文章目录

  • 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 向下转型

向下转型 示意图

java三大特性封装继承多态 java封装继承多态的例子_java三大特性封装继承多态

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