修饰方法或成员变量
类 类写法 方法写法 权限 本类 本包子类 本包非子类 包外子类 非子类的外包类 remark 普通类 public class xxx { *** } public void xxx(){ *** } public 是 是 是 是 是 普通类 public class xxx { *** } protected void xxx(){ *** } protected 是 是 是 是 not allowed不能被包外非子类调用 普通类 public class xxx { *** } void xxx(){ *** } package private 是 是 是 not allowednot allowedpackage private包内私有 普通类 public class xxx { *** } private void xxx(){ *** } private 是 not allowednot allowednot allowednot allowed接口类 public interface xxx { *** } public void xxx(); public 是 是 是 是 是 接口类 public interface xxx { *** } protected void xxx();not allowednot allowednot allowednot allowednot allowednot allowed接口类 public interface xxx { *** } void xxx(); public 是 是 是 是 是 接口方法不写权限其实就是public,这点与普通类不同 接口类 public interface xxx { *** } defalut void xxx(){ *** } public 是 是 是 是 是 只有接口类才能使用default关键字. JDK 1.8以后的默认实现方法 接口类 public interface xxx { *** } private void xxx();not allowednot allowednot allowednot allowednot allowednot allowed抽象类 public abstract class xxx { *** } public abstract void xxx(); public 是 是 是 是 是 抽象类 public abstract class xxx { *** } protected abstract void xxx(); protected 是 是 是 是 not allowed这里指的是实现类,在被包外类调用时,不能调用该方法。
而不是不能被包外类继承实现抽象类 public abstract class xxx { *** } abstract void readDataAbs();not allowednot allowednot allowednot allowednot allowednot allowed抽象类 public abstract class xxx { *** } private abstract void xxx();not allowednot allowednot allowednot allowednot allowednot allowed
以上所讲的本包类和外包类,指的是类所在的最小文件夹路径是否相同,而不是指当前项目包。
总结:
普通类: public、protected、默认不写(package private)、private 四种修饰符,修饰的都是被调用权限。
接口类:public、默认不写(但这里的默认不写也是public)、default,其实也就public和default两种修饰符。JDK 1.8之前其实只有public一种。default是JDK 1.8后添加的修饰符,修饰符修饰的方法实指的是现类可以现它,也可以不实现它。不实现它,被调用时就是调用它接口中默认的实现。但是public的接口必须被实现。default只能在接口中使用。
抽象类:public、protected两种修饰符。其中protected指的是实现类,在被包外类调用时,不能调用该方法。而不是不能被包外类继承实现。
接口类和抽象类都不能自己new自己,必须new实现类。
接口与抽象类的区别?
1. 抽象类可以有普通成员变量, 接口没有普通成员变量
2. 抽象类和接口都可有静态成员变量, 抽象类中静态成员变量访问类型任意,接口只能public static final(默认)
3. 一个子类只能继承一个抽象类, 但能实现多个接口
4. 抽象类可以有构造方法, 接口没有构造方法
5. 抽象类可以有静态方法;接口在JDK8之前不能有静态方法,在JDK8中可以有静态方法。且只能被接口/抽象类直接调用,但不能被接口或抽象类的实现类的对象调用。
6. 抽象类可以没有抽象方法, 抽象类可以有普通方法;接口在JDK8之前都是抽象方法,在JDK8可以有default方法,在JDK9中允许有私有普通方法
7. 抽象类中的方法可以是public、protected; 接口方法在JDK8之前只有public abstract,在JDK8可以有default方法,在JDK9中允许有private方法