對象的轉型
~~~
package obj.b8;
/**
對象的轉型:
1.對象的向上轉型 子類轉成父類 默認進行 父類引用指向子類對象
2.對象的向下轉型 父類轉成子類 強制進行
關鍵字:instanceof 測試左邊的對象是否是右邊類的實例 ,如果是返回true,不是返回false
*/
class Animal{
void sleep(){
System.out.println("睡覺中");
}
}
class Cat extends Animal{
void catchMouse(){
System.out.println("捕鼠");
}
}
class Dog extends Animal{
}
public class Test {
public static void main(String[] args) {
Animal a = new Cat();//向上
System.out.println(a instanceof Animal);//true
System.out.println(a instanceof Cat);//true
Cat c =(Cat)a;//向下 所以強制
a.sleep();//存在
//a.catchMouse();//不存在//將貓當動物看待
c.sleep();//存在
c.catchMouse();//存在
//Dog d =(Dog)a;//編譯沒錯,但運行會出現類型不匹配錯誤
}
}
~~~
多態的概述
~~~
package obj.b9;
/*
OOP三大特寫:封裝,繼承,多態
多態:可以理解為事物存在的多種體現形態
動物:貓,狗,豬
人:男人 女人
*/
class Animal{
void sing(){
System.out.println("唱歌");
}
}
class Dog extends Animal{
void sing(){
System.out.println("汪汪汪唱歌");
}
}
class Cat extends Animal{
void sing(){
System.out.println("喵喵喵唱歌");
}
void catchMouse(){
System.out.println("捕鼠");
}
}
public class Test {
public static void main(String[] args) {
Cat a=new Cat();
Dog b=new Dog();
/*a.sing();
b.sing();*/
function(a);
function(b);
}
/*public static void function(Cat c){
c.sing();
}
public static void function(Dog c){
c.sing();
}*/
public static void function(Animal c){
c.sing();
}
}
~~~
~~~
1.多態的體現
父類引用指向子類對象
2.多態的前提
(1)必須得類與類之間存在關系,可以是繼承關系,也可以是實現關系
(2)必須得重寫
3.多態的好處
大大提高了程序的可擴展性
4.多態的弊端
只能用父類的引用,訪問到父類中的成員
多態成員變量的特點:
1.編譯期間:參閱的是引用型變量所屬的類中是否有調用的方法
2.運行期間:參閱對象所屬的類中是否有調用的方法
~~~
對比:
沒有多態
~~~
package obj.c1;
import java.util.*;
class FK{
void bx(){
System.out.println("變形");
}
}
class FK_szx extends FK{//山字型
void bx(){
System.out.println("山字型在變形");
}
}
class FK_lzx extends FK{//L字型
void bx(){
System.out.println("L字型在變形");
}
}
class FK_zzx extends FK{//Z字型
void bx(){
System.out.println("Z字型在變形");
}
}
class FK_cfx extends FK{//長方形
void bx(){
System.out.println("長方形在變形");
}
}
public class Test {
public static void main(String[] args) {
Random r =new Random();
int a=r.nextInt(4);//0,1,2,3
switch(a){
case 0:
FK_szx szx=new FK_szx();
szx.bx();
break;
case 1:
FK_lzx lzx=new FK_lzx();
lzx.bx();
break;
case 2:
FK_zzx zzx=new FK_zzx();
zzx.bx();
break;
case 3:
FK_cfx cfx=new FK_cfx();
cfx.bx();
break;
}
}
}
~~~
使用了多態
~~~
package obj.c1;
import java.util.*;
class FK{
void bx(){
System.out.println("變形");
}
}
class FK_szx extends FK{//山字型
void bx(){
System.out.println("山字型在變形");
}
}
class FK_lzx extends FK{//L字型
void bx(){
System.out.println("L字型在變形");
}
}
class FK_zzx extends FK{//Z字型
void bx(){
System.out.println("Z字型在變形");
}
}
class FK_cfx extends FK{//長方形
void bx(){
System.out.println("長方形在變形");
}
}
public class Test {
public static void main(String[] args) {
Random r =new Random();
int a=r.nextInt(4);//0,1,2,3
FK fk=null;
switch(a){
case 0:
fk=new FK_szx();
break;
case 1:
fk=new FK_lzx();
break;
case 2:
fk=new FK_zzx();
break;
case 3:
fk=new FK_cfx();
break;
}
fk.bx();
}
}
~~~
- 書寫心得
- 1.初識Java
- 2.變量、數據類型和運算符
- 實例:數據的輸入
- 實例:變量互換
- 3.條件選擇結構
- 案例:判斷年份是否為閏年
- 案例:生成隨機數
- 實例:剪刀石頭布
- 4.循環結構
- 實例:猜數字游戲
- Myeclipse
- 實例:九九乘法表
- 實例:日歷
- 5.數組
- JVM內存分析
- 鍵盤錄入賦值數組
- 數組的length屬性
- 數組的最大值(打擂臺)
- 數組的排序
- 數組復制算法
- 數組的查找算法(搜索)
- 數組的插入算法
- 數組的冒泡算法
- 數組的選擇排序
- 多維數組
- 實例:學生成績管理系統
- 類和對象
- 概念
- 內存分析
- 創建類和對象
- 面向對象與內存分析
- 有參數無(有)返回值的調用
- 成員變量
- return和多參方法
- toString方法
- this關鍵字
- 封裝
- 方法的重載
- 構造方法
- 階段性總結
- 實例:學生管理系統
- Test.java
- Student.java
- Admin.java
- 構造代碼塊及構造函數之間的調用
- main方法和靜態應用工具類及classpath
- static關鍵字
- 文檔注釋和靜態代碼塊及單例模式
- 繼承
- 多態
- 匿名對象和toString()和equals及final
- 抽象類和模板方法設計模式
- 接口
- 包機制和包與包之間的訪問權限和jar包