2 czh500 czh500 于 2018.03.14 00:51 提问

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

在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个回答

tanfan520
tanfan520   2018.03.14 02:13

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

qq_36043945
qq_36043945   2018.03.14 03:00

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

yc_sun163
yc_sun163   2018.03.14 07:48

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

baiduwuhen
baiduwuhen   2018.03.14 08:54

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

qetang
qetang   2018.03.14 09:02

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

SmallNancy
SmallNancy   2018.03.14 09:10

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

sung506896158
sung506896158   2018.03.14 09:09

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

u011350557
u011350557   2018.03.14 09:28

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

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

baidu_30233079
baidu_30233079   2018.03.14 09: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);  
}  

}

baidu_30233079
baidu_30233079 java单独搞了这样一个关键字确实能把人搞糊涂,C++里面不管是调用父类方法还是其它类静态方法都是类名+方法,ClassName::method(),这样很直观不容易混
6 个月之前 回复
czh500
czh500 回复baidu_30233079: super.test();这行代码,让我想起了方法的调用必须是对象名.方法名,当然啦,静态方法是类名.方法名,所以我就理所当然的认为super.test();这行代码的super是一个对象,而且是父对象。因为调用方法是通过对象名打点,对象名点方法名!
6 个月之前 回复
czh500
czh500 回复baidu_30233079: 嗯,对对对,谢谢您的指点迷津!3Q!
6 个月之前 回复
baidu_30233079
baidu_30233079 你把两个东西混在一起纠结了,this是对象,super是类,这里先区分了后面的就好理解了
6 个月之前 回复
czh500
czh500 回复baidu_30233079: 哈哈,Father中的test()方法中有this关键字,而super.test();这行代码,我之所以疑惑是因为我们都知道,this表示当前对象,谁调用Father类的test()方法,那Father类的test()方法中的this就指代的是谁,所以我想搞清楚super.test();这行代码中的super这个关键字指代的是哪个对象,到底是指代的是父对象还是子对象,如果指代父对象,那么Father类中的test()方法中的this就是指父对象,如果指代子对象,那么Father类中的test()方法中的this就是指子对象,所以我一开始就是在这里纠结,所以我就想复杂了,哎!还是谢谢大家的踊跃发言,把我心中的纠结和疑惑打开,多谢各位啦!
6 个月之前 回复
czh500
czh500 回复baidu_30233079: 哈哈,谢谢啦,您的这2次回答言简意赅,看了之后如醍醐灌顶,一下子就豁然开朗了,哈哈,谢谢啦,看来是我自己想的太复杂了,想把super底层是怎么处理的弄明白,结果把自己绕晕了,其实有时候也没必要钻牛角尖,容易把自己搞的身心俱疲
6 个月之前 回复
czh500
czh500 还有一个要说一下,super.test();这行代码,我们都知道在java中,要使用或者说要调用方法,必须是对象名.方法名进行调用,当然啦,静态方法可以使用类名.方法名调用,那么请问,super.test();这行代码,super这个关键字这里是指父对象还是仅仅是告诉编译器调用Father父类的test方法呢,如果是调用父类的test方法,那么super关键字仅仅只是指定要调用父类的方法,严格来说它不是一个对象,只是一个关键字用来指定调用父类方法,super关键字说白了就是,父类和子类中都有这个test()同名的方法,super只是为了区分到底是调父类中的test()方法还是调子类中的test()方法,仅此而已吗?
6 个月之前 回复
baidu_30233079
baidu_30233079 super代表的是类,不是对象,super.test()可以理解为Father.test(),类似调用其它类的静态方法,只是对于有继承关系的子类可以调用父类的非静态方法
6 个月之前 回复
baidu_30233079
baidu_30233079 super告诉编译器调用父类的方法而已,和对象无关
6 个月之前 回复
czh500
czh500 谢谢,首先对象和类我搞得很清楚,我知道什么是类,什么是对象,我这里的疑惑就是,super这个关键字到底是指的是父对象还是父类呢?比如super.test();这行代码,意思是调用父类的test方法,那这里的super关键字的意思仅仅是告诉系统,调用Father类的test方法而已,还是此时super指的是一个Father父类中具体的一个父类对象呢,只是这个父类对象是隐藏的,匿名的父类对象?请问您怎么理解?谢谢,不吝赐教!
6 个月之前 回复
liuxiaofeng8758
liuxiaofeng8758   2018.03.14 09:51

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

共21条数据 1 3 尾页
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
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("我是父...
Super关键字和调用父类构造器
一、子类不会获得父类的构造器,但子类构造器里可以调用父类构造器初始化代码。 1.1 在一个构造器中调用另一个重载的构造器,使用this调用来完成。如下代码段:public class Component { private String name; private int age; public Component(String name) { thi
Super 关键字在子类构造方法和普通方法中的应用
1.构造方法中的应用:   在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来。     当你new一个子类对象的时候,必须首先要new一个父类的对象出来,这个父类对象位于子类对象的内部,所以说,子类对象比父类对象大,子类对象里面包含了一个父类的对象,这是内存中真实的情况.构造方法是new一个对象的时候,必须要调的方法,这是规定,要ne
super关键字调用父类构造方法
直接上代码 public class Card { String title; Card() { title = "新年快乐"; } Card(String s) { title = s; } public String GetTitle() { return title; } } public class Christmas extends Ca
使用父类方法一定要用super吗(写给新人)
今天,在群里有人问(估计是新手)。答案,不一定。只有当子类重写了父类的方法时,如果需要用到父类的方法时,才要用super,表明这个方法时父类的方法不是子类的方法。不理解?上代码: Father类 public class Father { public String str = "父类变量"; public String strOnly = "父类变量,子类没有同名变量";
JAVA基础再回首(六)——父与子的继承、super关键字、方法重写、方法重载
JAVA基础再回首(六)——父与子的继承、super关键字、方法重写、方法重载 不墨迹,才是时间管理的最大利器,学无止境。 继承 首先我们来学习继承的概述多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。 通过extends关键字可以实现类与类的继承 格式:class 子类名 extends 父类名 {} 单独的这个类称
Java中this和super关键字的区别
this强调的是对象的本身,通过this调用的属性和方法都是它所属于的那个类中的属性和方法。属于对象和类间的关系 super在子类中调用父类的方法和属性。属于子类和父类两个类间的关系//父类 public abstract class AbstractPerson { int age; public AbstractPerson(int age) { //调用本类中
子类调用父类方法(super关键字)
package testextends; public class Pad3 extends Computer3{ //子类:平板电脑 String sayhello(){ //重写父类方法‘打招呼’ return super.sayHello()+ "ipad";//调用父类方法并添加字符串 } public static void main(Strin...
面向对象三大特征,super关键字,以及父类引用指向子类对象。访问权限的大小。
一.封装,反射的时候在详细补充。 二.继承 补充:子类的访问权限一定要大于等于父类。 访问权限的优先级顺序:public(在哪里都可以访问)>protected(保护的意思,子类可以访问,但是子类的权限要大于父类的权限,这是首要条件,否者子类依旧访问不到) >默认(就是什么都不写的意思,只能在同一个包下被访问)>private(只能在同一个类下被访问)。 补充:super关键字的含义:s
JAVA super关键字以及 构造方法
1、调用父类的构造方法:super(), or super(parameters); 注:不像属性和方法,父类的构造方法是不被子类继承的,只能从子类的构造方法中用super关键字来调用。 2、super必须放在构造方法的第一行。   3、构造方法可以调用重载的构造方法(使用this关键字)或他的父类的构造方法(使用super关键字),如果没有被显式的调用,编译器会自动把super()作为构