权限解析
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");后面就会报错。
如果父类没有默认的无参构造方法,比如把第一个构造方法注释掉,那么此时只能够显式的调用构造方法,否则报错。
因为任何类都需要调用父类的构造方法。