一个子类要调用父类的方法时,默认是使用this还是super?

原创 2012年03月26日 23:18:00

因为子类已经继承了父类的所有方法,子类也未去重写这些方法,这些方法实际上已经属于子类,那么使用时,如果我们不写this或super,类也不报错;使用this或super也正确。那我们什么也不写的那种情况到底默认是哪个?

看看下面的代码

package com.java.three;

public class Father {
	
	public void printTheInfomationOfThisMan(){
		System.out.println(this.toString());
	}
	
	public String name="父亲name";
	public int age=55;
	public String sex="男";
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	@Override
	public String toString() {
		return "Father [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}

}


 

package com.java.three;

public class Son extends Father{

	
	public String ambution;

	public String getAmbution() {
		return ambution;
	}
	//使用this给变量赋值
	public void setAmbution(String ambution) {
		this.ambution = ambution;
	}
	
	
	
	//使用super给变量赋值
	public void superSetInfoToSon(String name,int age){
		super.setName(name);
		super.setAge(age);
	}
	
	//使用this给变量赋值
	public void thisSetInfoToSon(String name,int age){
		this.setName(name);
		this.setAge(age);
	}
	
	//这是我们要研究的重点,看看这种方式到底改变的是this的变量还是super的变量
	//不适用this,也不使用super,给变量赋值
	public void setInfoToSonWithoutNeither(String name,int age){
		name=name;
		age=age;
	}
	
	
	
	
	public void printTheInfomationOfSon(){
		System.out.println(this.toStringOfSon());
	}
	public void printTheInfomationOfFather(){
		System.out.println(this.toStringOfFather());
	}

	//注意下面关键字this的使用
	public String toStringOfSon() {
		return "Son [ambution=" + this.ambution + ", name=" + this.name + ", age=" + this.age
				+ ", sex=" + this.sex + "]";
	}
	//注意下面关键字super的使用
	public String toStringOfFather() {
		return "Son [ambution=" + ambution + ", name=" + super.name + ", age=" + super.age
				+ ", sex=" + super.sex + "]";
	}

}


 

package com.java.three;

public class Testmain {
	
	public static void main(String ssd[]){
//		Father ff=new Father();
//		ff.setName("父亲");
//		ff.setAge(55);
//		ff.printTheInfomationOfThisMan();
		
		Son ss=new Son();
		
		System.out.println("----------------this--start-----------------------");
		ss.thisSetInfoToSon("给儿子命名this", 26);////使用this给变量赋值
		ss.setAmbution("亿万富翁");//子类自己的方法
		//ss.printTheInfomationOfThisMan();//继承父类的方法
		
		ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this
		ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super
		System.out.println("----------------this--end-----------------------");
		
		
		System.out.println("----------------super--start-----------------------");
		ss.superSetInfoToSon("给儿子命名super", 25);//使用super给变量赋值
		ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this
		ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super
		
		System.out.println("----------------super--end-----------------------");
		System.out.println("");
		System.out.println("----------------注意!!!-----------------------");
		System.out.println("----------------neither--start-----------------------");
		
		//注意下面我们设置的信息是("给儿子命名neither", 18)
		ss.setInfoToSonWithoutNeither("给儿子命名neither", 18);//不适用this,也不使用super,给变量赋值
		ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this
		ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super
		System.out.println("----------------neither--end-----------------------");
	}

}


控制台打印:

----------------this--start-----------------------
Son [ambution=亿万富翁, name=给儿子命名this, age=26, sex=男]
Son [ambution=亿万富翁, name=给儿子命名this, age=26, sex=男]
----------------this--end-----------------------
----------------super--start-----------------------
Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]
Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]
----------------super--end-----------------------

----------------注意!!!-----------------------
----------------neither--start-----------------------
Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]
Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]
----------------neither--end-----------------------

 

结论:子类继承的变量就是自己的,无论用this,或是用super都一样。

还有一个问题我没看明白,希望高手解答:
我们预想应该输出的("给儿子命名neither", 18)这个信息无论用this取,还是用super取,都取不出来!

不知为什么,欢迎技术大牛给我留言。

 

 

 

 

 

 

子类的对象调用父类的方法

class Fruit { String color = "未确定颜色"; //定义一个方法,该方法返回调用该方法的实例 public Fruit getThis() { return t...
  • yu265096
  • yu265096
  • 2015年04月20日 21:13
  • 2054

JAVA基础 -从父类的引用如何调用子类中独有的方法

首先放上源文件 父类  Animal.java package com.imooc; public class Animal {     public void eat(){   ...
  • qq_35809245
  • qq_35809245
  • 2016年08月15日 21:32
  • 11137

关于Java中子类调用父类方法

当一个类继承于另一个类,子类中没有父类的方法时。用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找。 当一个方法只在父类中定义时,调用该方法时会使用父类中的属性。 如...
  • twilight_karl
  • twilight_karl
  • 2016年12月06日 22:07
  • 13407

重写方法,调用父类方法时机

重写方法,调用父类方法时机
  • bawcwchen
  • bawcwchen
  • 2015年11月28日 13:16
  • 609

Java的重写与调用父类方法问题

一. Java重写父类方法 class Father{ public void tostring() { System.out.println("Hello!"); } } class S...
  • ZSGG_ACM
  • ZSGG_ACM
  • 2015年11月18日 10:41
  • 4122

python子类调用父类的方法-super

转载;http://www.crazyant.net/1303.html python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法。...
  • yugongpeng_blog
  • yugongpeng_blog
  • 2015年07月08日 18:08
  • 1444

重写父类方法、super关键字、调用父类构造器——Java

注:本文参考《疯狂Java讲义》一书 重写父类方法 super 限定 子类调用父类构造器 重写父类方法子类扩展了父类,子类是一个特殊的父类。大部分时候,子类总是以父类为基础,额外增加新的成员变量和方法...
  • qq_22073849
  • qq_22073849
  • 2017年05月04日 14:01
  • 908

Java继承,子类默认在构造函数中用super()调用父类构造函数

1.子类继承父类的方法属性,并重写父类的方法,子类修饰符不能比父类方法的修饰符的范围狭窄。 Protect 与 默认 区别: protected :成员 本类和子类可以访问。【其他类不可以使用(即使...
  • yingtian648
  • yingtian648
  • 2016年06月02日 08:54
  • 3632

Java继承,子类默认在构造函数中用super()调用父类构造函数

1.子类继承父类的方法属性,并重写父类的方法,子类修饰符不能比父类方法的修饰符的范围狭窄。 Protect 与 默认 区别: protected :成员 本类和子类可以访问。【其他类不可以使用(即使...
  • yingtian648
  • yingtian648
  • 2016年06月02日 08:54
  • 3632

Super 关键字在子类构造方法和普通方法中的应用

1.构造方法中的应用:   在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来。     当你new一个子类对象的时候,必须首先要new一...
  • Soundair
  • Soundair
  • 2015年04月22日 15:27
  • 2299
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个子类要调用父类的方法时,默认是使用this还是super?
举报原因:
原因补充:

(最多只允许输入30个字)