分享
 
 
 

学习和使用继承时最先要清楚的三点

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

作者:qlampskyface

和作者联系:xiaozuidaizhi@sina.com

第一点:

那就是

1.如果该子类覆盖了父类的方法,那么该子类对象调用该方法时,被该方法修改的类级别变量是该子类的变量。

2.如果该子类没有覆盖父类方法,而直接调用父类的方法,那么被该方法修改的类级别变量是父类的变量。

1则如下例:

public class Temp{

public static void main(String args[]){

b bb = new b();

bb.fuqin();

}

}

class a{

public String s = "fuqin";

public void fuqin(){

System.out.println(s);

}

}

class b extends a{

public String s = "erzi";

public void fuqin(){

System.out.println(s);

}

}

//结果为erzi

2.则如下例:

public class Temp{

public static void main(String args[]){

b bb = new b();

bb.fuqin();

}

}

class a{

public String s = "fuqin";

public void fuqin(){

System.out.println(s);

}

}

class b extends a{

public String s = "erzi";

public void erzi(){

System.out.println(s);

}

}

//结果为fuqin

第二点:

那就是对“覆盖(override)”和“重载(overload)”以及重建的概念的清晰。

先声明一下:重建就是写一个新的方法。

如下例:

下面这个叫覆盖

public class Temp {

public static void main(String[] args) {

Sub sub = new Sub();

sub.plus(2);

System.out.println(sub.i);

}

}

class Super {

protected int i;

void plus(int i) {

this.i += i;

}

}

class Sub

extends Super {

protected int i = 1;

void plus(int i){

this.i=i+5;

}

}

下面这个叫重建,不是重载:

public class Temp {

public static void main(String[] args) {

Sub sub = new Sub();

sub.plus(2);

sub.plus(2,2);

System.out.println(sub.i);

System.out.println(((Super)sub).i);

}

}

class Super {

protected int i;

void plus(int i) {

this.i += i;

}

}

class Sub

extends Super {

protected int i = 1;

void plus(int i,int j){

this.i=i+j;

}

}

第三点:

那就是通常所说的“继承后使用多态”、“动态方法调度”、“运行时类型识别”了。先不要被上面的术语搞昏头哦:-)

可以总结为以下两条:

1.默认状态(和强制类型转换状态相区别)下,该对象(sub)只能调用父类方法和父类变量(调用该子类方法时会出现编译期错误)。此种情况下,还有两种不同的情况:

▲被调用方法是被该子类覆盖的方法,这时其实是显式调用父类方法,实际上是调用该子类方法和该子类变量,这时父类变量不能被该方法修改,被修改的是该子类变量。

▲被调用方法没有被该子类覆盖,这时是调用父类方法,父类变量可以被该方法修改。

看看下面的代码,注意1~5处。

public class Temp {

public static void main(String[] args) {

Super sub = new Sub();

System.out.println(sub.i);//打印结果为0----------------------------------------------1

sub.plus(3);//打印结果为Sub's plus.默认状态下伪调用被覆盖了的父类方法,

//实际调用该子类该方法------------------------------------------------------2

System.out.println(sub.i);//打印结果为0----------------------------------------------3

sub.print();//打印结果为Super.默认状态下调用没有被覆盖的父类方法

//实际就是本类(父类)方法-------------------------------------------------4

System.out.println(sub.i);//打印结果为5:---------------------------------------------5

}

}

class Super {

protected int i=0;

void plus(int i) {

this.i =3;

System.out.println("Super's plus");

}

void print(){

this.i=5;

System.out.println("Super");

}

}

class Sub

extends Super {

protected int i = 1;

void plus(int i) {

this.i = i + 8;

System.out.println("Sub's plus");

}

void plus(int i, int j) {

this.i = i + j;

}

}

2.强制类型转换状态下【注1】,该对象(sub)既可以调用该子类方法,又可以调用没有被覆盖的父类方法。

看看下面的代码,注意6、7处:

public class Temp {

public static void main(String[] args) {

Super sub = new Sub();

((Sub)sub).plus(3);//调用方法时强制转换----------------------------------------------6

((Sub)sub).print();//调用没有被覆盖的父类方法,改变父类变量---------------7

}

}

