真是不了解不知道,一看吓一跳类型。【接口可以定义私有private方法了,你知道吗?】
接口只可以定义以下类型方法:
interface AbstractAndInterface {
private void pa2() { } //私有
private static void pa4(){} //私有静态
default void da2() { } //默认
public abstract void pua1(); //public抽象方法
public static void pua4() { } //public静态方法
//变量
public int m4 = 0; // public
public static int m5 = 0; // static
public static final int m6 = 0; //变量没有变,默认是public static final 修饰
}
抽象类只可以定义以下类型方法和变量:
abstract class clazz{
private void pa2() { } //私有
private static void pa4(){} //私有静态
protected abstract void pra1();
protected void pra2() { }
protected static void pra4() { }
public abstract void pua1();
public void pua2() { }
public static void pua4() { } // 静态方法
//变量 不可以使用default,其他没有限制
int m0 = 0;
private int m1 = 0;
protected int m3 = 0;
public static final int m6 = 0;
}
总结一下:
接口:
变量 :
public static final(默认) 方法:
public abstrace(默认 公共方法的修饰)
还可以有其他方法:
私有方法;私有静态方法;默认方法;公共方法
;公共静态方法
抽象类:
变量 :
public(默认)【默认只使用public 修饰】 方法: 抽象方法必须是
protected级别及以上(默认
protected)
附测试代码,可以拷贝自己试一下
public abstract class AbstractClass {
/************************** private *****************************/
/* 修饰符 abstract' 和'private' 的组合非法 */
private abstract void pa1();
private void pa2() { } //私有
/* 此处不允许使用修饰符 'final' */
private void final pa3(){}
private static void pa4(){} //私有静态
/************************** default *****************************/
/* 修饰符 abstract' 和'default' 的组合非法 */
default abstract void da1();
/* 扩展方法只能在接口中使用 */
default void da2() { } //默认
/* 方法声明无效;需要返回类型 */
default void final da3(){}
/* 修饰符 static' 和'default' 的组合非法 */
default static void da4() { }
/************************** protected *****************************/
protected abstract void pra1();
protected void pra2() { }
/* 方法声明无效;需要返回类型 */
protected void final pra3(){}
protected static void pra4() { }
/************************** public *****************************/
public abstract void pua1();
public void pua2() { }
/* 方法声明无效;需要返回类型 */
public void final pua3(){}
public static void pua4() { } // 静态方法
/************************** 变量 *****************************/
/************************** 变量 *****************************/
private int m1 = 0;
/* 此处不允许使用修饰符 'default */
default int m2 = 0;
int mm =0;
protected int m3 = 0;
public int m4 = 0; // public
public static int m5 = 0;
public static final int m6 = 0;
final int m7 = 0;
}
public interface AbstractAndInterface {
/************************** private *****************************/
/* 修饰符 abstract' 和'private' 的组合非法 */
private abstract void pa1();
private void pa2() { } //私有
/* 此处不允许使用修饰符 'final' */
private void final pa3(){}
private static void pa4(){} //私有静态
/************************** default *****************************/
/* 修饰符 abstract' 和'default' 的组合非法 */
default abstract void da1();
default void da2() { } //默认
/* 此处不允许使用修饰符 'final' */
default void final da3(){}
/* 修饰符 static' 和'default' 的组合非法 */
default static void da4() { }
/************************** protected *****************************/
/* 此处不允许使用修饰符 'protected' */
protected abstract void pra1();
/* 此处不允许使用修饰符 'protected' */
protected void pra2() { }
/* 此处不允许使用修饰符 'final' */
protected void final pra3(){}
/* 此处不允许使用修饰符 'protected' */
protected static void pra4() { }
/************************** public *****************************/
public abstract void pua1(); //抽象方法
/* 接口抽象方法不能有本体 */
public void pua2() { }
/* 此处不允许使用修饰符 'final' */
public void final pua3(){}
public static void pua4() { } // 静态方法
/************************** 变量 *****************************/
/************************** 变量 *****************************/
/* 此处不允许使用修饰符 'private */
private int m1 = 0;
/* 此处不允许使用修饰符 'default */
default int m2 = 0;
/* 此处不允许使用修饰符 'protected */
protected int m3 = 0;
public int m4 = 0; // public
public static int m5 = 0;
public static final int m6 = 0;
}
测试抽象类的变量为protected级别,就得需要建立两个包,一个放抽象类及其实现类,一个放访问类。改变抽象类的变量级别,改变访问类是否继承抽象实现类,查看在访问类能否调用到变量。
1.在JDK7或更早版本中,接口里面只能有常量变量和抽象方法。这些接口方法必须由选择实现接口的类实现。 2. JDK8的时候接口可以有默认方法和静态方法功能。 3. JDK9在接口中引入了私有方法和私有静态方法。