extends/implements里的一些Point

在Java中,每一个类只能有一个父类,这是所谓的单一继承(single inheritance),但相反的,一个父类可以拥有一个以上的子类,这点与C++稍有不同。C++允许多重继承(multiple inheritance),但Java并没有这个设计,虽然如此,Java的接口(interface)还是可以实现多重继承。
经过继承之后,子类便可拥有父类的成员,包括所有的数据成员与成员函数,但这并不意味着在子类中可以完全没有限制地访问这些成员,如父类中的private 成员便不能直接在子类中被访问。父类中声明为public的成员,或者是没有进行public/private声明的成员,继承到子类之后,其访问的属性并不会改变。
值得一提的是,在父类中private成员经继承后,子类依然可以拥有它,但不能在子类中直接对它访问;要访问它,只能通过由父类继承而来的函数成员。此外,构造函数和设定终止继承的成员都不能继承给子类。
在Java继承的机制中,执行子类的构造函数之前,可以编写程序代码来调用父类的构造函数,其目的是为了要帮助继承自父类的成员进行初始化。当父类的构造函数执行完毕后,才会执行子类的构造函数。如果子类没有编写程序代码来调用父类的构造函数,则Java会自动调用父类默认的构造函数。而如果父类中有数个构造函数,则在子类的构造函数中,可以通过super()来调用父类中特定的构造函数。
代码实例
class CCircle {
public CCircle() {
System.out.println("CCircle() constructor called");
}
public CCircle(double r) {
System.out.println("CCircle (double r) constructor called");
}
}
class CCoin extends CCircle {
public CCoin() {
System.out.println("CCoin() constructor called");
}
public CCoin(double r,int v) {
super(r);
System.out.println("CCoin(double r,int v) constructor called");
}
}
public class Test {
public static void main(String args[]) {
CCoin coin1 = new CCoin();
CCoin coin2 = new CCoin(2.5,10);
}
}

程序输出
CCircle() constructor called
CCoin() constructor called
CCircle (double r) constructor called
CCoin(double r,int v) constructor called

注意:
调用父类构造函数的super()必须写在子类构造函数中的第一个语句处,不能置于其他位置,否则编译时将出现错误信息;
super()可以重载,也就是说,super会根据参数的数量及类型,执行相对应的父类的构造函数;
Java在执行子类的构造函数之前,如果没有用super()来调用特定父类的构造函数,则会先调用父类中“没有参数的构造函数”。因此,如果父类中只定义了有参数的构造函数(此时Java不再提供父类默认的构造函数),而在子类的构造函数中又没有用super()来调用父类中特定的构造函数的话,则编译时将发生错误,因为Java在父类中找不到“没有参数的构造函数”可供执行。
构造函数里的this()与super()
this()是在同一类中调用其他的构造函数,而super()则是从子类的构造函数调用其父类的构造函数。
虽然使用的时机不同,但this()与super()还是有其相似之处
(1)当构造函数有重载时,this()与super()均会根据所给予的参数类型与个数,正确执行相对应的构造函数。
(2)this()与super()均必须编写在构造函数中的第一行,正因为这个原因,this()与super()无法同时存在于同一个构造函数中。
super后面也可加上数据成员或method的名称,如此便可利用下面的语句
super.数据成员名称
super.method名称来访问父类的数据成员与method.
this除了可用来调用同一类中的其他构造函数之外,如果同一类中“实例变量”与“局部变量”的名称相同时,也可利用它来调用同一类中的“实例变量”。
把成员声明成protected可同时兼顾到成员的安全性与便利性,因它只能提供父类与子类的内部访问,而外界则无法更改或读取它。另外,父类中的protected成员继承到子类之后,其访问属性还是protected。
通过父类变量,依然可以访问到子类对象的成员,但子类的变量不能将它指派给父类的对象 ,而且通过父类变量访问子类对象的成员,只限于“覆载”的情况发生时,也就是说,父类与子类的method名称、参数个数与类型必须完全相同,才可通过父类的变量调用子类的method,如果某一method 仅存在于子类,以父类变量调用它时,则编译时将产生错误信息。
当类、method、或是变量不想被继承、覆载或是被修改时,只要加上修饰符final即可。
重写方法不能使用比被重写方法更严格的访问权限,严格顺序private>default>protected>public
类之源--Object类
如果某一类没指定其父类,则Java会自动设定该类继承自Object类,而成为它的子类。
Object类里常用的method
getClass() method的返回值是Class类型,所以先声明一个Class类型的变量来接收它,注意Class的"C"是大写"C",它是定义于Java.lang类库里的一个类,且直接继承自Object类 ; 。
equals()method可用来比较两个类变量是否指向同一个对象。如果是,则返回true,否则返回false;
toString()method的功能是将对象的内容转换成字符串并返回转换后的结果。默认的toString()会返回对象的代码,因此多半需要覆载toString(),使得它返回的字符串更能表达对象的内容。事实上,也可以直接把变量名称当成println()的参数打印,此时Java先调代用toString()method,然后再把结果当成println()的参数打印,如此一来,在使用上更加方便。
接口的结构和抽象类非常相似,接口本身也具有数据成员与成员函数,但它与抽象类有两点不同:
1)接口的数据成员必须初始化;
2)接口里的method必须全部声明为abstract,也就是说,接口不能像抽象类一样有一般的method,而必须全部是“抽象函数”。
多重继承
借由接口机制,多重机制的处理还是可以实现的,其做法是,用类来实现两个以上的接口。如此一来,类里的method只要明确定义每一个接口中的method,便可达到多重继承的目的。
接口的延伸
接口与一般类一样,可通过继承的技术来衍生出新的接口,同样的,接口的继承也是关键字extends。一个接口可以继承自多个接口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值