美文网首页
java中的this

java中的this

作者: lambdan | 来源:发表于2019-01-08 22:44 被阅读0次

    ** 父类子类中的this指的是什么? **
    ** 多态本质是什么? **

    class Base{
        int a = 1;
        public void f(){
            System.out.println(this.a); //此处a为父类1
            System.out.println(this.p()); //此处调用子类覆写方法; 多态特性1
            System.out.println(this); 
        }
        public String p(){
            return "this is Base Object";
        }
    }
    
    public class Test extends Base {
        int a = 2;
        public String p(){
            System.out.println(this);
            return "this is test";
        }
    
        public static void main(String[] args) {
            Test t = new Test();
            t.f();
            t.a;
            Base b = new Test();  //多态特性2
            b.f()
        
        }
    }
    

    父类和子类中this是同一个对象么?从结果看 两处打印this的是同一个字符串,但是这都是调用的toString()方法,两个this调用的是同个方法生成的,返回结果肯定是同一个字符串,并不能说名父类子类this一定是同一个对象。

    new创建对象时候,会在内存里开辟出父类对象和子类对象中的属性,方法所用的空间。父类子类中的this指向的也是各自的对象,new后生成的对象也是指向子类对象。

    java中的属性和方法有个特性,当对象处于子类时候,要使用属性或者方法,会先在子类对象中搜索,搜索不到在在父类中搜索。比如代码中t.a 如果Test中没有则会在Base中搜索。方法也是 因为t中没有f方法所以直接调用Base对象中的f。

    当对象处于父类对象时候,调用其方法,会先从子类中搜所,子类中没有则会在父类中搜所,但是前提是父类中一定要有该方法,子类对象中如果也有该方法(方法重写),则会执行子类对象方法,这个现象也叫多态。至于父类对象中的属性则没有该规律,属性只能属于该父类,或者父类的父类,不可能是子类对象的属性。该代码中this.p就是调用的子类对象方法而不是父类对象中的方法,要是把父类中的p注释掉,则编辑器会报错。另外在代码中多态特性2的代码 则是经常看见的多态表现方式

    结论:
    1 属性和方法,从 ‘当前层’ 向上查找 最先找到先使用(大部分语言继承都这样)
    2 方法 在'当前层' 或‘上层’具有该方法,同时具有‘底层’, 从‘底层’查找,使用‘底层‘方法 (多态)

    Base{
    public void f(){}  //1
    }
    Sub1 extends Base{
    
    }
    Sub2 extends Sub1{
    public void f(){} //2
    }
    

    Sub1 s2 = new Sub2()s2.f 会执行2处方法 规律2 多态
    Sub1 s1 = new Sub1() s1.f 会执行1处方法 规律1

    相关文章

      网友评论

          本文标题:java中的this

          本文链接:https://www.haomeiwen.com/subject/ikfirqtx.html