Java中類和介面的一些概念
阿新 • • 發佈:2018-12-26
類和介面分別有哪些:
常規內部類,靜態內部類,區域性內部類,匿名內部類,抽象類,介面。
內部類的一些好處:
1.解決多繼承
2.解決繼承和實現介面時候方法名相同引起的衝突情況(使用內部類可以間接實現多繼承,可以解決實現的多個介面之間,或繼承的類與介面之間方法同名的衝突)
3.實現資料隱藏(非內部類是不允許使用private 與protected來修飾類的,但內部類可以。且內部類為private的時候,通過外部類提供方法來訪問內部類)
4.內部類擁有外圍類的所有元素的訪問許可權
普通內部類
1.不能有靜態屬性和方法2.內部類可以使用外部類的所有屬性和方法
3.外部類不能直接使用內部類的屬性和方法,使用前必須先例項化
例項:
public class Example { private String name ="exampleName"; public void ExampleMethod(){ String innerStr = new ExampleInner().innerStr;//在外部類中呼叫內部類屬性 System.out.println("ExampleMethod->ExampleInner.innerStr = " + innerStr); new ExampleInner().ExampleInnerMethod();//在外部類中直接呼叫屬性 } public class ExampleInner { private String innerStr = "exampleInnerStr"; public void ExampleInnerMethod(){ System.out.println("ExampleInnerMethod-> Example.name:" + name); } } public static void main(String[] args) { new Example().ExampleMethod();//外部類呼叫本類方法輸出呼叫內部類的方法及屬性的內容 new Example().new ExampleInner().ExampleInnerMethod();//外部類和內部類例項化後呼叫內部類方法 String s = new Example().new ExampleInner().innerStr;//外部類和內部類例項化後呼叫內部類屬性 System.out.println("s = " + s); } }
靜態內部類
1.可以包含靜態方法和屬性2.不需要再例項化外部類 StaticOutter.StaticInner in = new StaticOutter.StaticInner();
3.和靜態方法不一樣的是,靜態內部類中可以定義靜態的也可以定義非靜態的成員
例項:
public class Example { private String name ="exampleName"; private static String name_1 = "name_1"; public static void ExampleMethod(){ System.out.println("ExampleMethod"); } /** * 可以把靜態內部類當成一個外部類的靜態成員 */ public static class ExampleInner { private String name ="exampleInnerName"; protected String innerStr = "innerStr"; protected static String staticInnerStr = "staticInnerStr"; public static void ExampleInnerMethod(){ //外部類的靜態方法,不能呼叫非靜態方法 ExampleMethod(); //靜態內部類呼叫外部內的屬性及常量必須為static System.out.println("ExampleInnerMethod-> Example.name_1:" + name_1); } public void method(){ System.out.println("method"); } } public static void main(String[] args) { //呼叫內部類的靜態方法;方法和屬性可直接通過innerClass.方法/屬性呼叫 Example.ExampleInner.ExampleInnerMethod(); //呼叫內部類的靜態屬性 String staticInnerStr = Example.ExampleInner.staticInnerStr; System.out.println("staticInnerStr = " + staticInnerStr); //呼叫內部類的非靜態屬性;同包名下使用 new Example.ExampleInner().innerStr;操作 String innerStr = new ExampleInner().innerStr; System.out.println("innerStr = " + innerStr); //內部類非靜態方法必須要例項化才能呼叫 new Example.ExampleInner().method(); } }
區域性內部類(外部類的方法中的內部類;實際開發中不常用)
可以把區域性內部類當作外部類方法中的一個區域性變數1.不能有訪問修飾符(public,protected,private,static等)
2.區域性內部類在方法中,靜態和非靜態都可以
2.可以訪問方法中的區域性變數和類中的所有屬性、方法3.與區域性變數不一樣的是,區域性內部類只能訪問 final 修飾的區域性變數(也即只能訪問常量)
4.區域性內部類中不可定義靜態變數(不管外部類的方法是不是靜態的)
例項:
public class Example {
private String name="exampleName";
public void ExampleMethod(final String methodName){
String exampleMthodStr="exampleMthodStr";
final String exampleMthodStr_1="exampleMthodStr_1";
final String name="ExampleMethod-->>name";
class ExampleInner{
String innerStr="innerStr";
//static String innerStr_1="innerStr_1"; //區域性內部類不能有靜態屬性和方法
public ExampleInner(String methodName) {
ExampleMethod();//外部類方法
System.out.println(name);//外部類屬性
System.out.println(methodName);//構造方法引數
System.out.println("ExampleInner :" + innerStr);//區域性內部類屬性
System.out.println("exampleMthodStr_1 :" + exampleMthodStr_1);//區域性內部類訪問區域性變數
System.out.println("Example :" + Example.this.name);//外部內部類屬性
System.out.println("name :" + name);//區域性內部類訪問區域性變數
//System.out.println(exampleMthodStr);//錯誤,只能訪問由final修飾的區域性變數
}
public static void (){
}
}
System.out.println("ExampleMethod");
new ExampleInner(methodName);//初始化區域性內部類的構造方法
}
/**
* 外部類普通方法
*/
public void ExampleMethod(){
System.out.println("example-->>");
}
public static void main(String[] args) {
new Example().ExampleMethod("main");
}
}
匿名內部類(回撥方法,沒有類名的內部類,相對簡單,例項就不再贅述了)
1.子類中只有一個無參構造器
2.必須例項化
抽象類(以abstract宣告的類)
好處:複用規範: 只要一個類中包含一個抽象方法,這個類一定是抽線類
抽象類中不一定包含抽象方法
抽象類可以繼承抽象類,所有抽象方法方法由第一個非抽象子類實現
抽象方法不能宣告為private或者final方法
不能抽象屬性
介面:interface:
好處:抽象
解決java多繼承
介面不是類,是對一組要求的描述
100%抽象
所有方法均為抽象方法
所有方法預設為abstract方法,所以可以不用將方法標記為abstract
所有變數預設為static final變數
implements:實現介面
class A implements Interface介面繼承介面,介面可以實現多繼承
interface B
interface C
interface A extends B, C