Java基础--类的 封装 继承 多态

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神奇洋葱头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值