Java中对类以及类中的成员变量和成员方法通过访问控制符(access specifier)进行区分控制。刚学Java语言的同学可能对public private protected以及默认(一般称包访问权限)的区别不是很清楚,尤其是protected和默认的区别。
1、private就是只有在本类中才能访问。
2、public在任何地方都能访问。
3、protected是在本包内能访问,而在包外只有它的子类能访问。
4、默认(什么都不加)和protected一样,只要是同一个包下的类,不管是子类还是其它普通的类,都可以访问。在另一个包中的类,如果是普通类,和protected一样,是不能访问。在另一个包中的类,即使是子类,也是不能访问。
重载和覆盖
1、重载(overload):对于类的方法(包括从父类中继承的方法),方法名相同,参数列表(参数的类型,参数的个数,参数的顺序。)不同的方法之间就构成了重载关系。看方法之间是否是重载关系,不用管方法的修饰符和返回类型以及抛出的异常,只看方法名和参数列表。
2、覆盖(override):也叫重写,就是在当父类中的某些方法不能满足要求时,子类中改写父类的方法。当父类中的方法被覆盖了后,除非用super关键字,否则就无法再调用父类中的方法了。
发生覆盖的条件:
1、“三同一不低” 子类和父类的方法名称,参数列表,返回类型必须完全相同,而且子类方法的访问修饰符的权限不能比父类低。
2、子类方法不能抛出比父类方法更多的异常。即子类方法所抛出的异常必须和父类方法所抛出的异常一致,或者是其子类,或者什么也不抛出;
3、被覆盖的方法不能是final类型的。因为final修饰的方法是无法覆盖的。
4、被覆盖的方法不能为private。否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
5、被覆盖的方法不能为static。所以如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误。反之亦然。即使父类和子类中的方法都是静态的,并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
this和super