以下就是对封装和多态的分析
一、封装:是一种将抽象性接口的实现细节都包装和隐藏起来,提供对外访问的方法,封装使用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打电话");
}
}