天天看點

java—抽象方法,抽象類(局部内部類,匿名内部類的使用)

抽象方法,抽象類

(一)抽象方法:

  1. 定義:隻聲明而未實作的方法,即沒有方法體的方法。
  2. 抽象方法使用 abstract 修飾,具有抽象方法的類也用 abstract 修飾。

    即 具有抽象方法的類一定是抽象類,但抽象類中不一定有抽象方法。

abstract class Stu{
 
//該方法隻是聲明了一個print()方法,沒有方法體,是以是一個抽象方法。
public abstract void print();
}
           

(二)抽象類

  1. 定義:使用abstract 修飾的類。
  2. 抽象類沒辦法執行個體化對象,抽象類的執行個體化對象可以通過其子類執行個體化。
  3. 抽象類中的 所有 抽象方法需要被子類覆寫。

    如果子類繼承抽象類,如果沒有覆寫父類的抽象方法,則必須使用abstract修飾子類。但此時依然不能執行個體化對象。

  4. 抽象方法不能使用private修飾,因為由private修飾的方法子類隻能繼承不能覆寫。
  5. 如果抽象父類沒有無參構造方法,那麼子類必須通過super明确指定構造方法。
  6. 抽象類中允許沒有抽象方法,但此時抽象類依然不能執行個體化。
  7. 抽象類不能用final修飾,因為final修飾的類不能有子類,但抽象類又必須有子類。

(三)抽象類的應用(局部内部類,匿名内部類的使用)

  1. 普通使用
//4. 定義主類
public class Test0001{
	public static void main(String[] args){
//4.1 父類通過其子類進行執行個體化(向上轉型)
		Person person1 = new Student("張三");
		Person person2 = new Teacher("jack");
//4.2 通過執行個體化對象調用每個子類中具體實作的父類的抽象方法
		System.out.println(person1.getInfo());
		System.out.println(person2.getInfo());
	}
}

//1,定義抽象類
abstract class Person{
	
	private String name;
	
	public Person(String name){
		this.name = name;
	}
	
	public String getName(){
		return this.name;
	}
	//1,1定義抽象方法getInfo()
	public abstract String getInfo();
}

//2,定義Student 子類繼承抽象類
//2.1 子類中覆寫父類的抽象方法(具體實作)
class Student extends Person{
	
	public Student(String name){
		super(name);
	}
	
	public String getInfo(){
		return "學生姓名是:"+this.getName();
	}
}

//3,定義Teacher 子類繼承抽象類
//3.1 子類中覆寫父類的抽象方法(具體實作)
class Teacher extends Person{
	
	public Teacher(String name){
		super(name);
	}
	
	public String getInfo(){
		return "教師姓名是:"+this.getName();
	}
}	


           

結果如下:

java—抽象方法,抽象類(局部内部類,匿名内部類的使用)
  1. 使用局部内部類

    舉例如下:

public class Test0001{
	
	public static void main(String[] args){
//2. Person類已經在其子類 Worker 中執行個體化,此處可直接建立對象即可
		Person person3 = Person.getObject();
		System.out.println(person3.getInfo());
	}
}


//1. 定義抽象類
abstract class Person{
	
	private String name;
	public Person(String name){
		this.name = name;
	}
	public String getName(){
		return this.name;
	}
	
//1.1 在抽象類中定義抽象化方法
	public abstract String getInfo();

//1.2 在抽象類中定義一個普通方法,為定義局部内部類作基礎,
//将該普通方法用static 修飾,友善在主類中好調用該方法
	public static Person getObject(){
		
//1.3 在抽象方法的普通方法中定義局部内部類
		class Worker extends Person{
			public Worker(String name){
				super(name);
			}
			public String getInfo(){
				return "勞工姓名是:"+this.getName();
			}
		}
		return new Worker("王五");
	}
}
           

結果如下:

java—抽象方法,抽象類(局部内部類,匿名内部類的使用)
  1. 使用匿名内部類

    舉例:

public class Test0001{
	
	public static void main(String[] args){
		
		Person person4 = Person.getObject();
		System.out.println(person4.getInfo());
	}
}


//1. 定義抽象類
abstract class Person{

	private String name;
	public Person(String name){
		this.name = name;
	}
	public String getName(){
		return this.name;
	}
	
//1.1 定義抽象方法
	public abstract String getInfo();

//1.2 定義一個普通方法,是為了在普通方法中定義一個匿名内部類	
	public static Person getObject(){
//1.3 定義匿名内部類,該内部類沒有名字,也就沒有構造方法,同時該内部類繼承了父類Person類		
		return new Person("孫六"){
//1.4 在匿名内部類中覆寫父類抽象類中的抽象方法(具體實作)
			public String getInfo(){
				return "勞工姓名:"+this.getName();
			}
		};		
	}
}
           

結果如下:

java—抽象方法,抽象類(局部内部類,匿名内部類的使用)