您好,登錄后才能下訂單哦!
這篇“Java抽象的定義及相應代碼實例分析”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java抽象的定義及相應代碼實例分析”文章吧。
在OOP這個概念中,所有的對象都是通過類來描述的;但是并不是所有的類都是用來描述對象的。如果一個類沒有包含足夠的信息來描述一個具體的對象,這樣的類稱為抽象類。
抽象類:(1)抽象類不能實例化對象,如果實例化某個對象,編譯無法通過。只有抽象類的非抽象子類可以創建對象(2)可以包含:成員變量、成員方法、構造方法等。(3)構造方法、類方法(用static修飾的方法)不能聲明為抽象方法
抽象方法:(1)如果一個類包含抽象方法,那么該類一定是抽象類(2)任何子類必須重寫父類的抽象方法,或者聲明自身為抽象類
定義:abstract class 類名
Animal:抽象類--------getName()、move()、drink()
Reptile、Mammal:繼承抽象類
蛇、老虎、山羊、兔子:分別繼承Reptile或Mammal
fammer:bringWater()、feedWater(Animal animal)---- 負責將水帶到指定的地方,然后動物移動去目的地,喝水
代碼如下:
package abstractDemo;
/**
* @author lpx
* @Description TODO
* @date 2021-04-07
*/
public abstract class Animal {
abstract String getName();
abstract void move(String destination);
abstract void drink();
}
abstract class Reptile extends Animal{
}
abstract class Mammal extends Animal{
}
class Tiger extends Mammal{
private static String name="tiger";
@Override
String getName() {
return this.name;
}
@Override
void move(String destination) {
System.out.println("tiger move to "+destination+".");
}
@Override
void drink() {
System.out.println("tiger lower it is head and drink");
}
}
class Goat extends Mammal{
private static String name="goat";
@Override
String getName() {
return this.name;
}
@Override
void move(String destination) {
System.out.println("goat move to "+destination+".");
}
@Override
void drink() {
System.out.println("goat lower it head to drink");
}
}
class Rabbit extends Mammal{
private static String name="rabbit";
@Override
String getName() {
return this.name;
}
@Override
void move(String destination) {
System.out.println("rabbit move to "+destination+".");
}
@Override
void drink() {
System.out.println("rabbit put out it is tongue and drink");
}
}
class Snake extends Reptile{
private static String name="snake";
@Override
String getName() {
return this.name;
}
@Override
void move(String destination) {
System.out.println("snake move to "+destination+".");
}
@Override
void drink() {
System.out.println("snake dived into and drink");
}
}
class Farmer{
public void bringWater(String destination){
System.out.println("Farmer bring water to " + destination + ".");
}
public void feedWater(Animal a){ // polymorphism
this.bringWater("Feeding Room");
a.move("Feeding Room");
a.drink();
}
}
class Test{
public static void main(String[] args) {
Farmer fm=new Farmer();
Snake snake=new Snake();
Goat goat=new Goat();
Tiger tiger=new Tiger();
Rabbit rabbit=new Rabbit();
fm.feedWater(snake);
fm.feedWater(goat);
fm.feedWater(tiger);
fm.feedWater(rabbit);
}
}
總結:
如果每種動物不是抽象出drink和move方法的話,就無法實現多態。農夫類就需要根據參數的不同重載多個feedWater。如果繼續添加動物那么重載個數就越來越多。為了方便對比理解,我也按照常規思維去寫了一下,代碼如下:
package abstractDemo;
/**
* @author lpx
* @Description TODO
* @date 2021-04-07
*/
class Tiger1{
private static String name="tiger";
String getName() {
return this.name;
}
void move(String destination) {
System.out.println("tiger move to "+destination+".");
}
void drink() {
System.out.println("tiger lower it is head and drink");
}
}
class Goat1{
private static String name="goat";
String getName() {
return this.name;
}
void move(String destination) {
System.out.println("goat move to "+destination+".");
}
void drink() {
System.out.println("goat lower it head to drink");
}
}
class Rabbit1{
private static String name="rabbit";
String getName() {
return this.name;
}
void move(String destination) {
System.out.println("rabbit move to "+destination+".");
}
void drink() {
System.out.println("rabbit put out it is tongue and drink");
}
}
class Farmer1{
public void bringWater(String destination){
System.out.println("Farmer bring water to " + destination + ".");
}
public void feedWater(Goat1 goat){ // polymorphism
this.bringWater("Feeding Room");
goat.move("Feeding Room");
goat.drink();
}
public void feedWater(Tiger1 tiger){ // polymorphism
this.bringWater("Feeding Room");
tiger.move("Feeding Room");
tiger.drink();
}
public void feedWater(Rabbit1 rabbit1) {
this.bringWater("Feeding Room");
rabbit1.move("Feeding Room");
rabbit1.drink();
}
}
public class Test1{
public static void main(String[] args) {
Farmer1 farmer1=new Farmer1();
Tiger1 tiger1=new Tiger1();
Goat1 goat1=new Goat1();
Rabbit1 rabbit1=new Rabbit1();
farmer1.feedWater(tiger1);
farmer1.feedWater(goat1);
farmer1.feedWater(rabbit1);
}
}
手敲了這個例子,發現基礎很重要呀,以前學習的不細致,導致很多地方迷糊不知道為啥那么寫。
(1)一個.java文件中可以定義多個class類,但是只有一個可以定義為public,且這個類名必須和文件名相同
(2)抽象類繼承抽象類,不用覆蓋其抽象方法(原因也很簡單呀,本身他就是抽象的不能實現方法體)。而非抽象類繼承抽象類必須覆蓋抽象方法,非抽象方法非必要。
(3)重寫和重載的區別(高頻面試題)
重載:定義相同的方法名,參數不同。屬于編譯時多態
重寫:子類重寫父類的方法@Override。屬于運行時多態
以上就是關于“Java抽象的定義及相應代碼實例分析”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。