Pragma mark — NO.1 基礎(chǔ)代碼
public class ChouxiangLei {
public static void main(String[] args){
// Animal1 a = new Animal1(); Animal1是無(wú)法被實(shí)例化的,因?yàn)檫@個(gè)eat方法
//是一個(gè)抽象方法,沒(méi)有實(shí)現(xiàn),如果我們可以實(shí)例化類(lèi),那么就可以調(diào)用這個(gè)eat方法,這是不允許的
Animal1 a = new Cat1();//父類(lèi)引用指向子類(lèi)對(duì)象--多態(tài)啊
a.eat();
}
}
//創(chuàng)建一個(gè)抽象類(lèi)--abstract是抽象的關(guān)鍵字
//抽象類(lèi):不知道類(lèi)內(nèi)部是怎樣的,有什么成員變量,有什么方法
//抽象方法:不知道方法內(nèi)部該怎么實(shí)現(xiàn)
/*
* 抽象類(lèi)不一定有抽象方法,有抽象方法的類(lèi),一定是抽象類(lèi)或者接口
*B:抽象類(lèi)不能實(shí)例化,那么如何實(shí)例化呢?
* 按照多態(tài)的方式,由具體的子類(lèi)實(shí)例化,其實(shí)這也是多態(tài)的一種:抽象類(lèi)多態(tài)
* C:抽象類(lèi)的子類(lèi):
* 要么是抽象類(lèi)
* 要么重寫(xiě)抽象類(lèi)中的所有抽象方法
* */
abstract class Animal1{
//抽象方法--注意抽象方法后面不接這個(gè)方法實(shí)現(xiàn)的中括號(hào)了
public abstract void eat();
}
//創(chuàng)建一個(gè)子類(lèi)繼承自Animal1 -- 對(duì)于這個(gè)子類(lèi)來(lái)說(shuō),繼承自抽象類(lèi),那么必須重寫(xiě)父類(lèi)所有的抽象方法
class Cat1 extends Animal1{
public void eat(){
System.out.println("貓要吃魚(yú)”);
}
}
Pragma mark — NO.2 抽象類(lèi)特點(diǎn)
public class ChouXianglei2 {
public static void main(String[] args){
SubDemo s = new SubDemo();
s.method();
}
}
/*
* A:抽象類(lèi)的成員特點(diǎn)
* a:成員變量:既可以是變量,也可以是常量。 abstract 不能修飾成員變量
* b:構(gòu)造方法:有
* 用于子類(lèi)訪問(wèn)父類(lèi)數(shù)據(jù)的初始化
* c:成員方法:既可以是抽象的,也可以不是
* */
//創(chuàng)建一個(gè)抽象類(lèi)--抽象類(lèi)中可以有哪些東西
abstract class Demo {
int num1 = 10;//變量
final int num2 = 20;//常量
//構(gòu)造方法
public Demo(){
//我們?cè)趕uper的構(gòu)造中寫(xiě)點(diǎn)東西\
System.out.println("我是構(gòu)造方法");
}
//普通方法
public void print(){
System.out.println("我是普通方法");
}
//抽象方法
public abstract void method();
}
//搞個(gè)子類(lèi)
class SubDemo extends Demo{
public SubDemo(){
//在子類(lèi)的構(gòu)造方法中隱藏了super
super();
}
//子類(lèi)必須要重寫(xiě)抽象父類(lèi)的抽象方法
public void method(){
System.out.println("我是子類(lèi),重寫(xiě)了父類(lèi)的抽象方法");
}
}
Pragma mark — NO.3 葵花寶典的例子說(shuō)明父類(lèi)強(qiáng)制子類(lèi)執(zhí)行
public class ChouXianglei3 {
public static void main (String[] args){
//分別創(chuàng)建這三個(gè)人類(lèi)
DongFbb dongfang = new DongFbb();
Yuebq yue = new Yuebq();
Lingpz ling = new Lingpz();
dongfang.Zigong();
yue.Zigong();
ling.Zigong();
//這個(gè)例子告訴我們,父類(lèi)要求子類(lèi)強(qiáng)制執(zhí)行的,你要練我神功,就必須實(shí)現(xiàn)自宮這一步.
}
}
/*
* 以葵花寶典舉例說(shuō)明這個(gè)抽象類(lèi)
* */
//創(chuàng)建一個(gè)葵花寶典的抽象類(lèi)
abstract class Kuihuabaodian{
//創(chuàng)建一個(gè)抽象方法--自宮
//創(chuàng)建這個(gè)方法的意思是:你只要練我這個(gè)武功,你就得自宮
public abstract void Zigong();
}
//接下來(lái)有人要練這個(gè)葵花寶典了,那么就得繼承自這個(gè)抽象類(lèi)
//假如東方不敗練這個(gè)東西
class DongFbb extends Kuihuabaodian{
public void Zigong(){
System.out.println("欲練此功,必先自宮--用刀");
}
}
//我們?cè)賮?lái)一個(gè)人岳不群練這個(gè)
class Yuebq extends Kuihuabaodian{
public void Zigong(){
System.out.println("欲練此功,必先自宮--用牙簽");
}
}
//我們?cè)賮?lái)一個(gè)人林平之練這個(gè)
class Lingpz extends Kuihuabaodian {
public void Zigong() {
System.out.println("欲練此功,必先自宮--用指甲刀");
}
}
Pragma mark — NO.4 簡(jiǎn)單貓狗案例
public class ChouXianglei4 {
public static void main (String[] args){
//創(chuàng)建對(duì)象
Cat12 c = new Cat12("lingling",18);
Dog2 d = new Dog2("dulan",22);
//調(diào)用方法
c.eat();
c.catchMouse();
d.eat();
d.lookHome();
}
}
/*
* 案例演示:
* 具體事物:貓,狗
* 共性:姓名,年齡,吃飯
* 貓的特性:抓老鼠
* 狗的特性:看家
**/
//抽取一個(gè)父類(lèi)--動(dòng)物類(lèi)
abstract class Animal2 {
private String name;
private int age;
public Animal2(){}
public Animal2(String name, int age){
this.name = name;
this.age = age;
}
//set/get方法
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
//這里有個(gè)吃飯方法,我們無(wú)法確定,定義為抽象方法
public abstract void eat();
}
//定義貓類(lèi)
class Cat12 extends Animal2{
//寫(xiě)上有參和無(wú)參構(gòu)造
public Cat12(){}
public Cat12(String name, int age){
// this.name = name;
// this.age = age;//這里不能直接this,因?yàn)楸绢?lèi)中并沒(méi)有name和age的成員
//可以直接調(diào)用父類(lèi)的,讓父類(lèi)去給我們構(gòu)建
super(name,age);
}
//重寫(xiě)抽象類(lèi)的抽象方法
public void eat(){
System.out.println("貓要吃魚(yú)");
}
//自身特有方法
public void catchMouse(){
System.out.println("我要抓老鼠");
}
}
//定義狗類(lèi)
class Dog2 extends Animal2{
//寫(xiě)上有參和無(wú)參構(gòu)造
public Dog2(){}
public Dog2(String name, int age){
super(name,age);
}
public void eat(){
System.out.println("狗要吃骨頭");
}
public void lookHome(){
System.out.println("我會(huì)看家");
}
}
Pragma mark — NO.5 面試題
1.一個(gè)抽象類(lèi)如果沒(méi)有抽象方法,可不可以定義為抽象類(lèi),有什么意義?
答:可以,作用是:目的只有一個(gè),就是不讓其它類(lèi)創(chuàng)建本類(lèi)對(duì)象,交給子類(lèi)去調(diào)用。
2.abstract關(guān)鍵字不能和哪些關(guān)鍵字共存
答:
(1).不能和static共存:
被abstract修飾的方法沒(méi)有方法體,被static修飾的可以用類(lèi)名.調(diào)用,但是類(lèi)名.調(diào)用抽象方法是沒(méi)有意義的
(2).不能和final共存:
被abstract修飾的方法強(qiáng)制子類(lèi)重寫(xiě)
被final修飾的不讓子類(lèi)重寫(xiě),所以這兩個(gè)是矛盾的
(3).private和abstract:
被abstract修飾的是為了讓子類(lèi)看到并強(qiáng)制重寫(xiě)
被private修飾不讓子類(lèi)訪問(wèn),所以這兩個(gè)是矛盾的
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。