国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java 基礎知識十一 抽象類和 接口

2019-11-06 06:40:00
字體:
來源:轉載
供稿:網友

java  基礎知識十一   抽象類和 接口  

1、抽象類

抽象類和接口也是多態的體現方式

抽象類:類中沒有足夠信息描述具體的對象,這樣的類稱為抽象類

抽象類分兩種展現方式 abstract class一種是接口 interface  

2、abstract class 一般描述為抽象類  interface 一般描述為接口

抽象類定義

注意:在抽象類中的方法不一定是抽象方法,但是含有抽象方法的類必須被定義成抽象類 

 

區別和對比:      1.abstract class在 Java 語言中表示的是一種繼承關系,一個類只能使用一次繼承關系。但是,一個類卻可以實現多個interface。      2.在abstract class中可以有自己的數據成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態的不能被修改的數據成員(也就是必須是static final的,    不 過在 interface中一般不定義數據成員),所有的成員方法都是abstract的。3.abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"is-a"關系,interface表示的是"like-a"關系。       4.實現抽象類和接口的類必須實現其中的所有方法。抽象類中可以有非抽象方法。接口中則不能有實現方法。      5.接口中定義的變量默認是public static final型,且必須給其初值,所以實現類中不能重新定義,也不能改變其值。抽象類中的變量默認是 friendly型,其值可以在子類    中 重新定義,也可以重新賦值。 6.接口中的方法默認都是 public,abstract類型的。

3、內部類 內部類就是定義在外部類中的類,類名不與文件名相同,可以是靜態static的,也可以是其他修飾符內部類一旦編譯成功就和外部類成為不同的兩個類,區別為outer.class和outer$inner.class兩類成員內部類:外部類的成員,必須先創建了外部類對象 才能創建成員內部類對象 不可以有static數據和屬性局部內部類:定義在方法和作用域內的類,在作用域的范圍內有效靜態內部類:定義為static的內部類,可以有static數據和屬性匿名內部類:沒有名字而且只能使用一次的內部類,必須繼承一個父類或者實現一個接口

附件 

1、抽象類

package com.vivi.study.abstracttest;abstract class AbstractHello {   PRivate String type;   // 抽象方法 只聲明 不實現  交給繼承者實現    abstract void method1();    void method2(){    	System.out.println("我是非抽象方法");    };}2、抽象類子類 包含內部類 在內部類測試代碼中展現

package com.vivi.study.abstracttest;/* * 抽象類子類 * 實現父類方法 * 成員內部類 * 靜態成員內部類 * 局部內部類 */public class AbstractHelloSub extends AbstractHello{	@Override	void method1() {		System.out.println("實現父類抽象方法 ");	}	public subClass getSubClass(){		return new subClass();	}		// 成員內部類	public class subClass{//		不能含有static 變量和方法 會報錯//		public static int age=1;		public int getSubName() {			return subName;		}		public void setSubName(int subName) {			this.subName = subName;		}		private int subName;		public void subMethod(){			System.out.println("");		}	}//	局部內部類 定義在方法中的內部類	public void getClassMethod(int mage){		class SubClassInMethod{						public SubClassInMethod(int age){				this.setAge(age);				System.out.println("局部內部類演示"+age);			}						private int age;			public int getAge() {				return age+2;			}			public void setAge(int age) {				this.age = age;			}		}				SubClassInMethod mSubClassInMethod=new SubClassInMethod(3);		System.out.println("局部類方法調用"+mSubClassInMethod.getAge());	}			// 靜態內部類 可以有靜態變量和靜態方法 	public static class staticSubClass{		public static int age=1;		private String name;				public String getName() {			return name;		}		public void setName(String name) {			this.name = name;		}				public static void getMName(String name1){			System.out.println("來自靜態內部類的"+name1);		}	}}3、抽象類測試

package com.vivi.study.abstracttest;public class TestAbsctract {	public static void main(String[] args) {		// 抽象類不能直接創建對象 否則編譯不通過  //		Cannot instantiate the type AbstractHello//		AbstractHello abstractHello1=new AbstractHello();				//		抽象類可以通過對象引用指向非抽象子類對象  //		類比下動態綁定就知道了  父類   父類引用 =new 子類();    這也是多態的一種形式		AbstractHello abstractHello2=new AbstractHelloSub();		abstractHello2.method1();		//		但是抽象類 可以通過 隱式內部類重寫其抽象方法來new對象  		AbstractHello abstractHello3=new AbstractHello() {			@Override			void method1() {				System.out.println("抽象類創建對象  無法通過編譯");			}		};		abstractHello3.method1();	}}

4、接口類

package com.vivi.study.abstracttest;public interface InterfaceHello {	/*	 * 不能有成員方法	 * 不能有靜態代碼塊	 * 對行為(方法)抽象	 * 使用implement	 */	int type=1;//相當于  public static final int type=1;	void sayHello();// 相當于abstract void sayHello();}

5、接口實現類

package com.vivi.study.abstracttest;public class InterfaceHelloSub implements InterfaceHello{	@Override	public void sayHello() {		System.out.println("來自接口的public static final變量"+InterfaceHello.type);	}}6、接口 抽象類 內部類測試

package com.vivi.study.abstracttest;public class InterfaceAndAbstractTest {	public static void main(String[] args) {	  // 內部類測試		//1、匿名內部類		//內部類 接口方式==動態引用,將InterfaceHelloSub實例向上轉型為InterfaceHello的引用		InterfaceHello interfaceHello0=new InterfaceHelloSub() ;		interfaceHello0.sayHello();		//匿名內部類 接口方式		InterfaceHello interfaceHello=new InterfaceHello() {						@Override			public void sayHello() {				System.out.println("匿名內部類 接口方式");			}		};		interfaceHello.sayHello();				//內部類 抽象類方式==動態引用,將AbstractHelloSub實例向上轉型為AbstractHello的引用		AbstractHello abstractHello0=new AbstractHelloSub() ;		abstractHello0.method1();		//匿名內部類 抽象類形式 abstract 類		AbstractHello abstractHello=new AbstractHello() {						@Override			void method1() {				System.out.println("匿名內部類 抽象類形式 abstract 類");			}		};				abstractHello.method1();		//		2、成員內部類		//	    成員內部類需要先創建了外部類,才能創建它自己的//		AbstractHelloSub.subClass sub=new AbstractHelloSub.subClass(); 這個會報錯		AbstractHelloSub sub1=new AbstractHelloSub();		AbstractHelloSub.subClass sub2=sub1.getSubClass();		sub2.subMethod();				//		3、局部內部類 定義在方法中的內部類		sub1.getClassMethod(2);		//		4、靜態內部類		AbstractHelloSub.staticSubClass.getMName("張三");	}}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 定安县| 全椒县| 台南县| 静安区| 黄大仙区| 通道| 抚顺县| 宕昌县| 敦化市| 承德市| 平远县| 黄龙县| 法库县| 澎湖县| 德格县| 汝州市| 鄂尔多斯市| 泰来县| 凤山市| 大庆市| 荆门市| 独山县| 台北县| 青海省| 西盟| 德化县| 清涧县| 陇西县| 准格尔旗| 双峰县| 广饶县| 浏阳市| 稻城县| 林甸县| 蒙自县| 永吉县| 老河口市| 遂溪县| 勐海县| 洪雅县| 遂溪县|