1.extends与implements的区别:
extends:是继承父类,只要被继承的类声明不是fina或者定义为abstract的抽象类就都能被继承,java与C#同样是不支持多重继承,但是可以用接口来实现。
implements:是实现接口的关键词,可实现多个接口,用“,”号分隔开即可:
public class student extends userInfo implements Istudent,Iclass { .....}
【class 子类名 extends 父类名 implenments 接口名】
2.父类与子类继承关系上的不同:
userInfo u = new student(); 结果u是一个userInfo类的实例,只能访问userInfo中的方法,和userInfo u = new userInfo();有什么区别呢?
class student extends userInfo
继承过后通常会定义一些父类没有的成员或者方法。
userInfo u = new student();
这样是可以的向上访问,不能向下访问。
u是一个父类对象的实例,因而不能访问子类定义的新成员或方法。
例如:
class userInfo
{
int userId;
void fun(){}
}
class student extends userInfo
{
int studentid;
void fun(){} //重写
void fun2(){}
}
student s = new student();
s就是子类对象的实例,不仅能够访问自己的属性和方法,也能够访问父类的属性和方法。诸如s.userid,s.studentid,s.fun(),s.fun2()都是合法的。此时s.fun()是访问的studnent中的fun() 而非userInfo中的fun()
userInfo u = new student();
u虽然是用的student的构造函数,但已过向上访问,成为父类对象的实例,不能访问子类的属性和方法。u.userid,u.fun()是合法的,而u.studentid,u.fun2()是非法。此时访问u.fun()是访问student中重写后的fun()
userInfo u = new student(); 实际上有三个过程:
(1) userInfo u;
将u声明为父类对象,只是一个引用,未分配空间
(2) student s = new student();
通过s类的构造函数建立了一个s类对象的实例,也就是初始化student类
(3) u = (userInfo)s;
将子类对象s转换为父类对象userInfo并赋给u,这就是上抛,是安全的。
经过以上3个过程,u就彻底成为了一个userInfo类的实例。
子类往往比父类有更多的属性和方法,上抛只是舍弃,是安全的;而向下访问下抛有时会增加,通常是不安全的。