继承 extends

        ① 继承只能单继承,也就是一个子类只能有一个直接父类。反之,一个父类可以有多个子类。

        ② java中的继承是分层继承的,也就是子类的父类可以有父类。

        ③ 所有类都继承自 Object 类。

        ④ 父类的构造器和静态成员不能被继承。

        ⑤ super是只是标识符,表示父类构造器以及父类属性和方法。

        this指的是当前对象,谁调用它便指向谁。

        ⑥ 重写方法前最好加上 @Override 注解,这样编译器会在编译时检查要重写的方法是否被重写。

        重写方法时要保证方法签名完全相同,即方法的返回值类型、方法名、参数列表完全一样,注意权限修饰符的范围不能小于父类被重写方法的权限修饰符。但是抛出的异常截然相反,子类抛出的异常范围不能大于父类抛出的异常范围。

        ⑦ 子类可以重写(覆盖)父类的方法。一旦父类的方法被重写,则父类的方法被隐藏(并不销毁), 子类对象不能调用父类被重写的方法。

        ⑧ 创建的子类对象是由两个类为模板共同创建的,并不是有两个对象,也不是将父类代码全部写到子类当中。

        ⑨ 在子类中,如果父类的该属性没被重新定义,则 this.属性 和 super.属性 都能调用父类的属性,因为子类直接从父类继承该属性,所以它们是相同的。如果该属性在子类中被重新定义,则在子类中 this.属性 指的是当前子类对象的属性, super.属性 指的是父类的属性。在父类中 this.属性就是父类的属性。(见代码)

        ⑩ 在子类中,如果没有重写父类的方法,则子类和父类共用父类的这个方法。此时在子类和父类中 this.方法 以及 super.方法 都是一样的。如果子类重写父类的方法了,那么此时父类方法被覆盖掉(并不是真正的被销毁了,如果创建父类对象调用父类方法还是能调用的),在子类中要用 super.方法 调用父类的方法,用 this.方法 调用子类的方法,这时两个方法就不一样了,并且如果在父类中用 this.方法 调用的是子类的方法。(见代码)

        ⑪ 接口能继承接口,并且能够多继承。这点与类的继承不同,类只能单继承。

 

 

        注意:被私有化的属性是被子类继承的,只不过不能直接调用而已,需要用到方法间接调用,比如:super.getXxx();

 

 

        代码:

        //父类

        public class Father {

                private int a = 1;

                private int b = 2;

                private int c = 3;

                public Father() {

                        super();

                        System.out.println(this.a + "" + this.b + "" + this.c);

                        System.out.println(this.toString());

                }

 

                public Father(int a, int b, int c) {

                        super();

                        this.a = a;

                        this.b = b;

                       this.c = c;

                }

 

                public int getA() {

                        return a;

                }

 

                public void setA(int a) {

                        this.a = a;

                }

 

                public int getB() {

                        return b;

                }

 

                public void setB(int b) {

                        this.b = b;

                }

 

                public int getC() {

                        return c;

                }

 

                public void setC(int c) {

                        this.c = c;

                }

 

                @Override

                public String toString() {

                        return "Father [a=" + this.a + ", b=" + this.b + ", c=" + this.c + "]";

                }

        }

 

        //子类

        public class Son extends Father {

                private int a = 4;

                private int b = 5;

                private int c = 6;

                public Son() {

                        super();

                        System.out.println(this.a + "" + this.b + "" + this.c);

                        System.out.println(this.toString());

                }

                 public Son(int a, int b, int c) {

                        super(a, b, c);

                }

 

        @Override

        public String toString() {

                return "Son [a=" + this.a + ", b=" + this.b + ", c=" + this.c + "]";

        }

 

}

 

        //测试类

        public class ExtendsTest {

 

                public static void main(String[] args) {

                        Son son = new Son();

 

                }

 

        }

 

        运行结果:

        123

        Son [a=0, b=0, c=0]

        456

        Son [a=4, b=5, c=6]

 

        由运行结果可以看出,在创建子类对象时,首先会调用子类构造器,然后立即调用父类构造器,为父类的属性显示赋值,然后执行父类构造器中代码,之后父类构造器调用完成。此时输出的 this.属性 就是父类的属性,而 this.方法 却是子类的toString()方法,这是由于子类重写了父类的toString()方法。为什么toString()方法中的this.属性都为0呢?这是由于父类构造器还没有调用完,还没有轮到子类构造器工作,所以子类的属性还没有被初始化,因此是默认值0。在父类构造器调用结束,则继续执行子类构造器,这时候会为子类的属性显示赋值456,在执行构造器中的其它代码,所以这时toString()方法中属性值为456了。最后子类构造器调用完毕,子类对象创建成功。这个子类对象具有子类和父类的特征,因为这个对象由两个类的信息共同创建的。

 

 

 

                                                                                                                                        by Karl

 

转载于:https://my.oschina.net/karl0/blog/758775

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值