1. 程式人生 > >Java基礎_基礎語法知識8

Java基礎_基礎語法知識8

結構 方式 變化 如何 無法 常量 使用 擴展類 too


面向對象

1.final關鍵字
(1).final關鍵字意思是最終的,最後的。

(2).final關鍵字可以修飾類,方法以及變量。

(3).final關鍵字修飾類,這一個類就編程最終類,這一個時候最終類不可以被繼承。
final關鍵字修飾方法,該方法不能夠被重寫,以及覆蓋。
final關鍵字修飾變量,這一個時候該變量就是一個常量,也就是不可以改變值。

(4).final關鍵字在繼承中的使用測試:
//父類
public class Father {
public int num = 10;
public final int num1 = 20;
}
//子類以及測試
public class Son extends Father{

public void sonTest(){
num = 20;
System.out.println("子類訪問的變量是:"+num);
//num1 = 30; 報錯,這裏面的num1訪問的其實是flather父類中的 變量num1,無法未常量賦值,報錯
//System.out.println("子類訪問的變量是:"+num1);
}


public static void main(String[] args) {
Son s = new Son();
s.sonTest();
}
}

(5).final關鍵字的相關測試:
修飾的是基本類型,基本類型的值不可以改變
修飾的是引用類型,引用類型的地址值不可以改變。但是該對象的堆內存值是可以改變的。


//代碼測試
public class Student {
int age = 10;

public static void main(String[] args) {
int x = 10;
x = 100;
System.out.println(x);

final int y = 20;
System.out.println(y);
System.out.println("-------------------");

//局部變量是引用類型
Student st = new Student();
System.out.println(st.age);
st.age = 200;
System.out.println(st.age);
System.out.println("--------------------");

//final關鍵字修飾引用類型,實質保證的是引用類型的地址值不改變,修飾一般類型,那麽就是值不改變
final Student sdt = new Student();
System.out.println(sdt.age);
sdt.age = 300;
System.out.println(sdt.age);
System.out.println("---------------------");

//報錯,無法給最終變量分配值
//sdt =new Student();
}
}

(6).final修飾的變量的初始化時機
A:被final修飾的變量只能夠賦值一次;
B:final修飾的變量的初始化時機是在構造方法之前完畢。(非靜態的常量)

2.面向對象多態的前提和條件

(1).多態的概述
什麽是多態?多態就是某一個事務,在不同的時刻表現出來的不同形態。

舉例:
狗的多態表現:
狗可以是狗的類型。也就是 dog dog = new dog();
狗也是動物的類型,狗也是屬於一種動物。也就是 動物 dog = new dog();

水的三態變化
水是屬於水類型。 water wt = new water();
水汽也是屬於水的類型,其實質也是水。水汽 wt = new water();
冰也是屬於水的類型,其實質也是水。 冰 wt = new water();

(2).多態的前提
A:倆個類必須有繼承的關系。
B:有方法的重寫。
沒有方法的重寫,那麽這倆個類之間的關系就沒有意義。
C:有父類的引用指向子類。
父類 f = new 子類;


(3).一個多態的基本例子(多態中的成員訪問特點)
A:成員變量
編譯看左邊,運行看左邊。
B:構造方法
創建子類對象的時候,訪問父類的構造方法,對父類的數據進行初始化。
C:成員方法
編譯看左邊,運行看右邊。
D:靜態方法
編譯看左邊,運行看左邊。
(靜態和類相關,算不上重寫,所以,訪問還是左邊)

由於成員方法存在著方法重寫,所以它運行看右邊。

(4).代碼實現:
//父類
public class Father {
public int num = 100;
public void show(){
System.out.println("show fu");
}
public static void function(){
System.out.println("function father");
}
}

//子類以及測試
public class Son extends Father{

public int num = 200;
public int num2 = 1000;

public void show(){
System.out.println("show zi");
}

public void method(){
System.out.println("method zi");
}

public static void function(){
System.out.println("function son");
}

public static void main(String[] args) {
Father f = new Son();
//編譯看左邊,運行看左邊。輸出結果:100
System.out.println(f.num);
//找不到符號
//System.out.println(f.num2);
//show zi
f.show();
//報錯,找不到方法
//f.method();
f.function();
}
}

