多态的基本知识

多态:
1.何为多态
2.多态的前提条件;
3.多态访问成员的特点
4.多态的优点
5多态的缺点
6如何解决多态的缺点了?
一、多态
某个事物,在不同的时刻表现出来的不同状态
比如: 猫是动物
Animer c = new Cat();
猫是猫
Cat c1 = new Cat();<记得从右边往左边开始年>
二、前提条件
A:有继承的关系
B:子类重写父类的方法
C:父类的引用(比如说上面的c )指向子类的对象
举个例子来说明一下:
/*
动物、狗的例子:
*/
class Animer{
public void show(){
System.out.println("父类的方法");
}
}


class Dog extends{//狗狗继承动物
public void show(){
System.out.println("子类重写了父类的方法");
}
}


class Test{
public static void main(String [] agrs){
//父类的引用指向子类的对象
Animer d = new Dog();
d.show();
}
}
三、多态访问成员的特点:
在上面的例子中如果子类有特有的方法,在编译的时候是否会报错了?
class Animer{
public void show(){
System.out.println("父类的方法");
}
}


class Dog extends{//狗狗继承动物
public void show(){
System.out.println("子类重写了父类的方法");
}

public void methed(){
System.out.println("子类特有的功能");
}
}


class Test{
public static void main(String [] agrs){
//父类的引用指向子类的对象
Animer d = new Dog();
d.show();

d.methed();//这里会提示报错有!!!!
}
}
这个和多态访问成员的特点有关,
那么
多态有哪些特点了?
1.访问成员变量的时候:
编译看左边,执行看左边
2.构造方法
在继承关系中,在调用子类的构造方法时候,系统都回去默认的访问父类的无参构造方法
对父类的数据进行初始化
3.成员方法
编译看左边,执行看右边

所闻的左边就是父类,右边就是子类


比如说访问成员方法:
编译看左边就是说编译的时候看这个方法在父类中是否存在,
执行看右边是说调用的时候要看子类中的这个方法


四、.优点:可维护、可扩展型
可扩展型举例说明:
class Animer{
public void eat(){
System.out.println("Animer eat");
}

public void sleep(){
System.out.println("Animer sleep");
}
}


class Cat extends Animer{
public void eat(){
System.out.println("Cat eat");
}

public void sleep(){
System.out.println("Cat sleep");
}
}


class Dog extends Animer{
public void eat(){
System.out.println("Dog eat");
}

public void sleep(){
System.out.println("Dog sleep");
}
}
//动物的工具类
class UserTool{
private UserTool(){}//这样设计是为了防止new 对象

public static void useTool(Animer a){
a.eat();
a.sleep();
}


}


class Test3{
public static void main(String[] args){
Animer c = new Cat();//多态这样来解释:cat 是 animeir   从右边往左边看
Animer c2 = new Cat();
Animer c3 = new Cat();

//工具类中的方法是静态方法,调用可以通过类名调用
//为了防止对工具类进行创建对象
//所以构造方法的修饰符该为private,这样都不能创建对象了
//不信你可以试一下看报错不?
/*
错误: UserTool()可以在UserTool中访问private
UserTool ut = new UserTool();
*/
//UserTool ut = new UserTool();
UserTool.useTool(c);//传递的参数是引用类型,那么要传入一个对象
UserTool.useTool(c2);
UserTool.useTool(c3);
System.out.println("-------------------------");
// cat创建完了。这个时候如果要加入dog了
//这个时候只要创建dog类,然后继承animer,在重写父类的方法都可以了
//从而体现了多态的扩展型
Animer d = new Dog();
UserTool.useTool(d);

//后面如果还要添加,比如说Pig  ,只需要创建Pig类,然后在继承Animer
//在main方法中在创建Pig对象,在调用工具类中的方法即可

五、缺点是:不能访问子类特有的功能
六、怎么办了?
能否把父类的引用赋给子类的引用了?
可以
这个叫做向下转型,注意的是需要强制转换了


比如说:
Animer d = new Dog();//向上转型
d.show();


Dog d2 = (Dog)d;//向下转型
d2.methed();










你可能感兴趣的:(java面向对象)