class Super {

protected int i=0;

void plus(int i) {

this.i =3;

System.out.println("Super's plus :"+this.i);

}

void print(){

this.i=5;

System.out.println("Super's print");

}

}

class Sub

extends Super {

protected int i = 1;

void plus(int i) {

this.i = i + 8;

System.out.println("Sub's plus :"+this.i);

}

}

【注1】对父类强制转换的结果和默认状态下是相同的,即使是被覆盖的方法,以父类做强制转换后的结果仍是实际上调用了该子类方法和该子类变量。所以,这里只讨论对该子类强制转换。

对第三点小结如下:

1.如果要想调用该子类的覆盖了父类的方法,可以在默认状态下调用,也可以在强制转换后调用。因为无论是在默认状态下,还是用父类去做强制转换调用,或者是用该子类去做强制转换调用,结果都是一样的,即调用被覆盖的该子类的方法;

2.如果要想调用父类的没有被该子类覆盖的方法,可以在默认状态下调用,也可以在被该子类强制转换后调用。都是一样的。

3.如果要想调用父类的被该子类覆盖的方法,对不起,这种情况下你得不到,不过可以通过“父类 对象名 = new 父类()”的普通创建方式得到。

4.如果要想调用父类变量(属性),对于所有的父类变量(属性),在默认状态下即可调用;对于没有被该子类覆盖的变量(属性),也可以在被子类强制转换后调用;

5.如果要想调用该子类特有的变量(属性),则只能在用该子类强制状态的情况下调用。

6.如果要想调用该子类特有的方法,则只能在用该子类强制状态的情况下使用。

下面的例子混合了上述情况,体验一下。

public class Temp {

public static void main(String[] args) {

Super sub = new Sub();

//调用父类特有的方法

System.out.println("父类特有的方法");

sub.print();

((Super)sub).print();

((Sub)sub).print();

//调用父类特有的变量(属性)

System.out.println("父类特有的变量(属性)");

System.out.println(sub.supown);

System.out.println(((Sub)sub).supown);

//调用被覆盖的父类的方法

System.out.println("被覆盖的父类的方法");

Super sup = new Super();

sup.plus(3);

//调用被覆盖了的父类的变量(属性)

System.out.println("被覆盖了的父类的变量(属性)");

System.out.println(sub.i);

System.out.println(sub.both);

//调用子类特有的方法

System.out.println("子类特有的方法");

((Sub)sub).reduce(3);

//调用子类特有的变量(属性)

System.out.println("子类特有的变量(属性)");

System.out.println(((Sub)sub).subown);

//调用覆盖了父类的子类的方法

System.out.println("覆盖了父类的子类的方法");

sub.plus(3);

((Sub)sub).plus(3);

((Super)sub).plus(3);

//调用被覆盖的子类的方法

System.out.println("覆盖了父类的子类的变量(属性)");

System.out.println(((Sub)sub).i);

System.out.println(((Sub)sub).both);

}

}

class Super {

protected int i = 0;

String both="Super's both",supown="Super's own supown";

void plus(int i) {

System.out.println("Super's plus");

}

void print() {

System.out.println("Super's own print");

}

}

class Sub

extends Super {

protected int i = 1;

String both="Sub's both",subown="Sub's own subown";

void plus(int i) {

System.out.println("Sub's plus");

}

void plus(int i, int j) {

System.out.println("Sub's own plus");

}

void reduce(int i) {

System.out.println("Sub's own reduce");

}

}

结果如下:

父类特有的方法

Super's own print

Super's own print

Super's own print

父类特有的变量(属性)

Super's own supown

Super's own supown

Super's own supown

被覆盖的父类的方法

Super's plus

被覆盖了的父类的变量(属性)

0

Super's both

子类特有的方法

Sub's own reduce

子类特有的变量(属性)

Sub's own subown

覆盖了父类的子类的方法

Sub's plus

Sub's plus

Sub's plus

覆盖了父类的子类的变量(属性)

1

Sub's both

对第三点总结如下:

通过以上的例子,我们可以得出以下总结:

对于以这种方式创建的对象来说,除了被子类

覆盖的父类方法外,它能访问子类和父类的其

余全部属性及方法。对子类的其余部分调用要

在强制转换后进行(除去继承自父类的方法)

请看到的朋友评论!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有