父类创建子类对象以及方法,属性重写问题

 Father father = new Son(); 这样的吧,这有一种专业说法,叫“父类引用指向子类对象”。
首先 new Son();是肯定动态创建了一个子类对象的 。
Father father 则是一个创建了一个父类引用对象。
Father father = new Son(); 就是将父类引用指向子类对象,这是java里很常用的用法。
这时候如果用father调用方法father,method() ;如果method()方法只有父类有,子类里没有写。那么就调用父类里那个方法体。如果在子类里有对method()进行了重写(注意是重写不是重载), 那么就调用子类里的那个方法体

子类构造器的默认第一行就是super(),默认调用直接父类的无参构造。这也就是一旦一个子类的直接父类没有无参的构造的情况下,必须在自己构造器的第一行显式的指明调用父类或者自己的哪一个构造器。

  父类中的实例方法可以被重写

但静态方法,静态属性,非静态属性都不可以被重写,实现多态。

例:

public class A {

    public static String staticStr = "A's static field"

    public String nonStaticStr = "A's nonstatic field"

    public static void staticMethod(){ 

        System.out.println("A's static method"); 

    

    public void nonStaticMethod(){ 

        System.out.println("A's nonstatic method"); 

    

public class extends A{

    public static String staticStr = "B's static field"

    public String nonStaticStr = "B's nonstatic field"

    public static void staticMethod(){ 

        System.out.println("B's static method"); 

    

}

public class extends A{

   

}

public class Test { 

   

    public static void main(String[] args) { 

        C c = new C(); 

        System.out.println(c.nonStaticStr);  //A's nonstatic field

        System.out.println(c.staticStr);  //A's static field

        c.staticMethod(); //A's static method

        

        System.out.println("-------------------------------"); 

           

        A c1 = new C(); 

        System.out.println(c1.nonStaticStr);  //A's nonstatic field

        System.out.println(c1.staticStr);  //A's static field

        c1.staticMethod(); //A's static method

          

        // 以上这说明java中静态属性和静态方法可以被继承

         

        System.out.println("-------------------------------"); 

        B b = new B(); 

        System.out.println(b.nonStaticStr); // B's nonstatic field

        System.out.println(b.staticStr);   //B's static field

        b.staticMethod();  //B's static method

         

        System.out.println("-------------------------------"); 

        A b1 = new B(); 

        System.out.println(b1.nonStaticStr);  //A's nonstatic field

        System.out.println(b1.staticStr);  //A's static field

        b1.staticMethod(); //A's static method

        //b1.nonStaticStr  输出的是父类的非静态属性,说明非静态属性不可以被重写,不能实现多态

        //b1.staticStr     输出的是父类的静态属性,说明静态属性不可以被重写,不能实现多态

        //b1.staticMethod()输出的是父类A的静态方法,不是子类B改写后的,所以没有实现多态

         

         

        //结论是:静态属性和静态方法只是可以继承没有表现出多态性。

        //因为静态方法和静态属性没有采用动态绑定。具体表现就是,

        //将子类实例向上转型则会调用到基类中的静态方法和属性,

        //不转型就调用子类自身的静态方法和属性。

        //编译器不推荐通过实例去调用静态方法和属性,因为这种调用方式容易造成混淆。

         

        //实际上,在Java的规范中,Java对于类的方法和属性采用了两种完全不同的处理机制:

        //对于方法,使用重载机制实现了多态性;对于属性,使用的是同名属性隐藏机制。

        //所谓的同名属性隐藏机制是指:在具有父子关系的两个类中,

        //子类中相同名字的属性会使得从父类中继承过来的同名属性变得不可见,

        //不管类型是否一致,名称一致的两个属性就是同名属性。

        //在子类中,无法简单地通过属性名称来获取父类中的属性,

        //而是必须通过父类名称加属性名称(super.变量名)的方法才可以访问父类中的该属性。

        //一般而言,为了代码容易阅读,极其不建议在父类和子类中使用同名属性。

    

   

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值