面向对象的-----封装、多态

以下就是对封装和多态的分析
一、封装:是一种将抽象性接口的实现细节都包装和隐藏起来,提供对外访问的方法,封装使用get set方法,this 关键字

二、多态:顾名思义就是指在不同情况下的多种形态,多态也可以理解为同一个接口,使用不同的实例而执行不同操作(如打印机可以分为彩色打印机和黑白打印机)。
1.我们先来看下多态的前提呗:子父类的继承关系、方法 的重写、父类引用指向子类对象。
请先看以下代码,父类引用指向对象我们先对他进行拆分成父类引用、指向、子类对象。此处的父类引用指 “Animal a”,指向指 “ = ”,子类对象指 “ new Cat() ”
代码中调用的方法是子类中的方法,此处引申为动态绑定,所谓动态绑定是指运行期间调用的方法,是根据其(子类)具体的类型

public class Demon{
	public static void main(String[] args){
		Animal a=new Cat();	//父类引用指向子类对象
		a.eat();		//此时输出的是 “猫吃鱼”
	}
}

class Animal{
	public void eat(){
		System.out.println("吃东西");
	}
}
class Cat extends Animal{
	public void eat(){
		System.out.println("猫吃鱼");
	}
}

2.多态的成员特点
说起成员就会想到成员变量、成员方法、静态方法下面我们用代码来说明成员在多态中的特点

(1) 成员变量
如Dad1 d=new Kid1();
编译时看的是左边,运行时也看的左边.因为变量不能重写

public class Demon2{
	public static void main(String[] args){
		Dad1 d1=new Kid1();
		//当Dad类中没有成员变量num时此时System.out.println(d.num)编译不了,报错
		System.out.println(d1.num);	//当Dad类中有num此时编译通过,运行结果为20,因为变量不能重写
	}
}
class Dad1{
	int num=20;
}
class Kid1 extends Dad1{
	int num=10;
}

(2) 成员方法
如Dad2 d2=new Kid2();
编译时看的左边,运行时看的右边 ,也就是动态绑定

public class Demon3{
	public static void main(String[] args){
		Dad2 d2=new Kid2();
		//若Dad2类中无方法,此时编译出错
		d.method();	//此时调用的时子类中的方法
	}
}
class Dad2{
	public void method(){
	System.out.println("我是父类方法");
	} 
}
class Kid2 extends Dad2{
	System.out.println("我是子类方法");
}

(3) 静态方法
如Dad3 对=new Kid3();
编译时看的左边,运行时看的右边

public class Demon4{	
	public static void main(String[] args){
		Dad3 d3=new Kid3();
		//此处还是编译同上
		
		d3.function()	//调用的是父类的,因为使用变量去调用静态方法,其实就是相当于用变量类型的类名(如Dad3)调用
	}

}
class Dad3{
	public static void function(){
		System.out.println("父类方法");
	}
}
class Kid3 extends Dad3{
	public static void function(){
		System.out.println("子类方法");
	}
}

多态中的向上转型和向下转型就是引用类型之间的转换,此处我们简单的提下基本数据类型的转换。基本数据类型转换分为自动类型转换(由小到大 byte short char-----int -----long ----- float -----double;注意:布尔不参与转换)和强制类型转换(由大到小 但是会损失精度)回归正题,向上转型就是由小到大也就是将子类转换成父类型;向下转换也称为强制转换(由大到小),当需要子类特有的成员时就用到向下转换

3.多态的优缺点
缺点:无法直接访问子类特有的成员
优点:可以提高可维护性(多态前提下所保证),提高代码的可扩展性如以下

public class Demonz{
	public static void main(String[] args){
		MiFactory factory=new MiFactory();
		factory.crreatPhone(new RedMi());
		factory.creatPhone(new MiNote());
	}
}
class MiFactory{
	public vid creatPhone(Phone p){
		p.call();
	}
}
interface Phone {
	public void call();
}
 class RedMi implements Phone{
	public void call(){
		System.out.println("红米打电话");
	}
}
class MiNote implements Phone{
	public void call(){
		System.out.println("MiNote打电话");
	}
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值