介面概述: 1、介面是Java語言中的一種引用類型,是方法的"集合",所以介面的內部主要就是定義方法,包含常量,抽象方法(JDK 7及以前),額外增加預設方法和靜態方法(JDK 8),額外增加私有方法(jdk9)。 介面的定義,它與定義類方式相似,但是使用 interface 關鍵字。它也會被編譯成 ...
介面概述:
1、介面是Java語言中的一種引用類型,是方法的"集合",所以介面的內部主要就是定義方法,包含常量,抽象方法(JDK 7及以前),額外增加預設方法和靜態方法(JDK 8),額外增加私有方法(jdk9)。
介面的定義,它與定義類方式相似,但是使用 interface 關鍵字。它也會被編譯成.class文件,但一定要明確它並不是類,而是另外一種引用數據類型。
public class 類名.java–>.class
public interface 介面名.java–>.class
介面的使用,它不能創建對象,但是可以被實現(implements ,類似於被繼承)。一個實現介面的類(可以看做是介面的子類),需要實現介面中所有的抽象方法,創建該類對象,就可以調用方法了,否則它必須是一個抽象類。
2、光理論還是不夠的、在此給大家免費贈送2020最新5大JAVA架構項目實戰教程及大廠面試題庫,有興趣的可以進裙 783802103 獲取,小白勿進哦!
定義格式
public interface 介面名稱 {
// 常量
// 抽象方法
// 預設方法(jdk8)
// 靜態方法(jdk8)
// 私有方法(jdk9)
}
複製代碼
案例
public interface IA {
// 常量 預設修飾符 public static final 這三個修飾符可以省略
public static final int NUM1 = 10;
int NUM2 = 20;
// 抽象方法 預設修飾符 public abstract 這2個修飾符可以省略
public abstract void method1();
void method2();
// 預設方法 預設修飾符 public default public修飾符可以省略,default不可以省略
public default void method3(){
System.out.println("預設方法 method3");
}
default void method4(){
System.out.println("預設方法 method4");
}
// 靜態方法: public static修飾 static修飾符不可以省略 public可以省略
public static void method5(){
System.out.println("靜態方法 method5");
}
// 私有靜態方法 使用private static修飾 不可以省略
private static void method6(){
System.out.println("私有靜態方法 method6");
}
// 私有非靜態方法 使用private修飾
private void method7(){
System.out.println("私有靜態方法 method7");
}
}
public class Test {
public static void main(String[] args) {
System.out.println(IA.NUM1);// 10
}
// 類中的預設方法,使用預設許可權修飾符(空)
void method(){
}
}
複製代碼
介面中成員的訪問特點
介面中成員訪問特點概述
介面中成員的訪問特點:
介面中的常量: 主要是供介面直接使用
介面中的抽象方法: 供實現類重寫的
介面中的預設方法: 供實現類繼承的(實現類中可以直接調用,實現類對象也可以直接調用)
介面中的靜態方法: 只供介面直接調用,實現類繼承不了
介面中的私有方法: 只能在介面中直接調用,實現類繼承不了
複製代碼
案例演示
public interface IA {
// 介面中的常量: 主要是供介面直接使用
public static final int NUM = 10;
// 介面中的抽象方法: 供實現類重寫的
public abstract void method1();
// 介面中的預設方法: 供實現類繼承使用(實現類中可以直接調用,實現類對象也可以直接調用)
public default void method2(){
System.out.println("預設方法method2");
method4();
method5();
}
// 介面中的靜態方法: 只供介面直接調用,實現類繼承不了
public static void method3(){
System.out.println("靜態方法method3");
method5();
}
// 介面中的私有方法: 只能在介面中直接調用,實現類繼承不了
private void method4(){// 只能在介面的預設方法中調用
// 方法體
method5();
}
private static void method5(){//
// 方法體
}
}
實現類:
public class ImpA implements IA{
/* @Override
public void method2() {
}*/
@Override
public void method1() {
System.out.println("重寫介面中的method1抽象方法");
}
}
測試類:
public class Test {
public static void main(String[] args) {
System.out.println(IA.NUM);// 10
// 創建實現類對象,訪問NUM常量
ImpA ia = new ImpA();
System.out.println(ia.NUM);// 10
// 調用method2方法
ia.method2();
// 通過介面名調用介面中的靜態方法
IA.method3();
//ia.method3();// 編譯報錯,
}
}
複製代碼
多實現時的幾種衝突情況
公有靜態常量的衝突: 多個父介面中,相同的常量不能被繼承 - 公有抽象方法的衝突: 實現類必須重寫一次 公有預設方法的衝突: 實現類必須重寫 公有靜態方法的衝突: 無影響,因為靜態方法實現類不能繼承 私有方法的衝突: 無影響,因為私有方法只能在本介面中直接訪問,實現類不能繼承 實現類重寫介面中的預設方法,不需要加default
公有靜態常量的衝突
實現類不繼承衝突的變數
interface IA{
public static final int a = 10;
public static final int b= 20;
}
interface IB{
public static final int a = 30;
}
class Zi implements IA,IB{
//只繼承了b,沒有繼承a,因為a衝突了
}
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
// System.out.println(z.a);//編譯錯誤
System.out.println(z.b);
}
}
複製代碼
公有抽象方法的衝突
實現類只需要重寫一個
interface IA{
public void show();
}
interface IB{
public void show();
}
class Zi implements IA,IB{
@Override
public void show() {//子類只需要重寫一個show()即可
System.out.println("子類的show()...");
}
}
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
複製代碼
公有預設方法的衝突
實現類必須重寫一次最終版本
interface IA{
public default void show(){
System.out.println("IA");
}
}
interface IB{
public default void show(){
System.out.println("IB");
}
}
class Zi implements IA,IB{
@Override
public void show() {//必須重寫一次的show()
System.out.println("Zi的show()....");
}
}
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
複製代碼
公有靜態方法的衝突
靜態方法是直接屬於介面的,不能被繼承,所以不存在衝突
interface IA{
public static void show(){
System.out.println("IA");
}
}
interface IB{
public static void show(){
System.out.println("IB");
}
}
class Zi implements IA,IB{
}
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();//編譯錯誤,show()不能被繼承。
}
}
複製代碼
私有方法的衝突
私有方法只能在本介面中直接使用,不存在衝突
介面和介面的關係
介面可以“繼承”自另一個“介面”,而且可以“多繼承”
interface IA{}
interface IB{}
interface IC extends IA,IB{//是“繼承”,而且可以“多繼承”
}
複製代碼
介面繼承介面的衝突情況
公有靜態常量的衝突: 不能被繼承,使用不了 公有抽象方法的衝突: 只繼承一個 公有預設方法的衝突: 必須重寫一次 公有靜態方法和私有方法的衝突 : 無影響,因為不能被子介面繼承
公有靜態常量的衝突
interface IA{
public static final int a = 10;
public static final int b = 30;
}
interface IB{
public static final int a = 20;
}
interface IC extends IA,IB{//沒有繼承a
}
//測試:
main(){
System.out.println(IC.a);//錯誤的
}
複製代碼
公有抽象方法衝突
interface IA{
public void show();
}
interface IB{
public void show();
}
interface IC extends IA,IB{//IC只繼承了一個show()
}
class Zi implements IC{
//重寫一次show()
public void show(){
}
}
複製代碼
公有預設方法的衝突
interface IA{
public default void d1(){
}
}
interface IB{
public default void d1(){
}
}
interface IC extends IA,IB{//必須重寫一次d1()
public default void d1(){
}
}
複製代碼
公有靜態方法和私有方法
不衝突,因為靜態方法是直接屬於介面的,只能使用介面直接訪問,而私有方法只能在介面中訪問,也沒有衝突 實現類繼承父類又實現介面時的衝突
定義格式
public class 實現類名 extends 父類名 implements 介面名1,介面名2,...{ }
複製代碼
實現類繼承父類又實現介面時的衝突:
公有靜態常量的衝突–>沒有繼承 公有抽象方法的衝突—>重寫 公有預設方法的衝突—>優先父類 公有靜態方法---->優先父類 私有方法的衝突—> 沒有衝突
父類和介面的公有靜態常量的衝突
class Fu{
public static final int a = 10;
}
interface IA{
public static final int a = 20;
}
class Zi extends Fu implements IA{//沒有繼承a變數
}
public class Demo {
public static void main(String[] args) {
System.out.println(Zi.a);//編譯錯誤
}
}
複製代碼
父類和介面的抽象方法衝突
abstract class Fu{
public abstract void show();
}
interface IA{
public void show();
}
class Zi extends Fu implements IA{// 必須重寫
}
//測試:
main(){
Zi z = new Zi();
z.show();//a
}
複製代碼
父類和介面的公有預設方法的衝突
class Fu{
public void show(){
System.out.println("a");
}
}
interface IA{
public default void show(){
System.out.println("b");
}
}
class Zi extends Fu implements IA{
}
//測試:
main(){
Zi z = new Zi();
z.show();//a
}
複製代碼
父類和介面的公有靜態方法
class Fu{
public static void show(){
System.out.println("fu...");
}
}
interface IA{
public static void show(){
System.out.println("IA...");
}
}
class Zi extends Fu implements IA{//只繼承了"父類"的靜態方法,沒有繼承介面的靜態方法
}
public class Demo {
public static void main(String[] args) {
Zi.show();//fu…
}
}
複製代碼
父類和介面的私有方法
不存在衝突
最後
大家看完有什麼不懂的可以找我。另外給大家免費贈送2020最新5大JAVA架構項目實戰教程及大廠面試題庫,有興趣的可以進裙 783802103 獲取,小白勿進哦!
本文的文字及圖片來源於網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理