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

21个回答

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

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

0

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

1

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

1

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

0

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

0

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

0

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

0

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

0

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

}

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

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

0
共21条数据 1 3 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的。是时候展现真正的技术了!
其他相关推荐
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.构造方法中的应用:   在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来。     当你new一个子类对象的时候,必须首先要new一个父类的对象出来,这个父类对象位于子类对象的内部,所以说,子类对象比父类对象大,子类对象里面包含了一个父类的对象,这是内存中真实的情况.构造方法是new一个对象的时候,必须要调的方法,这是规定,要ne
Super关键字和调用父类构造器
一、子类不会获得父类的构造器,但子类构造器里可以调用父类构造器初始化代码。 1.1 在一个构造器中调用另一个重载的构造器,使用this调用来完成。如下代码段:public class Component { private String name; private int age; public Component(String name) { thi
子类调用父类方法(super关键字)
package testextends; public class Pad3 extends Computer3{ //子类:平板电脑 String sayhello(){ //重写父类方法‘打招呼’ return super.sayHello()+ "ipad";//调用父类方法并添加字符串 } public static void main(Strin...
super关键字调用父类构造方法
直接上代码 public class Card { String title; Card() { title = "新年快乐"; } Card(String s) { title = s; } public String GetTitle() { return title; } } public class Christmas extends Ca
重写父类方法、super关键字、调用父类构造器——Java
注:本文参考《疯狂Java讲义》一书 重写父类方法 super 限定 子类调用父类构造器 重写父类方法子类扩展了父类,子类是一个特殊的父类。大部分时候,子类总是以父类为基础,额外增加新的成员变量和方法。但有一种情况例外:子类需要重写父类的方法。例如鸟类都包含了飞翔方法,其中有一种鸟是特殊鸟类——鸵鸟,因此它也会从鸟类获得飞翔方法,但这个飞翔方法明显不适合鸵鸟,所以,鸵鸟需要重写鸟类的方法。我们先看下
通过super调用父类属性和方法
class Person{ String name; int age; //父类的构造方法 public Person() { } public String talk() { return "i am:"+this.name+", i am "+ this.age +"years old"; }} class Student e
牛客网Java错题知识点
1. 子类调用父类方法 子类要调用继承自父类的方法,必须使用super关键字。————(错误) 子类可以直接调用父类未重写(Override)的方法 子类可以new一个父类对象再调用父类方法 子类构造器默认调用父类构造器super() 2. J2EE请求方法 J2EE中,当把来自客户机的HTTP请求委托给servlet时,会调用HttpServlet的(service...
子类重写父类的方法,用super调用父类中的原方法
public class Java10_1 extends Student { public void meth() { System.out.println("我是子类"); super.meth(); } public Java10_1() { } public static void main(String args[]) { Java10_1 j
JAVA基础再回首(六)——父与子的继承、super关键字、方法重写、方法重载
JAVA基础再回首(六)——父与子的继承、super关键字、方法重写、方法重载 不墨迹,才是时间管理的最大利器,学无止境。 继承 首先我们来学习继承的概述多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。 通过extends关键字可以实现类与类的继承 格式:class 子类名 extends 父类名 {} 单独的这个类称
JAVA super关键字以及 构造方法
1、调用父类的构造方法:super(), or super(parameters); 注:不像属性和方法,父类的构造方法是不被子类继承的,只能从子类的构造方法中用super关键字来调用。 2、super必须放在构造方法的第一行。   3、构造方法可以调用重载的构造方法(使用this关键字)或他的父类的构造方法(使用super关键字),如果没有被显式的调用,编译器会自动把super()作为构
继承(包括super关键字)
一.继承的语法和基本概念 1.语法格式:class Person { public Person() { } }class Man extends Person { public Man() { } }2.类Man继承于Person类,这样一来的话,Person类称为父类(基类),Man类称为子类(派生类)。3.如果两个类存在继承关系,则子类会自动继承父类的方法和变量,
从JVM内存机制理解 java 的继承 重写 多态  构造 以及this关键字和super关键字
  Java的对象是在堆空间中分配一块内存空间,对于继承来说,子类拥有父类所有权限范围内的属性和方法,但是实质上子类在分配空间时,其内存中已经分配了父类所有方法和属性的内存,包括了private在内。在内存上 子类的内存分配如下图 可以看作  子类的内存空间=父类的内存空间 +子类自己独特的内存空间   然后来看一下this关键字和super关键字 this 关键字依靠对象而存在,...
Day 12 继承,super关键字,重写
1:继承extends 在代码中继承使用的关键字是extends,如果一个类通过extends关键字继承了其他类,那么就可以说,当前类是其他类的子类,或者其他类是当前类父类   1. 在创建子类对象的时候,会首先自动调用父类的构造方法这里是为了初始化属于父类的成员变量。有其父必有其子 2. 父类中的【非私有化】成员变量,子类可以通过继承之后得到使用的权限 3. 父类中的【非私有化】成员方法,子类可...
深入理解Java中super关键字
Java中关键字 super表示的真正对象     java中的super,大家都知道是表示一个父类的引用。上次群里见到一个网友询问 super.getClass().getName()的输出问题,大部分都知道输出的是当前这个类的类名。而不是父类的名称。关于这个问题的解释很多,基本都是说getClass()是一个final方法,说这个方法都是调用超父类Object的方法。这个解释很好,也容易
JAVA final 、super 关键字以及继承关系中父类与子类实例变量初始化的 理解
1,final 修饰符修饰变量、方法、类 时有什么作用? ①final 修饰变量:该变量被赋初值后,不能对它重新赋值 ②final 修饰方法:此方法不能重写,即父类中某方法被final修饰,在子类中将不能定义一个与父类final 方法同名且有相同方法标识符(参数个数也相同,返回值类型相同)的方法 ③final 修饰类:此类不能再派生子类 ④final 修饰的实例变量在使用前必须显示地初始化
JAVA继承练习——重写父类方法与super关键字之银行利息编程例题
//bank.java--父类 public class bank{ int savedMoney; int year; double interest; double interestRate=0.29; public double computerInterest(){ interest=year*interestRate*savedMoney; return interest; } publ...
Java super关键字详解
一.super关键字作用 1:主要存在于子类方法中,用于指向子类对象中父类对象。 2:访问父类的属性 3:访问父类的函数 4:访问父类的构造函数 二.super注意的地方 this和super很像,this指向的是当前对象的调用,super指向的是当前调用对象的父类。类加载完毕,创建对象,父类的构造方法会被调用(默认自动无参),然后执行子类相应构造创建了一个子类对象,该子类对象
Java中this和super关键字的区别
this强调的是对象的本身,通过this调用的属性和方法都是它所属于的那个类中的属性和方法。属于对象和类间的关系 super在子类中调用父类的方法和属性。属于子类和父类两个类间的关系//父类 public abstract class AbstractPerson { int age; public AbstractPerson(int age) { //调用本类中
this 和super 关键字的区别
属性的区别:this访问本类中的属性,如果本类没有此属性则从父类中继续查找。super访问父类中的属性。 方法的区别:this访问本类中的方法,如果本类没有此方法则从父类中继续查找。super访问父类中的方法。 构造的区别:this调用本类构造,必须放在构造方法的首行。super调用父类构造,必须放在子类构造方法首行。 其他区别:this表示当前对象。super不能表示当前对象 1、this
super关键字和函数覆盖(Override)
4.3 super关键字(1)super:代表的是父类,用法和this相似。可以使用super调用父类中构造方法,成员变量与成员方法。例如:super.age=10;其中age是父类中的变量。 (2)this代表本类对象的引用,即父类的内存空间的标识,super代表父类所属的空间。 (3)当子父类出现同名成员时,可以用super进行区分。 (4)子类要调用父类构造函数时,可以使用super语句
多重继承-super使继承变得更清楚
多重继承的注意点,以及“下一个”的引用 详解super() 函数在多重继承中的作用 # 多重继承 # 多重继承的重复调用问题 class BaseClass: num_base_calls = 0 def call_me(self): print("Calling method on BaseClass") self.num_base_cal...
9.Java语言继承和抽象类,this关键字、super关键字
继承 子类和父类,把共同的属性和行为写到一个类中(父类),然后让具有该种共同属性和行为的类(子类)继承父类,从而 获得和父类相同的属性和行为(这些属性和行为不能是父类私有的,也就不能是private修饰的)。继承提高了代码的复用 性 继承的方式: 应先定义一个父类,然后子类想继承父类需要用关键词 extends来继承, 格式:class A{}     class B extend...
【Java 5班第2次考试】
Java 5班第2次考试 一、选择题(每题1分 共15分) 1、关于继承的说法正确的是( A ) A)子类将继承父类所有的属性和方法 B)子类将继承父类的非私有属性和方法 C)子类只继承父类public方法和属性 D)子类只继承父类的方法,而不继承属性   2、重写与重载的关系是( A ) A)重写只有发生在父类与子类之间,而重载可以发生在同一个类中 B)重写方法可以不同名,而
Java继承,子类默认在构造函数中用super()调用父类构造函数
1.子类继承父类的方法属性,并重写父类的方法,子类修饰符不能比父类方法的修饰符的范围狭窄。 Protect 与 默认 区别: protected :成员 本类和子类可以访问。【其他类不可以使用(即使同一个包中)】 Frinedly(友好/默认):成员 本类和子类,同包可以访问【其他类可以使用】 继承中的构造方法的执行顺序:父类有构造函数,子类也写构造方法的时候必须显示的调用父类的构造方
java中的继承(子类调用父类构造方法还不懂)
declarations  n. 声明extends  v. 继承继承中注意的问题:1  重写(也叫覆盖,也叫重构):重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型;            重写方法不能使用比被重写方法更严格的访问权限。重写是类与类之间的关系,两者必须是继承关系。重载是方法与方法之间的关系。2  关键字super:    在
this关键字和super关键字分别代表什么
this关键字和super关键字分别代表什么?以及他们各自的使用场景和作用。 1.成员变量和局部变量重名时,可以用this来区分。 2.this可以用在构造函数中,调用其它构造函数(只能定义在构造函数的第一行,因为初始化时必须被先执行)。super可以直接调用父类的属性、方法、构造方法。但在调用构造方法时,两者不能同时使用,因为只要是调用构造方法,就必须放在构造方法的首行。  1.su
Java 中的super关键字
super关键字表示对某个类的父类的引用。一般而言,super有两种通用形式:第一种用来访问被子类的成员隐藏的父类成员;第二种则是可以调用父类的构造函数。接下来说一下两种使用形式的方法和规则。第一种:如子类和父类有同名的成员变量或方法,则父类的成员将会被覆盖,此时可用下面的方式来引用父类的成员:super.<成员变量名> super.<成员方法名>在Java语言中,用过继承...
一个子类要调用父类的方法时,默认是使用this还是super?
因为子类已经继承了父类的所有方法,子类也未去重写这些方法,这些方法实际上已经属于子类,那么使用时,如果我们不写this或super,类也不报错;使用this或super也正确。那我们什么也不写的那种情况到底默认是哪个? 看看下面的代码 package com.java.three; public class Father { public void printTheInfoma
java 中子类如何实现对父类私有域的继承
父类中的公有方法和域(属性),在类继承中将会被子类继承,但是私有的将不能被继承。 那么在继承中子类如何才能继承到父类的私有域呢? 答案是:在子类的构造方法中通过super()方法调用父类的构造方法。 也就是,在构造子类的同时,为子类构造出跟父类相同的域。如此就在子类的对象中
super在对象的内部使用,代表父类对象
1、子类的构造过程中必须调用其父类的构造方法。 2、如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用无参的构造方法。 3、如果显示的调用构造方法,则必须在子类的构造方法的第一行。 4、如果子类构造方法中既没有显示调用父类的构造方法,而父类又没有无参的构造方法,则编译出错。
Java构造函数之调用父类构造函数
子类可以通过super关键字来显式地调用父类的构造函数。 当父类没有提供无参数的构造函数时,子类的构造函数中必须显式的调用父类的构造函数; 如果父类提供了无参数的构造函数,此时子类的构造函数就可以不显式的调用父类的构造函数,默认调用父类的无参构造函数。 package com.bjut.StudyTest; class Person { public Person() { Syste
关于子类构造方法中调用父类构造方法之 super()
笔者之前一直很疑惑:为什么别人的源代码中的类要继承,居然一定要写super,而且必须写在第一行。不然就会报错。刚刚开始还以为是别人的源代码中写了注解还是什么鬼的代码。查过诸多的资料之后发现。请注意正解来了!请注意正解来了!请注意正解来了!这个是Java的规定:子类继承父类,子类的构造方法必须调用super()即父类的构造方法,而且必须放在构造方法的第一行。那么问题又来,为什么我写的类有时候都不用去...
Java super关键字用法
分别介绍了在构造方法和非构造方法中super关键字的四种不同的用法。
super关键字,super关键字和this关键字的区别
super关键字: 使用super可以调用父类的成分:父类的成员变量、父类的方法、父类的构造方法。 注意:使用super关键字和this关键字,均不能用在静态方法中,只能用在普通方法(实例方法)中。 访问属性: 示例: 父类 public class FatherClass{ public int age=18; } 子类 public c
Java如何调用父类的父类的中的方法
1.可以用反射实现 2.可以用虚拟机级别的invokeddynamic实现(基于java1.7版本以及以上才可以) 代码如下: /** * @(#)Text4.java * * * @author * @version 1.00 2016/12/6 */ import java.lang.invoke.MethodHandle; import java.lang.inv
关于Java中子类调用父类方法
当一个类继承于另一个类,子类中没有父类的方法时。用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找。 当一个方法只在父类中定义时,调用该方法时会使用父类中的属性。 如果该方法中又调用了其他方法,那么还是按照之前的顺序,先在子类中查找,再在父类中查找。 package Temp;class A { int x = 6; private int y
Java中父类方法的调用
对于已覆盖的方法来说,例如Child是Parent的子类,而且,Child和Parent都有个toString()方法,也就是说,Child覆盖Parent的toString()方法。如果child要调用Parent的toString()方法,只需要把child强制转换为Parent就可以,也就是(Parent)child.toString(),这样就是调用其父类的toString()方法。如果不
java子类父类方法的调用
TestParent test = TestParent();test.testA();如果子类重写了父类的方法,会调用子类的方法,若未重写则调用父类的方法。package com.test; /** * @author Administrator * @date 2018/6/9 */ public class TestParent { public void testA()...
Java的重写与调用父类方法问题
一. Java重写父类方法 class Father{ public void tostring() { System.out.println("Hello!"); } } class Sun extends Father{ public void tostring(){ System.out.println("xdlove!"); } public void Super_t