重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
package test;
創新互聯是一家專注于成都網站建設、網站建設與策劃設計,中江網站建設哪家好?創新互聯做網站,專注于網站建設10余年,網設計領域的專業建站公司;建站業務涵蓋:中江等地區。中江做網站價格咨詢:18980820575
/**
*
* @author JinnL
*父類抽象類
*/
public abstract class Car {
//轉彎
abstract void turn();
//啟動
abstract void start();
void what(){
System.out.println("this is "+this.getClass().getSimpleName());
}
public static void main(String[] args) {
/**
* 方法入口
*/
Car[] cars ={new Bicycle(),new Automobile(),new GasAutomobile(),new DieselAutomobile()};
for (Car car : cars) {
car.start();
}
}
}
class Bicycle extends Car{
@Override
void turn() {
System.out.println("this is "+this.getClass().getSimpleName());
}
@Override
void start() {
System.out.println("this is "+this.getClass().getSimpleName());
}
void what(){
}
}
class Automobile extends Car{
@Override
void turn() {
System.out.println("this is "+this.getClass().getSimpleName());
}
@Override
void start() {
System.out.println("this is "+this.getClass().getSimpleName());
}
}
class GasAutomobile extends Automobile{
//重寫start turn
@Override
void turn() {
System.out.println("this is "+this.getClass().getSimpleName());
}
@Override
void start() {
System.out.println("this is "+this.getClass().getSimpleName());
}
}
class DieselAutomobile extends Automobile{
@Override
void start() {
System.out.println("this is "+this.getClass().getSimpleName());
}
void what(){
System.out.println("this is "+this.getClass().getSimpleName());
}
}
我復制你的代碼 打印出來的是
王二,學生專業是:計算機科學
沒報錯呢?
那不是報test2錯誤么
//抽象的形狀類
abstract class Shape{
abstract double getArea(); //抽象的求面積方法
}
//矩形類
class Rectangle extends Shape{
protected double width;
protected double height;
public Rectangle(double width, double height){
this.width = width;
this.height = height;
}
@Override
double getArea() { //實現父類的方法
return this.width * this.height;
}
}
//橢圓類
class Ellipse extends Shape{
protected double a;
protected double b;
public Ellipse(double a, double b){
this.a = a;
this.b = b;
}
@Override
double getArea() {
return Math.PI * this.a * this.b;
}
}
public class TestAbstract {
public static void main(String[] args) {
Shape s;
s = new Rectangle(3, 4);
System.out.println("矩形的面積 : " + s.getArea());
s = new Ellipse(4, 3);
System.out.println("橢圓的面積 : " + s.getArea());
}
}
//接口
public?interface?BankCard?{
public?void?norm();
}
//工商銀行實現類
public?class?ICBCBankCard?implements?BankCard?{
@Override
public?void?norm()?{
//?TODO?銀行規范
}
public?void?saveMoney(int?money){
//TODO?執行存錢動作?
}
public?void?transfer(String?account,int?money){
//TODO?執行轉賬?動作
}
}
//交通銀行實現類
public?class?CommunicationsBankCard?implements?BankCard?{
@Override
public?void?norm()?{
//?TODO?銀行規范
}
public?void?saveMoney(int?money){
//TODO?執行存錢動作?
}
public?void?transfer(String?account,int?money){
//TODO?執行轉賬?動作
}
}
上面的例子只是申明了通用的規范,如果想讓實現類都能實現存錢和轉賬功能,可以在接口里面聲明這兩個方法,寫一個通用的實現類,實現這些方法,然后具體的子類繼承該通用類,這樣可以直接繼承父類方法,如果不同的銀行具體實現不同,可以復寫父類中的兩個方法。
比較基礎,給你個例子的思路:
1、創建抽象動物類:AbstractAnimal.java:public AbstractAnimal{...},其中包含屬性String name;(自行設置getter和setter),包含抽象方法public void walk();
2、創建狗類Dog.java,繼承抽象動物類:public Dog extends AbstractAnimal{...},同時必須重寫行走方法:
@Override
public void walk(){
System.out.println(super.name + "用四條腿走路");
}
3、創建人類People.java,繼承抽象動物類:public Peopleextends AbstractAnimal{...},同時必須重寫行走方法:
@Override
public void walk(){
System.out.println(super.name + "用兩條腿走路");
}
4、編寫測試類
private static void main(String[] args){
AbstractAnimal dog = new God();
dog.setName("來福");
dog.walk();
AbstractAnimal people = new People();
people.setName("張三");
people.walk();
}
使用了關鍵詞abstract聲明的類叫作“抽象類”。如果一個類里包含了一個或多個抽象方法,類就必須指定成abstract(抽象)。“抽象方法”,屬于一種不完整的方法,只含有一個聲明,沒有方法主體。
抽象語法編輯
下面是抽象方法聲明時采用的語法:
abstract void f();
如果從一個抽象類繼承,而且想生成新類型的一個對象,就必須為基礎類中的所有抽象方法提供方法定義。
如果不這樣做(完全可以選擇不做),則衍生類也會是抽象的,而且編譯器會強迫我們用abstract 關鍵字標志那個類的“抽象”本質。
即使不包括任何abstract 方法,亦可將一個類聲明成“抽象類”。如果一個類沒必要擁有任何抽象方法,而且我們想禁止那個類的所有實例,這種能力就會顯得非常有用。
在面向對象的概念中,我們知道所有的對象都是通過類來描繪的,但是反過來卻不是這樣。并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。抽象類往往用來表征我們在對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。比如:如果我們進行一個圖形編輯軟件的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬于形狀這樣一個概念,形狀這個概念在問題領域是不存在的,它就是一個抽象概念。正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表征抽象概念的抽象類是不能夠實例化的。
在面向對象領域,抽象類主要用來進行類型隱藏。我們可以構造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現為所有可能的派生類。模塊可以操作一個抽象體。由于模塊依賴于一個固定的抽象體,因此它可以是不允許修改的;同時,通過從這個抽象體派生,也可擴展此模塊的行為功能。熟悉OCP的讀者一定知道,為了能夠實現面向對象設計的一個最核心的原則OCP(Open-Closed Principle),抽象類是其中的關鍵所在。
2對比接口編輯
語法定義層
在abstract class方式中,Demo可以有自己的數據成員,也可以有非abstract的成員方法,而在interface方式的實現中,Demo只能夠有靜態的不能被修改的數據成員(也就是必須是static final的,不過在interface中一般不定義數據成員),所有的成員方法都是abstract的。
編程層面
abstract class在Java語言中表示的是一種繼承關系,一個類只能使用一次繼承關系。但是,一個類卻可以實現多個interface。
設計理念層面
abstract class在Java語言中體現了一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在"is a"關系,即父類和派生類在概念本質上應該是相同的。 對于interface 來說則不然,并不要求interface的實現者和interface定義在概念本質上是一致的,僅僅是實現了interface定義的契約(功能)而已。
四、抽象類的示例代碼
//: interfaces/music4/Music4.java
// Abstract classes and methods.
/* 抽象類的功能
* 使類的抽象性明確起來
*
*/
// 以下是 抽象類 的示例
package interfaces.music4;
import pets.Pet;
import polymorphism.music.Note;
import static net.mindview.util.Print.*;
/* 1. 抽象方法 abstract void f(); 抽象方法不能包含有任何方法的BODY 。
* 2. 如果一個類包含1個或者多個抽象方法, 則該類必須限定為抽象的。
* 需要在前面指定 abstract 關鍵字。
* (1)抽象類不能被實例化
* (2)包含抽象方法的類,必須標識 abstract
* 3. 如果從一個抽象類繼承, 必須對所有抽象方法進行覆蓋 , 否則導出類也是抽象的
* 4. 也可以考慮創建沒有任何抽象方法的抽象類 。
*
*/
abstract class Instrument {
// 抽象類中可以有非抽象方法。
private int i; // Storage allocated for each
public abstract void play(Note n);
public String what() { return "Instrument"; }
public abstract void adjust();
}
/*
(2)包含抽象方法的類,必須標識 abstract, 否則編譯器會報錯
class abc
{
public abstract void Demo();
}*/
class Wind extends Instrument {
public void play(Note n) {
print("Wind.play() " + n);
}
public String what() { return "Wind"; }
public void adjust() {}
}
class Percussion extends Instrument {
public void play(Note n) {
print("Percussion.play() " + n);
}
public String what() { return "Percussion"; }
public void adjust() {}
}
class Stringed extends Instrument {
public void play(Note n) {
print("Stringed.play() " + n);
}
public String what() { return "Stringed"; }
public void adjust() {}
}
class Brass extends Wind {
public void play(Note n) {
print("Brass.play() " + n);
}
public void adjust() { print("Brass.adjust()"); }
}
class Woodwind extends Wind {
public void play(Note n) {
print("Woodwind.play() " + n);
}
public String what() { return "Woodwind"; }
}
class TestAbsExt extends Instrument
{
public void play( Note n ) {
print ("TestAbsExt.play()" + n);
}
public String what()
{
return "TestAbsExt";
}
public void adjust()
{
}
}
// 不含任何抽象方法的抽象類
abstract class AbsClass
{
public void f1() {
print("f1()");
}
public void f2() {
print("f2()");
}
}
public class Music4 {
// Doesn't care about type, so new types
// added to the system still work right:
static void tune(Instrument i) {
// ...
i.play(Note.MIDDLE_C);
}
static void tuneAll(Instrument[] e) {
for(Instrument i : e)
tune(i);
}
public static void main(String[] args) {
// !抽象類不能被實例化
// 若使用以下語句 , 將會收到報錯。
/* Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Instructment cannot be resolved to a type
*/
// ! new Instructment();
// Upcasting during addition to the array:
Instrument[] orchestra = {
new Wind(),
new Percussion(),
new Stringed(),
new Brass(),
new Woodwind()
};
tuneAll(orchestra);
}
} /* Output:
Wind.play() MIDDLE_C
Percussion.play() MIDDLE_C
Stringed.play() MIDDLE_C
Brass.play() MIDDLE_C
Woodwind.play() MIDDLE_C
*///:~
/*
* 抽象方法不能包含有任何方法的BODY 。
*/
/*
abstract class RodentAbs extends Pet {
abstract public Rodent(String name) { super(name); }
abstract public Rodent() { super(); }
} ///:~
*/