理解--->三大特性之继承

内容来之 极客学院 和 毛毛虫的小哈

将子类转换成父类,在继承关系上面是向上移动的,所以一般称之为向上转型。由于向上转型是从一个叫专用类型向较通用类型转换,所以它总是安全的,唯一发生变化的可能就是属性和方法的丢失。这就是为什么编译器在“未曾明确表示转型”活“未曾指定特殊标记”的情况下,仍然允许向上转型的原因。

谨慎继承
上面讲了继承所带来的诸多好处,那我们是不是就可以大肆地使用继承呢?送你一句话:慎用继承。

首先我们需要明确,继承存在如下缺陷:

1、父类变,子类就必须变。

2、继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的。

3、继承是一种强耦合关系。

所以说当我们使用继承的时候,我们需要确信使用继承确实是有效可行的办法。那么到底要不要使用继承呢?《Think in Java》中提供了解决办法:问一问自己是否需要从子类向父类进行向上转型。如果必须向上转型,则继承是必要的,但是如果不需要,则应当好好考虑自己是否需要继承

例子 :

package com.sheepmu;
class Animal
{
public void eat()
{
System.out.println("父类的 eating...");
}
}
class Bird extends Animal
{
@Override
public void eat()
{
System.out.println("子类重写的父类的 eatting...");
}
public void fly()
{
System.out.println("子类新方法 flying...");
}
}
public class Sys
{
public static void main(String[] args)
{
Animal b=new Bird(); //向上转型
b.eat();
// b.fly(); b虽指向子类对象,但此时子类作为向上的代价丢失和父类不同的fly()方法
sleep(new Male());
sleep(new Female());//传入的参数是子类-----!!
}

public static void sleep(Human h) //方法的参数是父类------!!!  
    {  
     h.sleep();  
    }  

}

[java] view plain copy

package com.sheepmu;

public class Human
{
public void sleep()
{
System.out.println("父类人类 sleep..");
}
}
class Male extends Human
{
@Override
public void sleep()
{
System.out.println("男人 sleep..");
}
}
class Female extends Human
{
@Override
public void sleep()
{
System.out.println("女人 sleep..");
}
}

输出:
子类重写的父类的 eatting...男人 sleep..女人 sleep..
详解:

  1. 向上转型的实现 ** **
    Animal b=new Bird(); //向上转型 b.eat(); // 调用的是子类的eat()方法 b.fly(); // 报错!!!!!-------b虽指向子类对象,但此时子类作为向上转型的代价丢失和父类不同的fly()方法------2.为何不直接Bird b=new Bird();b.eat() 呢?
    这样就没有体现出面向对象的抽象的编程思想呀,降低了代码的可扩展性.
    3.向上转型的好处?
sleep(new Male());//调用方法时传入的参数是子类           sleep(new Female());

** public static void sleep(Human h) //方法的参数是父类**
{
h.sleep();
}
如上代码就是用的向上转型,若是不用向上转型,那么有多少个子类就得在这儿写多少种不同的睡觉方法~~~~~~

如果 你的所有的子类要 转换成父类 , 并都调用重写的方法 ,那么就可以继承.
(可以尝试细分继承,类似接口隔离原则 自己理解)

你可能感兴趣的:(理解--->三大特性之继承)