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的,解释下原因和你们对这里的理解!

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

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

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

首先告诉你答案:此时的this代表父类对象。
原因:this代表当前对象,换言之,谁调用我,我就代表谁。
我表示:this关键字
第一个谁:谁调用的?super.test()调用的!
第二个谁:this就代表父类对象执行test方法。
此时super就表示调用父类中的方法,而在父类方法中,this就代表父类对象。
^_^

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

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

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

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

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

你的输出结果应该是:
我是父类的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);  
}  

}

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

希望对你有所帮助

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();  
}  

}

求采纳啊

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

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

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

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

我们拓展一下,看下面的代码?我们把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();
}

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

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

子对象 我的理解如下:

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

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

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

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

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就是自己,在哪都是自己。注意创建子类对象时,会把前面的所有父类都创建一个对象,他们都是相互独立的。

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

this就是指的当前对象;
你当前在执行father类中的函数,this就是指father类;
你当前在执行son类中的函数,this就是指son类;

谁调用的方法,this就代表谁,正常实参如果想要赋值的话,就必须new对象,然后对象.name , this就是为了代表这个对象,省去了你在方法里在重新写一遍对象的构造

调用的父类的属性

this表示当前对象实例,也包含从父类继承的属性。
super是父类。

this点 就是调用自己的成员变量
this() 调用自己的空参构造方法
this(有参) 就是调用自己的有参构造

super就是调用父类的

super 存在的意义 就是为了 Java 语言 “继承”特点的落实。
继承 就是为了提高资源利用率,从类的加载过程中看,子类要想加载,还是得先加载父类,所以我们假想,每个子类对象中 都包含着一个父类对象,
但 事实上,并没有两个对象,而是 涉及到一个对象转换,,我们都知道 Integer 和 int 的包装与转换, 其实 在子父类这儿 也可以这样理解。

题中 只有一个对象,就是 Son对象, 调用 super.test() 也是Son对象 执行的, 而进入父类方法中之后的 this,其实代表的还是 Son对象,this 只是代表 当前对象,谁跑进来了 谁就是 this。

你可以把this当作指向new Son()的指针,即没有new Son()的时候 this是不存在的。

img

由上图可以看出,this并非类所包含的属性,即非实例方法是不可以使用this的。

从字节码角度来看

int addTwo(int i, int j) {
    return i + j;
}

编译后为

Method int addTwo(int,int)
0   iload_1        // Push value of local variable 1 (i)  此处iload入栈位置为1,因为第0个局部变量用来存储该实例方法所在对象的引用即this
1   iload_2        // Push value of local variable 2 (j)
2   iadd           // Add; leave int result on operand stack
3   ireturn        // Return int result

类方法

static int addTwoStatic(int i, int j) {
    return i + j;
}

编译后如下

Method int addTwoStatic(int,int)
0   iload_0  //  此时iload入栈位置为0,而不是1,因为他不属于实例方法,所以第0个局部变量不是this
1   iload_1
2   iadd
3   ireturn

详情见:

super代表父类,super关键字调用父类的属性和方法
this代表自己当前类,调用自己的属性和方法

当你调用父类方法时,进入父类对象,this也代表的父类实例

this:谁来调用我,我就代表谁

this关键字代表的当前类对象,题中所问的this代表的是Son对象

分别在打印出son和super和this的class字节码你能发现都指的是son,super虽然指的是父类,但这里只是引用父类的方法实现,本身还是自身初始化的test方法,实际上son的test方法就成了类似
public void test() {
f_test();
System.out.println("我是子类的test()方法");
System.out.println("子类姓名=" + this.name + " 子类年龄=" + this.age);
}
f_test(){
System.out.println("我是父类的test()方法");
System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);
}
只是表达自己的观点,并不确认这就一定是对的

结论:在子类中使用super调用父类实例方法,被调用方法入栈后,局部变量表中this将指向子类实例对象。即:super调用后,内部this指向子类实例。
如果你不小心,在子类中声明了和父类中同名的实例变量,可能问题变得更具有迷惑性。
注意:父子类中存在隐藏问题。(例如:父子类中都声明了实例属性user。在子类中使用this.user,这时这个user是子类自己定义的;在父类中即使this指向子类实例对象,但是此时this.user,这个user是从父类继承的属性。也就是说父类的同名变量在子类中被隐藏了,无法简单访问到,但是在父类中却是可见的,不过子类自身定义的同名属性在父类中被隐藏,无法简单访问)。

super 指的是父类对象 this指的是当前类对象

说一点 java是面向对象 得语言 ,所以提供了 封装 继承 和多态的特性, 如果父类和子类有相同的名称和参数的方法,new子类对象按照多态的特性 是重写 ,父类是不应该执行该方法的哈,而你又像调用和执行父类的相同方法 那怎么办,java提供了super关键字,就可以调用执行;要不然按照继承的特性,你用什么super 和this呀 直接使用方法不是挺好的么,这里还有一点 对于private 子类 就算用super也没法访问哈。 从这上面去理解他

super是父类——类
this是当前实例(对象)——对象

super是代表调用父类的方法,this是当前实例,也就是当前对象
super.test()调用的this,所以this就代表父类对象执行test方法。
此时super就表示调用父类中的方法,而在父类方法中,this就代表父类对象。

this是指当前的类,super是调用父类!比如说你在子类当中要用到负累饿的时候,就用 super.名称就可以调用到了

this表示当前对象本身,super表示父级对象,创建了一个子类继承了父类,super.test()调用的就是父类中的方法,那么你创建一个子类对象,并赋值,首先会去找子类的方法,而子类中又有super指向父类,那么就会先去找父类的方法,等父类的方法执行完才会执行子类的方法

调用supper的时候 this是被包含在父类里面的

先进去son的test方法里面分析,首先就是super调用自己的test方法。进去了super方法里面再找调用这个方法的对象,那就是super, 就是父对象啊

试了一下,无论是this还是super,调用时都是指的son对象,你可以在子父类方法中把this打印出来就知道是啥了

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

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