作用域
| 当前类 | 同一package | 子孙类
| 其他package |
public | √
| √
| √
| √
|
protected
| √
| √
| √
| ×
|
default | √
| √
| ×
| × |
private | √
| ×
| ×
| ×
|
关于overload与override的区别:
overload是重载,意思是
我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。
方法重载支持多态性,因为它是Java 实现“一个接口,多个方法”范型的一种方式。要理解这一点,考虑下面这段话:在不支持方法重载的语言中,每个方法必须有一个惟一的名字。但是,你经常希望实现数据类型不同但本质上相同的方法。 1)使用重载时必须使用不同的参数样式
2)
对于继承来说,如果某一方法在父类中是访问权限是private,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。 override是重写(比如说对接口的重写,继承中子类重写父类的方法)。
1)覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果; 2)覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3)覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4)被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
关于抽象类(abstract)
所有的对象都是通过类来描述的,然而,所有的类不一定是通过对象来描述清楚,因此不能描述的这些类定义为抽象类 。
抽象类与接口紧密相关。然接口又比抽象类更抽象,这主要体现在它们的差别上:1)类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。2)抽象类当中可以存在非抽象的方法,可接口不能且它里面的方法只是一个声名必须用public来修饰没有具体实现的方法。3)抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量(static final)。4)这一点也是最重要的一点本质的一点"抽象类是对象的抽象,然接口是一种行为规范"。
package core_java;
abstract class Ch{
public abstract void doSome();
}
class A extends Ch{
public void doSome(){
System.out.println("a");
}
}
class B extends Ch{
public void doSome(){
System.out.println("b");
}
}
public class TestAbstract {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Ch aa = new A();
Ch bb = new B();
A aaa = new A();
B bbb = new B();
aa.doSome();
bb.doSome();
aaa.doSome();
bbb.doSome();
doSomething(aa);
doSomething(bb);
doSomething(aaa);
doSomething(bbb);
}
public static void doSomething(Ch a){
a.doSome();
}
}