黑马程序员——Java基础---this和super关键字

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


一.this关键字

每当一个对象创建后,Java虚拟机会给这个对象分配一个引用自身的指针,这个指针的名字就是 this。因此,this只能在类中的非静 态方法中使用,静态方法和静态的代码块中绝对不能出现this的用法。成员方法是可以访问成员属性的,对于一个类中的"成员属性",是 每个对象都拥有一份独立存储空间,对于"成员方法",是所有对象共享一个"方法空间";

需要注意的是:
1.this是一个隐式的变量;任何类都有的;
2.this是在实例化此类对象时,会被赋值成当前对象的地址;
3.一般情况下,this 是Java内部隐式使用的。
4.有些时候我们需要必须显示的使用:局部变量覆盖成员变量时,如果要访问成员变量,可以使用:this.成员变量名

举例:

<span style="white-space:pre">	</span>class Student
<span style="white-space:pre">	</span>{<span style="white-space:pre">	</span>
	String stuName;
	int num;
	void show(){
		int num = 1;
		num = 10;
		System.out.println("大家好,我叫:" + stuName);
		System.out.println("num = " + num);//局部变量覆盖成员变量。默认使用"就近原则",访问的是局部变量的num。
		System.out.println("this.num = " + this.num);
		System.out.println("this.stuName = " + this.stuName);//访问的就是被覆盖的成员变量;
	<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>class Test1 
<span style="white-space:pre">	</span>{
	public static void main(String[] args) 
	{
		Student stu = new Student();
		stu.show();//大家好,我叫:null
		stu.stuName = "张三";
		stu.show();//大家好,我叫:张三

		Student stu2 = new Student();
		stu2.stuName = "李四";
		stu2.show();
	}
}
运行结果:



二.super关键字

在子类继承父类时,当子类成员变量覆盖父类成员变量时,我们还需要访问父类的成员变量时用super才能访问;子类构造函数调用父类构造函数时用super()调用,在子类中的构造方法,默认情况下会在第一行自动添加一句:super();该语句调用父类的无参的构造方法;.super始终是指向父类的空间,通过super可以访问父类的成员

举例:

<span style="white-space:pre">	</span>class A{
		A(int a){
		}
	}
	class B extends A{
		B(int n){
		super(n);
		}
	}
注意事项:
1.如果父类没有无参的构造方法,那么子类的构造方法中,就必须使用super()去显示的去调用父类的某个带参的构造方法;
2.在子类的构造方法中调用父类的构造方法使用super().这里也要求super()必须是这个构造方法的第一句话;
3.在子类的构造方法中,不能即使用this()又使用super();因为都需要在第一句话;

举例:

<span style="white-space:pre">	</span>class A{
	int num = 10;	
	A(int b){
		System.out.println("a2");
	}
	A(String a){
	System.out.println(a);
	}
	void fun(){
		System.out.println("父类的fun()方法");
	}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>class B extends A
<span style="white-space:pre">	</span>{	
	B(int n){
		super(n);//调用了父类的带一个int参数的构造方法;
		System.out.println("a3");
	
	}
	B(String a ){
		super(a);
	}
	int num = 20;
	void show(){
		System.out.println("num = " + super.num);//父类的num
		super.fun();//父类的fun()方法
	}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>class Demo 
<span style="white-space:pre">	</span>{
	public static void main(String[] args) 
	{
		B b1=new B(1);
		b1.show();
		B b=new B("aaaaa");
	}
<span style="white-space:pre">	</span>}
运行结果:

三.this和super的区别

1.this: 1)始终指向当前对象的引用,
2)访问当前对象的成员属性、成员方法、构造方法;
3)查找是从当前类中查找,如果没有,向父类查找;
4)必须使用this的场景:
(1).局部变量覆盖成员变量:使用this去访问成员变量
(2).一个构造方法调用另一个构造方法,必须使用this()去调用;必须放在此构造方法的第一句话;
  2.super:1)始终指向父类对象的引用:
    2)访问父类对象的成员属性、成员方法、构造方法;
    3)必须使用super的场景:
(1).子类的成员变量覆盖父类的成员变量,使用super去访问父类的成员变量;
(2).父类没有无参构造方法,子类的构造方法必须显示的使用super()去调用父类带参的构造方法;必须放在此构造方法的第一句话;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值