java 封装 继承 多态

面向对象编程(Object Oriented Programming)有三大特性:封装、继承、多态。在这里,和大家一起加深对三者的理解。

封装
封装可以拆开理解,装,是把数据和方法放进了类里;封,把装进去的数据和成员方法加上访问权限。对于外界,内部细节是透明的,暴露给外面的是它的访问方法。

继承
继承,是为了重用父类代码。两个类若具有is a的关系就可以用extends另外,继承也为实现多态做了铺垫。

多态
现实事物经常会体现出多种形态,如学生,学生是人的一种,一个具体的同学新垣结衣,即使学生,也是人,出现两种形态。java面向对象,同样可以描述一个事物多种形态。如,Student类继承了Person类,一个student的对象既是Student,同时也是Person。
多态的定义格式:(死记这句话)父类的引用变量指向子类对象
格式:

父类类型 变量名 = new 子类类型();

父类类型可以是普通类、抽象类、接口。因此又可以细分为三种形式:

//1、父类类型为普通类
class Father{}
class Son extends Father{}
//多态
Father f = new Son();   	//父类类型指向子类对象(注意:new Son()   为一个对象,子类对象)

//2、父类为抽象类
abstract class Father{
	public abstract void sing();
}
class Son extends Father{
	public void sing(){
		System.put.println("父类为抽象类");
	}
}
//多态
Fatehr f = new Son();


//3\父类为接口
interface Father{
	public abstract void sing();
}
class Son implements Father{
	public void sing(){
		System.put.println("父类为抽象类");
	}
}
//多态
Fatehr f = new Son();

程序中定义的引用变量(java有两大数据类型,内部数据类型和引用数据类型)所指向的具体类型和通过该引用变量发出的方法调用编译时不确定,而是在程序运行期间确定,即一个引用变量到低指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。
在理解多态时,总是逃不掉“向上转型”。
问题的核心在于,一般情况下,在子类继承父类后,子类具有父类的所有成员和方法。但是在向上转型之后,子类中一些独有的成员和方法对于该父类类型的引用变量则“不可见”。

实例

package binaryheap.test;

import java.awt.image.SinglePixelPackedSampleModel;

//创建一个Animal类
class Animal {
	public void run() {
		System.out.println("Animal在奔跑!!!");
		sing();
	}

	public void sing() {
		System.out.println("Animal在唱歌~~~");
	}

}

//创建一个子类继承父类
class Lion extends Animal {

	// 重载run()方法,和父类中的run()方法不是一个
	// 向上转型时会丢失该方法
	public void run(String anotherAnimal) {

		System.out.println(("Lion在追一只" + anotherAnimal));;
		sing();
	}

	// 重写
	public void sing() {
		System.out.println("Lion在唱歌~~~");
	}

}

public class BH {

	public static void main(String[] args) {
		// 创建一个父类引用,但是指向Lion对象
		Animal animal = new Lion();
		animal.run();
	}
}

结果:

Animal在奔跑!!!
Lion在唱歌~~~

Animal animal = new Lion(); 向上转型后的Animal类型的引用,丢失了重载的方法run(),即子类中的run(),指向的是父类的run(),因此输出“Animal在奔跑”,而不是“Lion在奔跑”。run()方法中调用了sing()方法,因为sing()方法被重写,引用能够找到sing()方法,因此引用调用此sing()方法(动然调用),输出“Lion在唱歌”。

多态成员的特点:
1、多态成员变量(子类、父类中出先相同的成员变量时,多态调用该变量时):

  • 编译时期:引用变量所属的类(父类)中是否有被调用的成员变量。没有的话——编译失败
  • 运行时期:调用引用变量所属的类(父类)中的成员变量(此时肯定编译成功了,不然无法运行,因此父类中肯定有此成员变量,那么久调用)
  • 总结:编译运行均看“=”号左边

2、多态成员方法(重点)

  • 编译时期:引用变量所属的类(父类)类中没有该调用的方法,编译失败
  • 运行时期:引用变量所指向的对象所属的类(子类),运行该子类的成员方法
  • 总结:编译看左,运行看右

实现多态的必要条件为:继承重写向上转型(或者说父类引用指向子类对象)。其实现机制为:调用那个方法是由被引用对象的类型决定,而不是引用变量的类型决定的,并且这个被调用的方法必须是被子类重写过的。
总结

  1. 使用父类的引用指向子类对象
  2. 该引用只能调用父类中定义的方法和变量
  3. 若子类重写了父类的一个方法(只能重写方法,不能重写变量,否则编译时期会报错),那么调用的时候会调用子类的这个方法。

此外,在多态引用时,可能会涉及到超类的构造方法。调用超类的构造方法的顺序是先调用最远的超类的构造方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值