慕容囧囧
2018-03-13 16:51
采纳率: 25%
浏览 2.5k
已采纳

java中调用父类方法之super关键字的疑惑?

在java中有super和this这2个关键字,我有时候对super有一些疑惑,我甚至认为我对super和this这2个关键字还没理解!大家请看下面的代码,帮我解惑一些呗!谢谢
package com.jiongmeng;

class Father {  

    String name;  
    int age;  

    public void test() {  
        System.out.println("我是父类的test()方法");  
        System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);  
    }  

}  

public class Son extends Father {  

    public void test() {  
        /** 
         在Son类的test()方法中的super.test();这行代码的意思是调用父类的test()方法,我对这行代码有点疑 
         惑,super代表父对象,那么很明显,就是去调用Father类中的test()方法,那么此时,在执 
         行到Father类中的test()方 
         法中的System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);这行代码的时候,这 
         行代码中的this表示的是父对象还是子对象(我们都知道this表示的是当前对象,我就想知 
         道此时this表示的当前对象到底是父类对象还是子类对象),知道的人请帮忙解答下?谢谢! 
         */  
        super.test();  
        System.out.println("我是子类的test()方法");  
        System.out.println("子类姓名=" + this.name + " 子类年龄=" + this.age);  
    }  

    public static void main(String[] args) {  
        Son son = new Son();  
        son.name = "杨过";  
        son.age = 12;  
        son.test();  
    }  

}  

    在Son类的test()方法中的super.test();这行代码的意思是调用父类的test()方法,我对这行代码有点疑惑,super代表父对象,那么很明显,就是去调用Father类中的test()方法,那么此时,在执行到Father类中的test()方法中的System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);这行代码的时候,这行代码中的this表示的是父对象还是子对象(我们都知道this表示的是当前对象,我就想知道此时this表示的当前对象到底是父类对象还是子类对象),知道的人请帮忙解答下?谢谢!说一下你们是怎么理解这里的super和this的,解释下原因和你们对这里的理解!
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

