访问权限和this,super关键字

权限解析

java有四种访问权限,private default protected public。

private:私有的,只有在自己的类中可以访问。

default:就是不加任何修饰符,允许在自己类中访问,也运行同包中访问。

protected:允许在自己类中访问,同包中访问,子类访问。

public:任何情况下都可以访问。

package a;

public class Test1 {
	protected void hello1(){
		System.out.println("hello");
	}
}
package a;

public class Test2 {
	public void hello2(){
		Test1 t1 = new Test1();
		t1.hello1();
	}
}
package b;

import a.Test1;

public class Test3 extends Test1{

	public void hello3(){
		Test1 t1 = new Test1();
		t1.hello1();//错误代码
		
		super.hello1();
		this.hello1();
		Test3 t3 = new Test3();
		t3.hello1();
	}
}

 Test1和Test2在同包下,Test3不同包但是是Test1的子类。

如果hello1是default权限,在Test2中的hello2方法的写法是没有问题的,在Test3中就都不可以。

如果hello1如上是protected权限就有不同了。对于Test2来说,同样没有问题。而Test3就有问题,Test3中的t1.hello1();就是错误代码。按道理来说,protected可以在子类中访问啊,不是应该没问题么。

因为是不同包的情况,所以t1.hello1();写法不可以。应该用的是Test3 t3 = new Test3(); t3.hello1();这种形式。或者super.hello1(); this.hello1();

当然,这些代码只能在Test3中使用,如果离开Test3同样不可以。

正是由于这个原因,那么protected常作为需要重写的方法的描述符。

this关键字指的就是当前对象。

super指向的是在子类实例化时创造的父类对象(这个对象与父类自己new出来的有一定区别)。

super相关

package a;

public class Test1 {
	
	public Test1(){
			
	}
	
	public Test1(String s){
		
	}
}
package b;

import a.Test1;

public class Test3 extends Test1{

	public Test3(){
		super("test3");
		System.out.println("test3");
	}
}

 对于任何一个类来说,它默认是有一个构造方法(如果加上了其他构造方法,默认的就消失了),而构造方法当中会隐式的调用父类的构造方法。对于Test1来说,会默认调用父类Object的默认无参构造方法。Test2会默认调用Test1的默认无参方法。

当然可以显式的调用,比如super("test3");,不过显式调用父类构造方法必须要放在构造方法的第一行,如果放在System.out.println("test3");后面就会报错。

如果父类没有默认的无参构造方法,比如把第一个构造方法注释掉,那么此时只能够显式的调用构造方法,否则报错。

因为任何类都需要调用父类的构造方法。

 
原文地址:https://www.cnblogs.com/tp123/p/6406576.html