摘要:案例演示抽象類的成員特點(diǎn)抽象類的成員方法特性抽象方法強(qiáng)制要求子類做的事情。抽象類中定義的是該繼承體系的共性功能。
1.多態(tài)的概述及其成員訪問特點(diǎn)代碼體現(xiàn)
A:多態(tài)(polymorphic)概述
事物存在的多種形態(tài)
B:多態(tài)前提-
1.要有繼承關(guān)系
2.要有方法重寫
3.要有父類引用指向子類對(duì)象。
C:多態(tài)中的成員訪問特點(diǎn)之
成員變量:編譯和運(yùn)行都看父類。
成員方法:編譯看父類,運(yùn)行看子類(非靜態(tài))。
靜態(tài)成員方法:編譯和運(yùn)行都看父類—— (靜態(tài)和類相關(guān),算不上重寫,訪問還是父類)
class JavaObject { public static void main(String [] args) { Father a = new Son(); //父類引用指向子類對(duì)象 System.out.println(a.num);//成員變量-編譯看父類,運(yùn)行也看父類。 Father f = new Son(); f.print(); //成員方法非靜態(tài)運(yùn)行看子類 f.method(); //靜態(tài)和類相似,相當(dāng)于是Father.methond()。 } } class Father { int num = 10; public void print () { System.out.println("父級(jí)"); } public static void method() { System.out.println("father static method"); } } class Son extends Father { int num = 20; public void print () { System.out.println("子級(jí)"); } public static void method() { System.out.println("son static method"); } }2.李明和老李的故事-多態(tài)向上向下轉(zhuǎn)型
A:案例分析-通過該案例幫助理解多態(tài)的現(xiàn)象
B:詳細(xì)講解多態(tài)中向上轉(zhuǎn)型和向下轉(zhuǎn)型
class JavaObject { public static void main(String [] args) { Boy b = new Man(); //父類引用指向子類對(duì)象,人類 System.out.println(b.name); //父類引用指向子類對(duì)象就是向上轉(zhuǎn)型 b.eat(); Man m = (Man)b; //向下轉(zhuǎn)型 m.work(); //多肽的弊端,不能直接使用子類的 //基本數(shù)據(jù)類型自動(dòng)類型提升和強(qiáng)制類型轉(zhuǎn)換 int i = 10; byte c = 20; //i = c; //自動(dòng)類型提升 c = (byte)i; //強(qiáng)制類型轉(zhuǎn)換 } } class Boy { String name = "liming"; public void eat() { System.out.println("吃一小碗飯"); } } class Man extends Boy { String name = "laoli"; public void eat () { System.out.println("吃一大碗飯"); } public void work() { System.out.println("工作"); } }3.多態(tài)的好處和弊端
A:多態(tài)的好處
a:提高了代碼的維護(hù)性(繼承保證)
b:提高了代碼的擴(kuò)展性(由多態(tài)保證)
B:案例演示
多態(tài)的好處
可以當(dāng)作形式參數(shù),可以接收任意子類對(duì)象
C:多態(tài)的弊端
不能使用子類的特有屬性和行為。
D:案例演示
method(Animal a)
method(Cat c)
class JavaObject { public static void main(String [] args) { //Cat c1 = new Cat(); //父類引用指向子類對(duì)象,人類 //c1.Cat(); method(new Cat()); method(new Dog()); //Animal a = new Cat();開發(fā)很少用父類引用指向子類對(duì)象,直接創(chuàng)建子類對(duì)象使用其特有屬性和行為。 } /*public static void method(Cat c) { //主類加靜態(tài) c.eat(); } public static void method(Dog d) { d.eat(); }*/ public static void method(Animal a) {//當(dāng)作參數(shù)的時(shí)候用多態(tài)最好,因?yàn)閿U(kuò)展性強(qiáng) //Cat c = (Cat)a;強(qiáng)轉(zhuǎn)會(huì)出現(xiàn)類型轉(zhuǎn)換異常,ClassCastException //關(guān)鍵字 instanseof 判斷前邊的引用是否是后邊的數(shù)據(jù)類型 if (a instanceof Cat) { Cat c = (Cat)a;//向下轉(zhuǎn)型,轉(zhuǎn)向子類 c.eat(); c.catchMouse(); } else if (a instanceof Dog) { Dog d = (Dog)a; d.eat(); d.lookHome(); } else { a.eat(); } } } class Animal { public void eat() { System.out.println("動(dòng)物吃飯"); } } class Cat extends Animal { public void eat () { System.out.println("貓吃魚"); } public void catchMouse() { System.out.println("抓老鼠"); } } class Dog extends Animal { public void eat () { System.out.println("狗吃肉"); } public void lookHome() { System.out.println("看家"); } }4.多態(tài)中的題目分析題
A:看下面程序是否有問題,如果沒有,說出結(jié)果
class Fu { public void show() { System.out.println("fu show"); } } class Zi extends Fu { public void show() { System.out.println("zi show"); } public void method() { System.out.println("zi method"); } } class Test1Demo { public static void main(String[] args) { Fu f = new Zi(); f.method(); f.show(); } }
B:看下面程序是否有問題,如果沒有,說出結(jié)果
class A { public void show() { show2(); } public void show2() { System.out.println("我"); } } class B extends A { public void show2() { System.out.println("愛"); } } class C extends B { public void show() { super.show(); } public void show2() { System.out.println("你"); } } public class Test2DuoTai { public static void main(String[] args) { A a = new B(); a.show(); B b = new C(); b.show(); } }5.抽象類的概述及其特點(diǎn)
A:抽象類概述
抽象就是看不懂的
B:抽象類特點(diǎn)
a:抽象類和抽象方法必須用abstract關(guān)鍵字修飾
abstract class 類名 {}
public abstract void eat();
b:抽象類不一定有抽象方法,有抽象方法的類一定是抽象類或者是接口
c:抽象類不能實(shí)例化那么,抽象類如何實(shí)例化呢?
按照多態(tài)的方式,由具體的子類實(shí)例化。其實(shí)這也是多態(tài)的一種,抽象類多態(tài)。
d:抽象類的子類
要么是抽象類
要么重寫抽象類中的所有抽象方法
C:案例演示
抽象類特點(diǎn)
abstract class JavaObject { //抽象類 public static void main(String [] args) { //Animal a = new Animal(); //Animal a = new Cat(); //a.eat(); } } abstract class Animal { public abstract void eat(); } abstract class Cat extends Animal { /*public void eat() { System.out.println("貓吃魚"); }*/ }6.抽象類的成員特點(diǎn)
A:抽象類的成員特點(diǎn)
a:成員變量:既可以是變量,也可以是常量;abstract不能修飾成員變量。
b:構(gòu)造方法:有。
用于子類訪問父類數(shù)據(jù)的初始化。
c:成員方法:既可以是抽象的,也可以是非抽象的。
B:案例演示
抽象類的成員特點(diǎn)
C:抽象類的成員方法特性:
a:抽象方法 強(qiáng)制要求子類做的事情。
b:非抽象方法 子類繼承的事情,提高代碼復(fù)用性。
abstract class JavaObject { //抽象類 public static void main(String [] args) { } } abstract class Demo { int num1 = 10; final int num2 = 20; public Demo() { } public void print() { System.out.println("11111"); } public abstract void method(); } class DemoSon extends Demo { public void method() { System.out.println("22222"); } }7.旅行-案例演示抽象類的作用
abstract class JavaObject { //抽象類 public static void main(String [] args) { name1 n = new name1(); n.traffic(); } } /* 旅行travel 交通traffic */ abstract class travel { public abstract void traffic(); } class name1 extends travel { public void traffic() { System.out.println("坐汽車"); } } class name2 extends travel { public void traffic() { System.out.println("坐火車"); } } class name3 extends travel { public void traffic() { System.out.println("坐飛機(jī)"); } }8.抽象類練習(xí)貓狗案例
A:案例演示
具體事物:貓,狗
共性:姓名,年齡,吃飯
貓的特性:抓老鼠
狗的特性:看家
abstract class JavaObject { public static void main(String [] args) { Cat c = new Cat("加菲貓",8); System.out.println(c.getName() + "..." + c.getAge()); c.eat(); c.catchMouse(); Dog d = new Dog("八公",12); System.out.println(d.getName() + "..." + d.getAge()); d.eat(); d.lookHome(); } } abstract class Animal { private String name; private int age; public Animal() { } public Animal(String name,int age) { this.name = name; this.age = age; } 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; } public abstract void eat(); } class Cat extends Animal { public Cat() { } public Cat(String name,int age) { super(name,age); } public void eat() { System.out.println("貓吃魚"); } public void catchMouse() { System.out.println("抓老鼠"); } } class Dog extends Animal { public Dog() { } public Dog(String name,int age) { super(name,age); } public void eat() { System.out.println("狗吃肉"); } public void lookHome() { System.out.println("看家"); } }9.抽象類練習(xí)老師學(xué)生案例
A:案例演示
具體事物:基礎(chǔ)班老師,就業(yè)班老師
共性:姓名,年齡,講課。
具體事物:基礎(chǔ)班學(xué)生,就業(yè)班學(xué)生
共性:姓名,年齡,學(xué)習(xí)
abstract class JavaObject { //抽象類 public static void main(String [] args) { Teacher1 b1 = new Teacher1("王城",30); System.out.println(b1.getName() + "..." + b1.getAge()); b1.teach(); System.out.println("----------------------------"); Teacher2 b2 = new Teacher2("黎明",32); System.out.println(b2.getName() + "..." + b2.getAge()); b2.teach(); System.out.println("----------------------------"); Student1 s1 = new Student1("馮鞏",18); System.out.println(s1.getName() + "..." + s1.getAge()); s1.study(); System.out.println("----------------------------"); Student2 s2 = new Student2("張宇",20); System.out.println(s2.getName() + "..." + s2.getAge()); s2.study(); System.out.println("----------------------------"); } } class Person { private String name; private int age; public Person() { } public Person(String name,int age) { this.name = name; this.age = age; } 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; } } abstract class Teacher extends Person { public Teacher() { } public Teacher(String name,int age) { super(name,age); } public abstract void teach(); //講課抽象方法 } class Teacher1 extends Teacher { public Teacher1() { } public Teacher1(String name,int age) { super(name,age); } public void teach() { System.out.println("基礎(chǔ)班老師講課"); } } class Teacher2 extends Teacher { public Teacher2() { } public Teacher2(String name,int age) { super(name,age); } public void teach() { System.out.println("就業(yè)班老師講課"); } } abstract class Student extends Person { public Student() { } public Student(String name,int age) { super(name,age); } public abstract void study(); //學(xué)習(xí)抽象方法 } class Student1 extends Student { public Student1() { } public Student1(String name,int age) { super(name,age); } public void study() { System.out.println("基礎(chǔ)班學(xué)生學(xué)習(xí)"); } } class Student2 extends Student { public Student2() { } public Student2(String name,int age) { super(name,age); } public void study() { System.out.println("就業(yè)班學(xué)生學(xué)習(xí)"); } }10.抽象類練習(xí)員工案例
A:案例演示
假如我們?cè)陂_發(fā)一個(gè)系統(tǒng)時(shí)需要對(duì)程序員類進(jìn)行設(shè)計(jì),程序員包含3個(gè)屬性:姓名、工號(hào)以及工資。
經(jīng)理,除了含有程序員的屬性外,另為還有一個(gè)獎(jiǎng)金屬性。
請(qǐng)使用繼承的思想設(shè)計(jì)出程序員類和經(jīng)理類。要求類中提供必要的方法進(jìn)行屬性訪問。
class JavaObject { public static void main(String [] args) { Coder c = new Coder("蓋倫","001",12000); c.work(); Manager m = new Manager("諾手","007",18000,5000); m.work(); } } abstract class Employee { private String name; private String id; private double salary; public Employee() { } public Employee(String name,String id,double salary) { this.name = name; this.id = id; this.salary = salary; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setId(String id) { this.id = id; } public String getId() { return id; } public void setSalary(double salary) { this.salary = salary; } public double getSalary() { return salary; } public abstract void work(); } class Coder extends Employee { public Coder() { } public Coder(String name,String id,double salary) { super(name,id,salary); } public void work() { System.out.println("姓名是" + this.getName() + ",工號(hào)是" + this.getId() + ",工資是" + this.getSalary() + ",工作是敲代碼"); } } class Manager extends Employee { private int bonus; //獎(jiǎng)金 public Manager() { } public Manager(String name,String id,double salary,int bonus) { super(name,id,salary); this.bonus = bonus; } public void work() { System.out.println("獎(jiǎng)金是" + bonus + ",姓名是" + this.getName() + ",工號(hào)是" + this.getId() + ",工資是" + this.getSalary() + ",工作是管理"); } }11.抽象類中的面試題
A:面試題1
一個(gè)抽象類如果沒有抽象方法,可不可以定義為抽象類?如果可以,有什么意義?
可以
這么做目的只有一個(gè),就是不讓其他類創(chuàng)建本類對(duì)象,交給子類完成
B:abstract不能和哪些關(guān)鍵字共存
abstract和static
被abstract修飾的方法沒有方法體
被static修飾的可以用類名.調(diào)用,但是類名.調(diào)用抽象方法是沒有意義的
abstract和final
被abstract修飾的方法強(qiáng)制子類重寫
被final修飾的不讓子類重寫,所以他倆是矛盾的
abstract和private
被abstract修飾是為了讓子類看到并強(qiáng)制重寫
被private修飾不讓子類訪問,所以他倆是矛盾的
abstract class Demo { public static abstract void print();// 錯(cuò)誤: 非法的修飾符組合: abstract和static public final abstract void print();//錯(cuò)誤: 非法的修飾符組合: abstract和final private abstract void print(); //錯(cuò)誤: 非法的修飾符組合: abstract和private }12.接口的概述及其特點(diǎn)
A:接口概述
從狹義的角度講就是指java中的interface
從廣義的角度講對(duì)外提供規(guī)則的都是接口
B:接口特點(diǎn)
a:接口用關(guān)鍵字interface表示
interface 接口名 {}
b:類實(shí)現(xiàn)接口用implements表示
class 類名 implements 接口名 {}
c:接口不能實(shí)例化
那么,接口如何實(shí)例化呢?
按照多態(tài)的方式來實(shí)例化。
d:接口的子類
a:可以是抽象類。但是意義不大。
b:可以是具體類。要重寫接口中的所有抽象方法。(推薦方案)
C:案例演示
接口特點(diǎn)
abstract class JavaObject { //抽象類 public static void main(String [] args) { //Inter i = new Inter(); //接口不能被實(shí)例化,調(diào)用抽象方法沒有意義 Inter i = new Demo(); //父類引用指向子類對(duì)象 i.print(); } } interface Inter { public abstract void print(); //接口中的方法都是抽象的 } class Demo implements Inter{ public void print() { System.out.println("print"); } }13.接口的成員特點(diǎn)
A:接口成員特點(diǎn)
成員變量;只能是常量,并且是靜態(tài)的并公共的。
默認(rèn)修飾符:public static final
建議:自己手動(dòng)給出。
構(gòu)造方法:接口沒有構(gòu)造方法。
成員方法:只能是抽象方法。
默認(rèn)修飾符:public abstract
建議:自己手動(dòng)給出。
B:案例演示
接口成員特點(diǎn)
abstract class JavaObject { //抽象類 public static void main(String [] args) { //Inter i = new Inter(); //接口不能被實(shí)例化,調(diào)用抽象方法沒有意義 Demo d = new Demo(); //父類引用指向子類對(duì)象 d.print(); System.out.println(Inter.num); } } interface Inter { public static final int num = 10; public Inter(){} //接口中沒有構(gòu)造方法 public abstract void print(); //接口中的方法都是抽象的 public void print() { //接口中不能定義非抽象方法 } public abstract void print(); } class Demo /*extends Object*/implements Inter{ //一個(gè)類不寫繼承任何類,默認(rèn)繼承Object類。 public void print() { //num = 20; System.out.println(num); } public Demo() { super(); } }14.類與類,類與接口,接口與接口的關(guān)系
A:類與類,類與接口,接口與接口的關(guān)系
a:類與類:
繼承關(guān)系,只能單繼承,可以多層繼承。
b:類與接口:
實(shí)現(xiàn)關(guān)系,可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn)。
并且還可以在繼承一個(gè)類的同時(shí)實(shí)現(xiàn)多個(gè)接口。
c:接口與接口:
繼承關(guān)系,可以單繼承,也可以多繼承。
B:案例演示
類與類,類與接口,接口與接口的關(guān)系
interface InterA { public abstract void printA(); } interface InterB { public abstract void printB(); } interface InterC extends InterA,InterB{ } class Demo extends Object implements InterA,InterB {//implements只能寫一次 public void printA() { System.out.println("printA"); } public void printB() { System.out.println("PrintB"); } }15.抽象類和接口的區(qū)別
A:成員區(qū)別
抽象類:
成員變量:可以變量,也可以常量
構(gòu)造方法:有
成員方法:可以抽象,也可以非抽象
接口:
成員變量:只可以常量
成員方法:只可以抽象
B:關(guān)系區(qū)別
類與類
繼承,單繼承
類與接口
實(shí)現(xiàn),單實(shí)現(xiàn),多實(shí)現(xiàn)
接口與接口
繼承,單繼承,多繼承
C:設(shè)計(jì)理念區(qū)別
抽象類 被繼承體現(xiàn)的是:”is a”的關(guān)系。抽象類中定義的是該繼承體系的共性功能。
接口 被實(shí)現(xiàn)體現(xiàn)的是:”like a”的關(guān)系。接口中定義的是該繼承體系的擴(kuò)展功能。
16.貓狗案例加入跳高功能分析及其代碼實(shí)現(xiàn)
A:案例演示
動(dòng)物類:姓名,年齡,吃飯,睡覺。
貓和狗
動(dòng)物培訓(xùn)接口:跳高
abstract class JavaObject { public static void main(String [] args) { Cat c = new Cat("加菲貓",8); c.eat(); c.sleep(); JumpCat jc = new JumpCat("跳高貓",12); jc.eat(); jc.sleep(); jc.jump(); } } abstract class Animal { private String name; private int age; public Animal() { } public Animal(String name,int age) { this.name = name; this.age = age; } 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; } public abstract void eat(); //抽象 吃飯 public abstract void sleep(); //抽象 睡覺 } interface Jumping { //跳高的接口 public void jump(); } class Cat extends Animal { public Cat() { } public Cat(String name,int age) { super(name,age); } public void eat() { System.out.println("貓吃魚"); } public void sleep() { System.out.println("側(cè)著睡"); } } class JumpCat extends Cat implements Jumping { public JumpCat() { } public JumpCat(String name,int age) { super(name,age); } public void jump() { System.out.println("貓?zhí)?); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76972.html
摘要:面向?qū)ο笏枷敫攀隽私饷嫦驅(qū)ο箝_發(fā)就是不斷的創(chuàng)建對(duì)象,使用對(duì)象,指揮對(duì)象做事情。面向?qū)ο笤O(shè)計(jì)其實(shí)就是在管理和維護(hù)對(duì)象之間的關(guān)系。建議文件名稱和測(cè)試類名稱一致。 1.面向?qū)ο笏枷敫攀?了解) A:面向?qū)ο箝_發(fā)就是不斷的創(chuàng)建對(duì)象,使用對(duì)象,指揮對(duì)象做事情。 B:面向?qū)ο笤O(shè)計(jì)其實(shí)就是在管理和維護(hù)對(duì)象之間的關(guān)系。 C:面向?qū)ο筇卣鞣庋b(encapsulation)、繼承(inheritance...
面向?qū)ο笤O(shè)計(jì)是一類編程方式,此編程方式的落地式需要使用類和目標(biāo)來達(dá)到,因此,面向?qū)ο笤O(shè)計(jì)本身就是對(duì)類和目標(biāo)的應(yīng)用,今日給大家介紹一下python面向?qū)ο笤O(shè)計(jì)開發(fā)設(shè)計(jì)及本質(zhì)特征,感興趣的小伙伴一起了解一下吧 序言 面向?qū)ο笤O(shè)計(jì)對(duì)新手而言不難理解但無法運(yùn)用,盡管我們給大家匯總過面向?qū)ο髴?zhàn)略部署方式(定義類、創(chuàng)建對(duì)象、給目標(biāo)發(fā)信息),可是看似簡(jiǎn)單其實(shí)不簡(jiǎn)單。大量程序編寫訓(xùn)練與閱讀高質(zhì)量的編碼有可...
摘要:外部類要訪問內(nèi)部類的成員,必須創(chuàng)建對(duì)象。前提存在一個(gè)類或者接口這里的類可以是具體類也可以是抽象類。 1.package關(guān)鍵字的概述及作用(了解) A:為什么要有包 將字節(jié)碼(.class)進(jìn)行分類存放 包其實(shí)就是文件夾 B:包的概述 舉例: 學(xué)生:增加,刪除,修改,查詢 老師:增加,刪除,修改,查詢 ... 方案1:按照功能分 com.heima.add ...
摘要:可處理中成員變量和參數(shù)重名的情況??煽醋魇且粋€(gè)變量,它的值是當(dāng)前對(duì)象的引用聲明的成員變量為成員變量,它為該類的公用變量,在第一次使用時(shí)被初始化。經(jīng)常出,不用逮壓路面上的小石子異常是提供的用于處理程序中錯(cuò)誤的一種機(jī)制。 Chap 3 Java OO focus on : * 對(duì)象和類的概念 * 類 (對(duì)類) 之間的關(guān)系 * 面向?qū)ο?..
摘要:每次調(diào)用構(gòu)造都執(zhí)行,并且在構(gòu)造方法前執(zhí)行靜態(tài)代碼塊在類中方法外出現(xiàn),并加上修飾用于給類進(jìn)行初始化,隨著類加載而加載,一般用來給類進(jìn)行初始化,在加載的時(shí)候就執(zhí)行,并且只執(zhí)行一次。的構(gòu)造方法這是一條隱藏語句,用來訪問父類中的空參構(gòu)造。 1.代碼塊的概述和分類(了解)(實(shí)際不用) A:代碼塊概述 在Java中,使用{}括起來的代碼被稱為代碼塊。 B:代碼塊分類 根據(jù)其位置和聲明的不同...
閱讀 2132·2021-09-06 15:02
閱讀 1748·2021-08-13 15:02
閱讀 2314·2019-08-29 14:14
閱讀 1472·2019-08-26 13:55
閱讀 558·2019-08-26 13:46
閱讀 3411·2019-08-26 11:41
閱讀 528·2019-08-26 10:27
閱讀 3274·2019-08-23 15:28