摘要:案例演示抽象類的成員特點抽象類的成員方法特性抽象方法強制要求子類做的事情。抽象類中定義的是該繼承體系的共性功能。
1.多態的概述及其成員訪問特點代碼體現
A:多態(polymorphic)概述
事物存在的多種形態
B:多態前提-
1.要有繼承關系
2.要有方法重寫
3.要有父類引用指向子類對象。
C:多態中的成員訪問特點之
成員變量:編譯和運行都看父類。
成員方法:編譯看父類,運行看子類(非靜態)。
靜態成員方法:編譯和運行都看父類—— (靜態和類相關,算不上重寫,訪問還是父類)
class JavaObject { public static void main(String [] args) { Father a = new Son(); //父類引用指向子類對象 System.out.println(a.num);//成員變量-編譯看父類,運行也看父類。 Father f = new Son(); f.print(); //成員方法非靜態運行看子類 f.method(); //靜態和類相似,相當于是Father.methond()。 } } class Father { int num = 10; public void print () { System.out.println("父級"); } public static void method() { System.out.println("father static method"); } } class Son extends Father { int num = 20; public void print () { System.out.println("子級"); } public static void method() { System.out.println("son static method"); } }2.李明和老李的故事-多態向上向下轉型
A:案例分析-通過該案例幫助理解多態的現象
B:詳細講解多態中向上轉型和向下轉型
class JavaObject { public static void main(String [] args) { Boy b = new Man(); //父類引用指向子類對象,人類 System.out.println(b.name); //父類引用指向子類對象就是向上轉型 b.eat(); Man m = (Man)b; //向下轉型 m.work(); //多肽的弊端,不能直接使用子類的 //基本數據類型自動類型提升和強制類型轉換 int i = 10; byte c = 20; //i = c; //自動類型提升 c = (byte)i; //強制類型轉換 } } 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.多態的好處和弊端
A:多態的好處
a:提高了代碼的維護性(繼承保證)
b:提高了代碼的擴展性(由多態保證)
B:案例演示
多態的好處
可以當作形式參數,可以接收任意子類對象
C:多態的弊端
不能使用子類的特有屬性和行為。
D:案例演示
method(Animal a)
method(Cat c)
class JavaObject { public static void main(String [] args) { //Cat c1 = new Cat(); //父類引用指向子類對象,人類 //c1.Cat(); method(new Cat()); method(new Dog()); //Animal a = new Cat();開發很少用父類引用指向子類對象,直接創建子類對象使用其特有屬性和行為。 } /*public static void method(Cat c) { //主類加靜態 c.eat(); } public static void method(Dog d) { d.eat(); }*/ public static void method(Animal a) {//當作參數的時候用多態最好,因為擴展性強 //Cat c = (Cat)a;強轉會出現類型轉換異常,ClassCastException //關鍵字 instanseof 判斷前邊的引用是否是后邊的數據類型 if (a instanceof Cat) { Cat c = (Cat)a;//向下轉型,轉向子類 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("動物吃飯"); } } 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.多態中的題目分析題
A:看下面程序是否有問題,如果沒有,說出結果
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:看下面程序是否有問題,如果沒有,說出結果
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.抽象類的概述及其特點
A:抽象類概述
抽象就是看不懂的
B:抽象類特點
a:抽象類和抽象方法必須用abstract關鍵字修飾
abstract class 類名 {}
public abstract void eat();
b:抽象類不一定有抽象方法,有抽象方法的類一定是抽象類或者是接口
c:抽象類不能實例化那么,抽象類如何實例化呢?
按照多態的方式,由具體的子類實例化。其實這也是多態的一種,抽象類多態。
d:抽象類的子類
要么是抽象類
要么重寫抽象類中的所有抽象方法
C:案例演示
抽象類特點
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.抽象類的成員特點
A:抽象類的成員特點
a:成員變量:既可以是變量,也可以是常量;abstract不能修飾成員變量。
b:構造方法:有。
用于子類訪問父類數據的初始化。
c:成員方法:既可以是抽象的,也可以是非抽象的。
B:案例演示
抽象類的成員特點
C:抽象類的成員方法特性:
a:抽象方法 強制要求子類做的事情。
b:非抽象方法 子類繼承的事情,提高代碼復用性。
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("坐飛機"); } }8.抽象類練習貓狗案例
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.抽象類練習老師學生案例
A:案例演示
具體事物:基礎班老師,就業班老師
共性:姓名,年齡,講課。
具體事物:基礎班學生,就業班學生
共性:姓名,年齡,學習
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("基礎班老師講課"); } } class Teacher2 extends Teacher { public Teacher2() { } public Teacher2(String name,int age) { super(name,age); } public void teach() { System.out.println("就業班老師講課"); } } abstract class Student extends Person { public Student() { } public Student(String name,int age) { super(name,age); } public abstract void study(); //學習抽象方法 } class Student1 extends Student { public Student1() { } public Student1(String name,int age) { super(name,age); } public void study() { System.out.println("基礎班學生學習"); } } class Student2 extends Student { public Student2() { } public Student2(String name,int age) { super(name,age); } public void study() { System.out.println("就業班學生學習"); } }10.抽象類練習員工案例
A:案例演示
假如我們在開發一個系統時需要對程序員類進行設計,程序員包含3個屬性:姓名、工號以及工資。
經理,除了含有程序員的屬性外,另為還有一個獎金屬性。
請使用繼承的思想設計出程序員類和經理類。要求類中提供必要的方法進行屬性訪問。
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() + ",工號是" + this.getId() + ",工資是" + this.getSalary() + ",工作是敲代碼"); } } class Manager extends Employee { private int bonus; //獎金 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("獎金是" + bonus + ",姓名是" + this.getName() + ",工號是" + this.getId() + ",工資是" + this.getSalary() + ",工作是管理"); } }11.抽象類中的面試題
A:面試題1
一個抽象類如果沒有抽象方法,可不可以定義為抽象類?如果可以,有什么意義?
可以
這么做目的只有一個,就是不讓其他類創建本類對象,交給子類完成
B:abstract不能和哪些關鍵字共存
abstract和static
被abstract修飾的方法沒有方法體
被static修飾的可以用類名.調用,但是類名.調用抽象方法是沒有意義的
abstract和final
被abstract修飾的方法強制子類重寫
被final修飾的不讓子類重寫,所以他倆是矛盾的
abstract和private
被abstract修飾是為了讓子類看到并強制重寫
被private修飾不讓子類訪問,所以他倆是矛盾的
abstract class Demo { public static abstract void print();// 錯誤: 非法的修飾符組合: abstract和static public final abstract void print();//錯誤: 非法的修飾符組合: abstract和final private abstract void print(); //錯誤: 非法的修飾符組合: abstract和private }12.接口的概述及其特點
A:接口概述
從狹義的角度講就是指java中的interface
從廣義的角度講對外提供規則的都是接口
B:接口特點
a:接口用關鍵字interface表示
interface 接口名 {}
b:類實現接口用implements表示
class 類名 implements 接口名 {}
c:接口不能實例化
那么,接口如何實例化呢?
按照多態的方式來實例化。
d:接口的子類
a:可以是抽象類。但是意義不大。
b:可以是具體類。要重寫接口中的所有抽象方法。(推薦方案)
C:案例演示
接口特點
abstract class JavaObject { //抽象類 public static void main(String [] args) { //Inter i = new Inter(); //接口不能被實例化,調用抽象方法沒有意義 Inter i = new Demo(); //父類引用指向子類對象 i.print(); } } interface Inter { public abstract void print(); //接口中的方法都是抽象的 } class Demo implements Inter{ public void print() { System.out.println("print"); } }13.接口的成員特點
A:接口成員特點
成員變量;只能是常量,并且是靜態的并公共的。
默認修飾符:public static final
建議:自己手動給出。
構造方法:接口沒有構造方法。
成員方法:只能是抽象方法。
默認修飾符:public abstract
建議:自己手動給出。
B:案例演示
接口成員特點
abstract class JavaObject { //抽象類 public static void main(String [] args) { //Inter i = new Inter(); //接口不能被實例化,調用抽象方法沒有意義 Demo d = new Demo(); //父類引用指向子類對象 d.print(); System.out.println(Inter.num); } } interface Inter { public static final int num = 10; public Inter(){} //接口中沒有構造方法 public abstract void print(); //接口中的方法都是抽象的 public void print() { //接口中不能定義非抽象方法 } public abstract void print(); } class Demo /*extends Object*/implements Inter{ //一個類不寫繼承任何類,默認繼承Object類。 public void print() { //num = 20; System.out.println(num); } public Demo() { super(); } }14.類與類,類與接口,接口與接口的關系
A:類與類,類與接口,接口與接口的關系
a:類與類:
繼承關系,只能單繼承,可以多層繼承。
b:類與接口:
實現關系,可以單實現,也可以多實現。
并且還可以在繼承一個類的同時實現多個接口。
c:接口與接口:
繼承關系,可以單繼承,也可以多繼承。
B:案例演示
類與類,類與接口,接口與接口的關系
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.抽象類和接口的區別
A:成員區別
抽象類:
成員變量:可以變量,也可以常量
構造方法:有
成員方法:可以抽象,也可以非抽象
接口:
成員變量:只可以常量
成員方法:只可以抽象
B:關系區別
類與類
繼承,單繼承
類與接口
實現,單實現,多實現
接口與接口
繼承,單繼承,多繼承
C:設計理念區別
抽象類 被繼承體現的是:”is a”的關系。抽象類中定義的是該繼承體系的共性功能。
接口 被實現體現的是:”like a”的關系。接口中定義的是該繼承體系的擴展功能。
16.貓狗案例加入跳高功能分析及其代碼實現
A:案例演示
動物類:姓名,年齡,吃飯,睡覺。
貓和狗
動物培訓接口:跳高
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("側著睡"); } } class JumpCat extends Cat implements Jumping { public JumpCat() { } public JumpCat(String name,int age) { super(name,age); } public void jump() { System.out.println("貓跳高"); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76972.html
摘要:面向對象思想概述了解面向對象開發就是不斷的創建對象,使用對象,指揮對象做事情。面向對象設計其實就是在管理和維護對象之間的關系。建議文件名稱和測試類名稱一致。 1.面向對象思想概述(了解) A:面向對象開發就是不斷的創建對象,使用對象,指揮對象做事情。 B:面向對象設計其實就是在管理和維護對象之間的關系。 C:面向對象特征封裝(encapsulation)、繼承(inheritance...
面向對象設計是一類編程方式,此編程方式的落地式需要使用類和目標來達到,因此,面向對象設計本身就是對類和目標的應用,今日給大家介紹一下python面向對象設計開發設計及本質特征,感興趣的小伙伴一起了解一下吧 序言 面向對象設計對新手而言不難理解但無法運用,盡管我們給大家匯總過面向對象戰略部署方式(定義類、創建對象、給目標發信息),可是看似簡單其實不簡單。大量程序編寫訓練與閱讀高質量的編碼有可...
摘要:外部類要訪問內部類的成員,必須創建對象。前提存在一個類或者接口這里的類可以是具體類也可以是抽象類。 1.package關鍵字的概述及作用(了解) A:為什么要有包 將字節碼(.class)進行分類存放 包其實就是文件夾 B:包的概述 舉例: 學生:增加,刪除,修改,查詢 老師:增加,刪除,修改,查詢 ... 方案1:按照功能分 com.heima.add ...
摘要:可處理中成員變量和參數重名的情況。可看作是一個變量,它的值是當前對象的引用聲明的成員變量為成員變量,它為該類的公用變量,在第一次使用時被初始化。經常出,不用逮壓路面上的小石子異常是提供的用于處理程序中錯誤的一種機制。 Chap 3 Java OO focus on : * 對象和類的概念 * 類 (對類) 之間的關系 * 面向對象...
摘要:每次調用構造都執行,并且在構造方法前執行靜態代碼塊在類中方法外出現,并加上修飾用于給類進行初始化,隨著類加載而加載,一般用來給類進行初始化,在加載的時候就執行,并且只執行一次。的構造方法這是一條隱藏語句,用來訪問父類中的空參構造。 1.代碼塊的概述和分類(了解)(實際不用) A:代碼塊概述 在Java中,使用{}括起來的代碼被稱為代碼塊。 B:代碼塊分類 根據其位置和聲明的不同...
閱讀 2113·2021-09-06 15:02
閱讀 1740·2021-08-13 15:02
閱讀 2301·2019-08-29 14:14
閱讀 1464·2019-08-26 13:55
閱讀 547·2019-08-26 13:46
閱讀 3401·2019-08-26 11:41
閱讀 508·2019-08-26 10:27
閱讀 3257·2019-08-23 15:28