继承:是指从大分类到小分类的过程。
子类继承父类,你有的我都有,你没有的我也有。
package test;
public class Demo3 {
public static void main(String[] args){
抢劫犯 A =new 抢劫犯("AAA");
A.doSomething();
诈骗犯 B =new 诈骗犯("BBB");
B.doSomething();
}
}
class 犯人{
protected String name;
public 犯人(String name){
this.name = name;
}
public void doSomething(){
System.out.println("我叫"+ this.name + "我是一个犯人");
}
}
class 抢劫犯 extends 犯人{
public 抢劫犯(String name){
super (name);
}
public void doSomething(){
System.out.println("我叫"+ this.name + "我是一个抢劫犯");
}
}
class 诈骗犯 extends 犯人{
public 诈骗犯(String name){
super (name);
}
public void doSomething(){
System.out.println("我叫"+ this.name + "我是一个诈骗犯");
}
}
对于如上的代码,最后会输出;我叫AAA我是一个抢劫犯
我叫BBB我是一个诈骗犯
抢劫犯 A =new 抢劫犯("AAA");可以翻译成如下:
抢劫犯 A; //翻译成:我对java说,我需要一块空间,我要放抢劫犯,我给这块空间取一个名字叫A
A = new 抢劫犯("萨达姆"); //我需要在A这块空间里面放一个抢劫犯,叫萨达姆
A.doSomething(); //调空间A里面的这个对象的方法
这里如果将上面的两句话:
抢劫犯 A =new 抢劫犯("AAA");
A.doSomething();
诈骗犯 B =new 诈骗犯("BBB");
B.doSomething();
改为:
犯人 A =new 抢劫犯("AAA");
A.doSomething();
犯人 B =new 诈骗犯("BBB");
B.doSomething();
最后输出的内容也是一样的。因为申请的一块内存本来是要放的是犯人,最后结果放的是抢劫犯,那么调用这块内存里面的对象的方法的时候,肯定就是对应的抢劫犯的行为。即new的是子类的对象,那么调的就是子类的方法。
现在如果我们要继续什么一个C和D
抢劫犯 C = A; //这样会报错,那我们就强制申明
抢劫犯 C = (抢劫犯)A; //我需要一个放抢劫犯的空间,我取名字为C,我需要把A空间里面的东西放到C里面,但是java发现A是一块专门放犯人的地方,
//因此会报错。所以我们强制申明A为抢劫犯,也就是说我向java保证,A里面肯定放的是一个抢劫犯。最后编译通过了并且输出了:我叫AAA我是一个抢 劫犯
但是
抢劫犯 D = (抢劫犯)B; //执行了D.doSomething();后,运行报错。因为已经跟java保证过了B里面会输出一个抢劫犯的行为,但是最后执行的时候才发现里面是诈骗犯。
//所以编 译通过了,运行不通过。