//運行結果:
100
show zi
function father

(5).多態的好處
A:提高了代碼的維護性(由繼承保證)
B:提高了代碼的擴展性(由多態保證)

代碼實現:[*****]

Animal.java

public class Animal {
public void eat(){
//System.out.println("eat");
}
public void sleep(){
//System.out.println("sleep");
}
}

//擴展類1
Dog.java
public class Dog extends Animal{

public void eat(){
System.out.println("狗吃肉");
System.out.println("狗具體吃什麽肉還可以在這裏面添加");
}

public void sleep(){
System.out.println("狗趴著睡覺");
System.out.println("狗如何睡覺方法還可以在這裏面添加");
}
}

//擴展類2
public class Cat extends Animal{

public void eat(){
System.out.println("貓吃魚");
}

public void sleep(){
System.out.println("貓躺著睡覺");
}
}

//操作的工具類
//針對動物進行操作的工具類
public class AnimalTools {

//私有化構造
private AnimalTools(){}

public static void UseAnimal(Animal a){
a.eat();
a.sleep();

}
}

//測試類
public class TestDemo {
public static void main(String[] args) {
Cat c = new Cat();
Cat c2 = new Cat();
AnimalTools.UseAnimal(c);
AnimalTools.UseAnimal(c2);
System.out.println("---------");
Dog d = new Dog();
Dog d1 = new Dog();
AnimalTools.UseAnimal(d);
AnimalTools.UseAnimal(d1);

}
}

//由上面的代碼可以看出,多態其實就是一個樹形結構的數據結構,從根(父類)到每一個具體的葉子(子類或者是實現類),我們
可以通過訪問根的方式去訪問每一個葉子節點。

(6).多態的弊端
只能夠使用父類中定義過的方法,不能夠使用子類的特有方法,也就是說子類如果要定義一個自己特有的方法,那麽這個就必須
在父類中也有相同的方法聲明。



3.多態中的轉型問題[*****]

(1).為什麽會出現多態中的轉型?
多態中的轉型問題主要是為了解決多態的弊端。為了能夠讓子類自己也能夠使用子類的特有功能這一個時候就需要把父類和
子類之間進行一個按照需求的轉化。

(2).向上轉型
Fu f = new Zi();
向下轉型
Zi z = (Zi) f; //但是要求f必須是能夠轉化為子的

4.面向對象多態案例
//父類
public class Animal {
public void eat(){
//System.out.println("eat");
}
public void sleep(){
//System.out.println("sleep");
}

}

//倆個子類
//狗類
public class Dog extends Animal{

public void eat(){
System.out.println("狗吃肉");
System.out.println("狗具體吃什麽肉還可以在這裏面添加");
}

public void sleep(){
System.out.println("狗趴著睡覺");
System.out.println("狗如何睡覺方法還可以在這裏面添加");
}

//狗自己特有的方法
public void lookHome(){
System.out.println("小狗可以看家");
}
}

//貓類
public class Cat extends Animal{

public void eat(){
System.out.println("貓吃魚");
}

public void sleep(){
System.out.println("貓躺著睡覺");
}

//貓自己特有的
public void catchMouse(){
System.out.println("小貓可以抓老鼠");
}
}

//父類的工具類
//針對動物進行操作的工具類
public class AnimalTools {

//私有化構造
private AnimalTools(){}

public static void UseAnimal(Animal a){
a.eat();
a.sleep();

}
}

//測試類
public class TestDemo {
public static void main(String[] args) {
Animal cat = new Cat();
//通用方法調用
AnimalTools.UseAnimal(cat);
//向下轉型
Cat cat2 = (Cat)cat;
cat2.catchMouse();
System.out.println("------------------");
Animal dog = new Dog();
AnimalTools.UseAnimal(dog);
Dog dog2 = (Dog) dog;
dog2.lookHome();
}
}

Java基礎_基礎語法知識8