首页 >> 读书频道 >> 电脑 >> 学习和使用继承时先要清楚的三点
 
· SP开发前菜鸟设置篇
· 信息系统中用Java访问
· 使用JDBC创建数据库访
· 实例演示:jsp+jav
· 细说Java之util类
· 实战Java用户界面本地
· 开发webservice
· 使用vector获取页面
· Java学习:HSQLD
· Java学习:Servl
· java学习:彻底明白J
· Java一点通:中文识别
 
· 加油金顺剧情分集介绍完整
· 红楼梦:120回全本[清
· 素质教育在美国
· 全唐诗卷四十六
· 韩剧《布拉格恋人》剧情介
· 夜航船[作者:明·张岱]
· 局外人[作者:韩·可爱淘
· 现场流行病学
· 源氏物语[日本:紫式部]
· 武林寓言故事
· 2006高考录取规则
· 首批中国世界名牌产品和2
 
· (出租)中动商场部分及写
· (出租)中动动漫基地&#
· 喜剧学院
· 《善德女王》剧情介绍
· 魔女18号 剧情
· 丑女无敌剧情介绍
· 魔女幼熙剧情介绍
· 龙游天下剧情介绍
· 震撼世界的七日剧情介绍
· 静静的白桦林剧情介绍
· 心情日记—老公今天我想对
· 旗舰剧情介绍
欢迎来到月影社区!如果您觉得这里不错,请推荐给您的朋友们。月影社区:http://wf66.com/

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


查看有无更新版本

关键字:JAVA 2006-8-31

 

第一点:
那就是
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;
}
void jian(int i){
this.i=this.i-i;
}
}
第三点:
那就是通常所说的“继承后使用多态”、“动态方法调度”、“运行时类型识别”了。先不要被上面的术语搞昏头哦:-)
可以总结为以下两条:
1.默认状态(和强制类型转换状态相区别)下,该对象(sub)能且只能调用父类方法和父类变量(调用子类方法时会出现编译期错误)。此种情况下,还有两种不同的情况:
▲被调用方法是被子类覆盖的方法,这时父类变量不能被该方法修改。【注1】
▲被调用方法没有被子类覆盖,这时父类变量可以被该方法修改。
看看下面的代码,注意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);//默认状态下调用被覆盖了的父类方法------------------------------2
System.out.println(sub.i);//打印结果为0----------------------------------------------3
sub.print();//默认状态下调用没有被覆盖的父类方法----------------------------4
System.out.println(sub.i);//打印结果为5:-------------------------------------------5
}
}
class Super {
protected int i=0;
void plus(int i) {
this.i =3;
}
void print(){
this.i=5;
}
}
class Sub
extends Super {
protected int i = 1;
void plus(int i) {
this.i = i + 8;
}
void plus(int i, int j) {
this.i = i + j;
}
void reduce(int i) {
this.i = this.i - i;
}
}
2.强制类型转换状态下【注2】,该对象(sub)能且只能调用其子类方法和子类变量(这时被修改的就是子类变量了)。
此种情况下,也有两种不同情况:
▲调用方法时强制转换,比如下面的((Sub)sub).plus(int i);
▲调用变量时强制转化,比如下面的System.out.println(((Sub)sub).i);
看看下面的代码,注意6、7处:
public class Temp {
public static void main(String[] args) {
Super sub = new Sub();
((Sub)sub).plus(3);//调用方法时强制转换----------------------------------------------6
System.out.println(((Sub)sub).i);//调用变量时的强制转换,打印结果11------7
}
}
class Super {
protected int i=0;
void plus(int i) {
this.i =3;
}
void print(
- ·热点推荐:·腾讯QQ2003 III正式版抢先试用! ·Flash发誓要成为最普及的工具! ·免受侵扰,我用阿达家长控制助手 ·VC学习:获取游戏手柄的按键输入 一周好软回顾:望穿秋水QQ终发布 ·首度曝光,XPSP2 2082 中文版安装图解 ·浅谈木马的加载方式 ·无限无线实战篇 校园网内部机也能出国访问 ·三度空间:微软P2P工具全攻略之安装篇 让WinRAR“不务正业” ·制作一个逼真的垃圾篓 ·全球500强企业网站截图欣赏(五) ·绘制你的个性摄像头 ·3DSMAX高级应用技巧之楼房生长动画 ·强烈推荐!超强超全QQ表情 ·XP酷主题:FFXBOX 

){
this.i=5;
}
}
class Sub
extends Super {
protected int i = 1;
void plus(int i) {
this.i = i + 8;
}
void plus(int i, int j) {
this.i = i + j;
}
void reduce(int i) {
this.i = this.i - i;
}
}
【注1】这种情况下,把该对象强制转换为子类对象时,可以发现,如果子类中覆盖了父类的方法,那么子类的变量被改变了。如下例中。
【注2】对父类强制转换的结果和默认状态下是相同的,所以,这里只讨论对子类强制转换。
下面的两个例子混合了上述情况,体验一下,注意8~17处。
例1.
public class Temp {
public static void main(String[] args) {
Super sub = new Sub();
sub.plus(3);//默认状态下调用被覆盖了的父类方法---------------------------------8
System.out.println(sub.i);//调用变量时强制转化,打印结果为0-----------------9
System.out.println(((Sub)sub).i);//打印结果为11--------------------------------------10
}
}
class Super {
protected int i=0;
void plus(int i) {
this.i =3;
}
void print(){
this.i=5;
}
}
class Sub
extends Super {
protected int i = 1;
void plus(int i) {
this.i = i + 8;
}
void plus(int i, int j) {
this.i = i + j;
}
void reduce(int i) {
this.i = this.i - i;
}
}

例2.
public class Temp {
public static void main(String[] args) {
Super sub = new Sub();
((Sub)sub).plus(3);//强制转换状态下调用子类方法(不管其有无覆盖其父类方法)--11
System.out.println(((Sub)sub).i);//调用变量时的强制转换,打印结果为11---------------12
((Sub)sub).plus(2,2);//-----------------------------------------------------------------------------------13
System.out.println(((Sub)sub).i);//打印结果为4--------------------------------------------------14
System.out.println(sub.i);//打印结果为0-----------------------------------------------------------15
sub.print();//默认状态下调用没有被子类覆盖的父类方法----------------------------------16
System.out.println(sub.i);//打印结果为5-----------------------------------------------------------17
}
}
class Super {
protected int i=0;
void plus(int i) {
this.i =3;
}
void print(){
this.i=5;
}
}
class Sub
extends Super {
protected int i = 1;
void plus(int i) {
this.i = i + 8;
}
void plus(int i, int j) {
this.i = i + j;
}
void reduce(int i) {
this.i = this.i - i;
}
}
请看到的朋友评论!

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

[ 1 ]
学习和使用继承时先要清楚的三点 num

打印本页 关闭

关于我们版权声明本站导航友情连结作品演示 TOP↑