Java语言基础--继承

1.扩展类的构造器

扩展类的构造器必须通过隐式地或显式地调用其超类的构造器,将继承而来的字段的构造工作委托给超类。可以使用super来显式地调用超类的某个构造器。如果扩展类构造器的第一条可执行语句不是调用超类构造器的语句,那么扩展类的构造方法会自动调用超类的无参构造器。也就是说,扩展类构造器的第一条语句被认为是如下语句:super();。如果超类没有无参构造器,就必须显式地调用其他构造器。

创建一个(扩展类)对象的过程:为对象的所有字段分配存储空间并初始化为各自类型的默认值。此后,构造过程分为三个阶段。1.调用超类的构造器;2.初始化继承而来的相应的字段;3.执行构造器其他语句。(先进行超类的初始化部分,然后执行超类的构造器,在进行扩展类的初始化部分,最后执行扩展类的构造器。)。

2.类的加载顺序

java虚拟机先加载超类,再加载扩展类。加载类时,会对静态初始化块、静态成员进行一次初始化。只有要创建一个对象时,才会初始化非静态部分以及构造器(顺序是先父后子),如果只访问静态方法,虚拟机不会加载这些部分。

3.隐藏与覆盖

如果你在扩展类中声明了一个与超类中的某个字段同名的字段,那么虽然超类中继承来的这个字段仍然存在,但是通过它的简单名已经无法直接访问它,必须通过使用super或者超类类型的一个引用来访问它,这种现象是字段的隐藏。

class supershow {

public string str = "superstr";

public void show() {

system.out.println("super.show: " + str);

}

}

class extendshow extends supershow {

public string str = "extendstr";

public void show() {

system.out.println("extend.show: " + str);

}

}

public class hidden {

public static void main(string[] args) {

extendshow ext = new extendshow();

supershow sup = ext;

sup.show();

ext.show();

system.out.println("sup.str = " + sup.str);

system.out.println("ext.str = " + ext.str);

}

}

对于方法,具体应调用哪个版本是由对象的实际类型而不是引用的类型决定的。对于字段,具体应访问哪个类的字段由引用的类型决定,不是由对象的实际类型决定。在一个方法内部,对一个字段的引用总是会引用到在声明这个方法的类中所声明的字段上。

类的静态成员(无论是字段还是方法)不可以被覆盖,只会被隐藏。静态成员的访问是由引用类型决定而不是对象的实际类型。

在类的所有非静态方法中都可以使用super关键字。它将当前对象引用为其超类的一个实例。

class base {

protected string name() {

return "base";

}

}

classmore {

protected string name() {

return "more";

}

}

protected void printname() {

base sref = (base) this;

system.out.println("this.name(): " + this.name());

system.out.println("sref.name(): " + sref.name());

system.out.println("super.name(): " + super.name());

}

}

super会忽略对象的真正类型而使用超类的name()实现。sref和this行为相同,会基于对象的实际类型来选择name()的实现。

this.name() = more

sref.name() = more

super.name() = base

4.object类

object类是整个类层次结构树的根,定义了大量可以被所有对象继承的方法,这些方法分为两类:通用方法和支持线程的方法。常用的方法是equals()(返回boolean型结果),hashcode()(返回int型结果),clone()方法(返回object型结果)。object.equals()中任何两个不同的对象都是不等价的(一个对象只和自身等价),散列码也是不同的。所以我们自己的类通常需要重写实现这两个方法。创建一个可克隆类的最简单的方法是声明它实现了cloneable接口,并且通过将clone()方法重新声明为公共的来覆盖它:

public class myclass extends herclass implements cloneable {

public myclass clone() throws clonenotsupportexception {

return (myclass)super.clone();

}

//...

}


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值