21条回答 默认 最新

  • 忧郁的大脚 2018-03-14 01:28
    已采纳

    两个层面的东西:
    super是父类——类
    this是当前实例(对象)——对象

    当调用this的时候,当前有且仅有一个对象,这个对象的name、age等属性也只有一个值,不分子类、父类。

    点赞 打赏 评论
  • tanfan520 2018-03-13 18:13

    学再多理论知识也需要实践。你把代码跑一下就知道结果了

    点赞 打赏 评论
  • qq_36043945 2018-03-13 19:00

    super可调用父类方法 this调用当前类方法

    点赞 打赏 评论
  • yc_sun163 2018-03-13 23:48

    个人理解,Fahter中的this肯定指的是Father类的对象,this可以省略。

    点赞 打赏 评论
  • 白衣胜雪1 2018-03-14 00:54

    this代表的都是当前类对象。这段代码中明细表示的是父类类对象,能通过跟代码的自己跟代码解决

    点赞 打赏 评论
  • qetang 2018-03-14 01:02

    Father类中this就是Father类对象,Son类中this就是Son类对象

    点赞 打赏 评论
  • sung506896158 2018-03-14 01:09

    this关键字,无疑指的是当前对象;
    super关键字,是指调用父类的方法,或者可继承的成员变量等;
    再有就是,代码都在这儿摆着了,看不明白的话跑一下就明了了。
    day day up!

    点赞 打赏 评论
  • SmallNancy 2018-03-14 01:10

    super 是直接父类对象的引用是一个隐式参数。通常在构造方法里面,第一句话总是super();如果你在构造方法里面第一句不写这句话,编译器会帮你默认添加,这句话。所以无论怎样,构造器里的第一句话还是super();
    this也是隐式参数,调用当前类方法。类的方法调用时,系统自动传递一个this的参数给方法。this主要在对象初始化里用的比较多,也是在构造函数里用的多。希望有用。

    点赞 打赏 评论
  • baidu_30233079 2018-03-14 01:31

    你的输出结果应该是:
    我是父类的test()方法
    父类姓名=杨过 父类年龄=12
    我是子类的test()方法
    子类姓名=杨过 子类年龄=12

    首先题主没有搞清楚对象是什么!
    对象是实例化后的类,也就是说是一个具体变量。那么this就好理解了,针对你的对象son,不管父类的this还是子类的this都是son。
    super只是指定要调用父类的方法,严格来说它不是一个对象,只是一个关键字用来指定调用父类方法,其作用类似C++中的Father::test()。
    你的这个例子用C++写如下:
    class Father {

    String name;  
    int age;  
    
    public void test() {  
       printf("我是父类的test()方法\n");  
        printf("父类姓名=%s  父类年龄=%d\n", this.name , this.age);  
    }  
    

    }
    class Son:public Father {

    public void test() { 
    
            Father::test();
       printf("我是子类的test()方法\n");  
        printf("子类姓名=%s  子类年龄=%d\n", this.name , this.age);  
    }  
    

    }

    点赞 打赏 评论
  • blacksonny 2018-03-14 01:50

    super表示要使用父类的方法,比如可以调用父类构造方法、调用父类一般方法、父类的属性
    this 表示的当前对象
    就你所列出的代码来说 this 的解释要看你的对象,正如如下的代码,你的的对象是 son,那么执行了 super.test() 时, this 被识别为 son
    Son son = new Son();
    son.name = "杨过";
    son.age = 12;
    son.test();

    希望对你有所帮助

    点赞 打赏 评论
  • liuxiaofeng8758 2018-03-14 01:51

    个人认为,this关键字代表当前对象

    点赞 打赏 评论
  • vvvvip用户 2018-03-14 01:52

    package b;

    class Father {

    String name="小龙女"; 
    int age=11;  
    

    /*这里给name,age赋上值就简单明了了,如果调用super.test()后,这里的this代表当前类,那么输出的就是小龙女,11,

    • 但是实际输出的还是杨过,12.所以那里调用父类的test,对应的this属于调用父类tset方法的那个类*/ public void test() {
      System.out.println("我是父类的test()方法");
      System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);
      }

    }

    public class Son extends Father {

    public void test() {   
        super.test();
        /*这里调用super.test(),父类中的this就是代表当前类Son的,所以还是输出杨过,12*/
        System.out.println("我是子类的test()方法");  
        System.out.println("子类姓名=" + this.name + " 子类年龄=" + this.age);  
    }  
    
    public static void main(String[] args) {  
        Son son = new Son();  
        son.name = "杨过";  
        son.age = 12;  
        son.test();  
    }  
    

    }

    求采纳啊

    点赞 打赏 评论
  • hanker_i 2018-03-14 01:54

    子类的name和age 属性继承自父类,本身是没有这两个属性的 此时的this.name 指向的是父类,赋值时自然给父类赋值。你在子类中加上name和age属性,这时候this.age则指向的是自身。

    点赞 打赏 评论
  • itxiaobaishu 2018-03-14 02:01

    this代表当前类的实例对象,可以调用当前类所有的属性和方法。
    super代表所继承的类的对象,也就是父类的对象,可以调用父类的属性和方法。

    点赞 打赏 评论
  • u011051948 2018-03-14 02:19

    this始终指当期实例对象,注意是已经实例化的对象,子类实例化时并没有实例化父类,所以指代的还是子类的对象; super用于调用父类的方法,不是一个对象而是一个特殊关键字吧,个人理解

    点赞 打赏 评论
  • begin--- 2018-03-14 02:42

    当调用父类的test()方法的时候this.name和this.age就被赋值为“杨过”和12了,你下面输出的this.name和this.age跟上面的一样

    点赞 打赏 评论
  • 慕容囧囧 2018-03-14 02:54

    我们拓展一下,看下面的代码?我们把Father类中的成员属性或者叫成员变量吧,把name和age这2个成员变量都赋上值,看看最终会打印什么?
    class Father {

    String name = "小龙女";
    int age = 16;
    
    public void test() {
        System.out.println("我是父类的test()方法");
        System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);
    }
    

    }

    public class Son extends Father {

    //public String address = "江西省赣州市于都县";
    
    public void test() {
        /**
         * 在Son类的test()方法中的super.test();这行代码的意思是调用父类的test()方法,我对这行代码有点疑
         * 惑,super代表父对象,那么很明显,就是去调用Father类中的test()方法,那么此时,在执
         * 行到Father类中的test()方
         * 法中的System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);这行代码的时候,这
         * 行代码中的this表示的是父对象还是子对象(我们都知道this表示的是当前对象,我就想知
         * 道此时this表示的当前对象到底是父类对象还是子类对象),知道的人请帮忙解答下?谢谢!
         * 
         */
        super.test();
        System.out.println("我是子类的test()方法");
        System.out.println("子类姓名=" + this.name + " 子类年龄=" + this.age);
    }
    
    public static void main(String[] args) {
        Son son = new Son();
        son.name = "杨过";
        son.age = 12;
        son.test();
    }
    

    }
    大家猜下打印的结果会是什么?

    点赞 打赏 评论
  • 风雪夜归人_ppf 2018-03-14 03:02

    Father类中this就是Father类对象,问本类的name

    点赞 打赏 评论
  • 人工智能没我火 2018-03-14 05:07

    子对象 我的理解如下:

    你用Son类的对象(son) 去调用Son.test()方法 this所代表的就是当前对象son

    但在Son的test 方法中 你用的是super调用Father.test(); 本来这个this应该指的是调用这个Father.test();的father类对象 但是变成了super

    super不能当做当前对象 所以只能向上传 用this 指向调用super.test()的这个对象 就还是son

    总的来说就是 super 没能力 ,this 不能指向他 就找之前的对象 这样理解起来应该比较容易

    点赞 打赏 评论
  • 自强不惜 2018-03-14 08:56

    public class F {
    public int i = 1;

    public void foo() {
        System.out.println(this.i);
    }
    

    }

    class S extends F {
    public int i = 2;

    @Override
    public void foo() {
        super.foo();
        System.out.println(this.i);
    }
    
    public static void main(String[] args) {
        S s = new S();
        s.foo();
    }
    

    }
    运行完这段代码,都不需要解释了。this就是自己,在哪都是自己。注意创建子类对象时,会把前面的所有父类都创建一个对象,他们都是相互独立的。

    点赞 打赏 评论
  • 小冤家一号 2018-03-14 12:38

    你可以在father这种的test方法中输出this,结果显示的是son的地址值,

    点赞 打赏 评论

相关推荐 更多相似问题