继承要注意的细节
1) 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问
2)子类必须调用父类的构造器,完成父类的 初始化
3)当创建子类对象时, 不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过.
4) 如果希望指定去调用父类的某个构造器,则显式的调用一下: super(参数列表)
5)super在使用时,必须放在构造器第一-行(super只能在构造器中使用
6) super() 和this() 都只能放在构造器第一-行, 因此这两个方法不能共存在- -个构造器
7) java 所有类都是Object类的子类,Object是所有类的基类
8)父类构造 器的调用不限于直接父类!将一直往. 上追溯直到Object类(顶级父类)
9)子类最多只能继承-一个父类(指直接继承),即java中是单继承机制。
思考:如何让A类继承B类和C类?[A继承B,B继承C]
10)不能滥用继承,子类和父类之间必须满足is-a 的逻辑关系(...是...)
例(1)
package eclipse;
public class extend {
public static void main(String args[]) {
B b=new B();
}
}
class A{
A(){
System.out.println("a ");
}
A(String name){
System.out.println("a name");
}
}
class B extends A{
B(){
this("abc");
System.out.println("b");
}
B(String name){
System.out.println("b name");
}
}
输出结果:
ab name
b
分析:因为B继承A,所以要先默认先调用父类A的构造器,因此先输出“a”,然后执行this("abc")要调用B的有参构造器,输出“b name”,最后输出“b”.
例(2)
package eclipse;
public class extend1 {
public static void main(String args[]) {
C c=new C();
}
}
class A{
public A() {
System.out.println("我是A类");
}
}
class B extends A{
public B() {
System.out.println("我是B的无参构造器");
}
public B(String name) {
System.out.println(name+"我是B的有参构造器");
}
}
class C extends B{
public C() {
this("hello");
System.out.println("我是c的无参构造器");
}
public C(String name) {
super("haha");
System.out.println("我是C的有参构造器");
}
}
结果:
我是A类
haha我是B的有参构造器
我是C的有参构造器
我是c的无参构造器
注意this与super的应用
例(3)编写Computer类,包含CPU、内存、硬盘等属性,getDetails 方法用于返回Computer的详细信息
编写PC子类,继承Computer类,添加特有属性[品牌brand]
编写NotePad子类,继承Computer 类,添加特有属性[ color]
编写Test类,在main方法中创建PC和NotePad对象,分别给对象中特有的属性赋值,以及从Computer类继承的属性赋值,并使用方法并打印输出信息。
package eclipse;
public class extend3 {
public static void main(String args[]) {
pc pc1=new pc("intel",16,5000,"ibm");
System.out.println("cpu="+pc1.getcpu()+" memory="+pc1.getmemory()+" disk="+pc1.getdisk()+" brand="+pc1.getbrand());
}
}
class computer{
private String cpu;
private int memory;
private int disk;
public computer(String cpu,int memory,int disk) {
this.cpu=cpu;
this.memory=memory;
this.disk=disk;
}
public String getdetails() {
return "cpu="+cpu+"memory="+memory+"disk="+disk;
}
public String getcpu() {
return cpu;
}
public void setcpu(String cpu) {
this.cpu=cpu;
}
public int getmemory() {
return memory;
}
public void setmemory(int memory) {
this.memory=memory;
}
public int getdisk() {
return disk;
}
public void setdisk(int disk) {
this.disk=disk;
}
}
class pc extends computer{
private String brand;
public pc(String cpu, int memory, int disk,String brand) {
super(cpu, memory, disk);
this.brand=brand;
// TODO Auto-generated constructor stub
}
public String getbrand() {
return brand;
}
public void setbrand(String brand) {
this.brand=brand;
}
}
class notepad extends computer{
private String color;
public notepad(String cpu, int memory, int disk,String color) {
super(cpu, memory, disk);
this.color=color;
}
public String color() {
return color;
}
public void setcolor(String color) {
this.color=color;
}
}