JAVA菜鸟入门篇 - super、this关键字 (十五)

一、super关键字

    super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。

    java中super关键字的两种用法:

    1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位.

<span style="font-size:18px;">/**
 * 测试super第一种用法:子类的构造函数引用super
 * @author dell
 *
 */
 class Animal {
	
	public void run(){
		System.out.println("跑跑!");
	}
	
}

class Bird  extends Animal {
	public void run(){   //实现对父类run()方法的重写
		super.run();
		System.out.println("我是一个鸟");
	}
	
	public Bird(){
		super();
		System.out.println("建一个鸟对象");
	}
	
}

public class TestAnimal {

	public static void main(String[] args) {

			Bird bird = new Bird();
			bird.run();
	}

}</span>

显示结果:

建一个鸟对象
跑跑!
我是一个小小小小鸟,飞呀飞不高

总结:

构造方法中: 任何类的构造函数中,如是构造函数的第一行代码没有显式的调用super(...),那么Java默认都会调用super(),作为父类的初始化函数。

    2.在Java中,有时还会遇到子类中的成员变量或方法与父类(有时也称父类)中的成员变量或方法同名。因为子类中的成员变量或方法名优先级高,所以子类中的同名成员变量或方法就隐藏了父类的成员变量或方法,但是我们如果想要使用父类中的这个成员变量或方法,就需要用到super. 

      调用父类方法、属性,在普通方法中调用父类的属性或方法时,没有顺序限制,可以随便调用。
      当super用于引用父类中的属性或方法时,使用下面的格式:
                           super.属性
                           super.方法()

<span style="font-size:18px;">/**
 * 测试类中super.方法 super.属性的调用
 * @author Dell
 *
 */

class Country{
	String name;
	void value(){
		name = "中国";
	}
}

class City extends Country{
	String name;
	
	void value(){
		name = "安庆";
		super.value();
		System.out.println(name);
		System.out.println(super.name);
	}
}

public class TestSuper2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		City city = new City();
		city.value();
	}
}
</span>

显示结果:

安庆
中国

    注意:在这个时候,父类的属性或方法必须是那些protected(受保护)或者public(公共)等可以让子类访问的属性或者方法。
                super用于调用父类的方法主要用于在子类中定义了和父类中同名的属性、或进行了方法的覆盖,而又要子类中访问父类中的同名属性或覆盖前的方法的时候。


继承关系之间内存在分配存在是一种包裹的结构。比如上面示例的内存分配图,用OneNote描图为:



二、super与this关键字的使用总结 

    1. super关键字

    super关键字的作用是用于子类引用父类的成员,如属性、方法或者构造器。

      1.1 调用父类构造器

    用于调用父类的构造器,这是super的用法之一,它的基本格式是:
                           super([arg_list]);
    直接用super()加上父类构造器所需要的参数,就可以调用父类的构造器了。如果父类中有多个构造器,系统将自动根据super()中参数个数和参数类型来匹配父类中的构造器。
    需要注意的是如果子类中没有显示地调用父类中无参数的构造器,也没有在构造器中调用重载的其它构造器,则系统将会默认调用父类中无参数的构造器。此时如果父类中没有无参的构造器,则编译将会出错。

      1.2 调用父类方法、属性

      当super用于引用父类中的属性或方法时,使用下面的格式:
                           super.属性
                           super.方法()
    注意,在这个时候,父类的属性或方法必须是那些protected(受保护)或者public(公共)等可以让子类访问的属性或者方法。
     super用于调用父类的方法主要用于在子类中定义了和父类中同名的属性、或进行了方法的覆盖,而又要子类中访问父类中的同名属性或覆盖前的方法的时候。

    2. this关键字

      2.1 使用this来区分当前对象

    Java中为解决变量的命名冲突和不确定性问题,引入关键字“this”代表其所在方法的当前对象:
    super与this关键字的使用 构造器中指该构造器所创建的新对象;
    super与this关键字的使用 方法中指调用该方法的对象;
    super与this关键字的使用在类本身的方法或构造器中引用该类的实例变量和方法。
    this只能用在构造器或者方法中,用于获得调用当前的构造器、方法的对象引用。可以和任何的对象引用一样来处理这个this对象。

      2.2 在构造器中使用this来调用对象本身的其他构造器

      当我们给一个重载构造器的时候,可能在一个构造器中的一段代码和另一个构造器完全一样,那么,就可以在这个构造器中直接调用另一个构造器,这样可以避免编写相同的代码。在构造器中使用下面的方式可以调用对象本身的其他的构造器,语法如下:
                          this([arg_list]);
      直接用this()加上类构造器所需要的参数,就可以调用类本身的其它构造器了。如果类中有多个其它构造器定义,系统将自动根据this()中的参数个数和参数类型来找出类中相匹配的构造器。

   
注意: 在构造器中可以通过this()方式来调用其它的构造器,但在一个构造器中最多只能调用一次其它的构造器。并且,对其它构造器的调用动作必须在构造器的起始处,否则编译的时候将会出现错误。另外,不能在构造器以外的地方以这种方式调用构造器。

本文参考:http://blog.sina.com.cn/s/blog_4e16c5a901000aji.html

                             http://blog.sina.com.cn/s/blog_4938c3090100a2v5.html


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值