final 關鍵字
能夠修飾類,屬性,方法java
一、修飾變量(成員變量或局部變量),則稱爲常量.只能賦值一次安全
二、修飾方法,該方法不能被重寫ide
三、修飾類,則該類不能被繼承this
--------------------------------------------------------------
final 修飾的類表示,這個類是最終類,是沒法被繼承的,也就是說它沒有子類對象
運用場景:不想讓其有子類的場景下使用(處於安全的考慮)繼承
final 修飾方法 表示該方法是最終方法,沒法被子類進行重寫,可是能夠繼承ip
運用場景:不想讓其有子類的修改父類核心功能
public /*final */class Father {
//String
public final void info(){
System.out.println("Father.info()");
}
}內存
-------------------------------------------------------------------------it
/*
* final 修飾類:
* 一、表示類是最終類,不能被繼承
* 二、運用場景:不想讓其有子類的場景下使用(處於安全的考慮)
*
*
* final 修飾屬性
* 一、聲明的時候必須指定具體的
* 二、基本類型,在指定具體的值後,沒法修改
* 三、引用類型,在指定具體的值後,沒法修改,可是,能夠修改引用對象的具體屬性(非final)
* 四、運用場景:在內部類使用
*
* final 修飾方法
* 一、表示最終方法,不能被子類重寫,能夠繼承
* 二、運用場景:不想讓其有子類的修改父類核心功能
*
* final 跟 static 配合使用
* 一、表示常量
* 二、運用場景: 系統參數的標識 1 / 0
*
*/
public class FinalDemo {
public final static String TAG = "FinalDemo" ;
/**
* Multiple markers at this line
- The value of the field FinalDemo.intField is not
used
- The blank final field intField may not have been
initialized
*/
//final修飾的 基本數據類型的變量(成員或局部)時,必須指定具體的值
private final int intField = 1;
//The blank final field son may not have been initialized
//final修飾的 引用類型的變量時,變量指定內存地址不能改變,可是,對象中的屬性
//只要不是final修飾的屬性,均可以改變
public final Son son = new Son();
//shift + ctrl + x
public final static int SYSTEM_PARAM = 1; //常量
public final static int LOGIN_STATUS_SUCCESS = 1; //常量
public static void main(String[] args) {
final int intField2 = 2;
FinalDemo finalDemo = new FinalDemo();
//The final field FinalDemo.intField cannot be assigned
//final 修飾的基本類型的變量(成員或局部)時,一旦賦值了,那麼就沒法從新賦值了
//finalDemo.intField = 2;
//intField2 = 3;
finalDemo.son.name = "這是被改後的son 的name值";
//The final field FinalDemo.son cannot be assigned
//finalDemo.son = new Son();
}
}io
-----------------------------------------------------------------------
java.lang.Object 類是全部類的父類
組合 跟 繼承
class Father{
public void info(){
}
}
class Son extends Father{ //繼承
}
class NoSon{ //組合/聚合
Father father = new Father();
public void info(){
father.info();
}
}
class Test{
main(){
Son son = new Son();
son.info();
NoSon noson = new NoSon();
noson.info();
}
}
運用場景:若是2個類有父子關係的時候,用繼承,其餘狀況下使用組合
---------------------------------------------------------------------------
向上轉型 和 向下轉型
public class Pet {
}
public class Cat extends Pet {
}
public class Dog extends Pet {
}
public class Test {
public static void main(String[] args) {
Pet pet = new Pet();
//向上轉型
Pet pet2 = new Dog();
//向下轉型 須要強轉,須要本身承擔風險
Dog dog2 = (Dog) pet;
Cat cat = (Cat) pet;
}
}
/**
* 向上轉型:eg:Pet pet = new Dog("旺財", "狗");
* 一、不須要強制轉換
* 二、能夠訪問父類的方法,屬性
* 三、沒法訪問子類特有的方法及屬性(對子類方法或屬性進行遮蔽)
*
* 向下轉型:
* 一、須要強制轉換
* 二、若是把一個類型轉換成其餘類型,編譯沒有報錯,執行報錯:
* java.lang.ClassCastException --類轉換異常
* 三、若是把一個類型轉換成其餘類型,而後再由其餘類型轉換會本類型,編譯執行都經過
*/
-------------------------------------------------------------------
instaceof 和向上轉型 和 向下轉型 配合使用
instaceof 關鍵字 --> 用來判斷該引用類型變量所"指向"的對象是否賦予該類
-----------------------------------------------------------------------------------------
一、父類
public class Pet {
public String name;
public String type;
public Pet(){}
public Pet(String name, String type) {
super();
this.name = name;
this.type = type;
}
public void eat(){
System.out.println("Pet 吃飯了。。。");
}
}
二、子類
public class Bird extends Pet{
public String color = "red";
public Bird(String color) {
this.color = color;
}
public Bird(String name, String type) {
super(name, type);
}
public void eat(){
System.out.println("鳥 吃蟲。。。");
}
public void fly(){
System.out.println("鳥 飛得更高。。。");
}
三、子類
public class Dog extends Pet {
public String voice = "汪汪";
public Dog(String voice) {
this.voice = voice;
}
public Dog(String name, String type) {
super(name, type);
}
public void look(){
System.out.println("Dog 看門。。。");
}
//犬吠
public void bark(){
System.out.println(super.name + "汪汪地叫了....");
}
public void eat(){
System.out.println("Dog 吃G(c)T(s)。。。");
}
}
四、子類
public class Cat extends Pet{
public String life = "9條命...";
public Cat(){}
public Cat(String life) {
this.life = life;
}
public Cat(String name, String type) {
super(name, type);
}
public void eat(){
System.out.println("Cat 吃魚。。。");
}
public void catchL(){
System.out.println("Cat 抓老鼠....");
}
@Override
public String toString() {
return "Cat [life=" + life + "]";
}
}
public class Girl { @Override public String toString() { System.out.println("-----"); return super.toString(); } //對象多態(類繼承上) public void play(Pet pet){ // 等價於:Pet pet = new Dog("旺財", "狗"); System.out.println("play with "+pet.name+"..."); //傳狗的時候,bark //instanceof 來判斷該引用類型變量所「指向」的對象是否屬於該類 if(pet instanceof Dog){ //向下轉型 ((Dog) pet).bark(); } //傳貓的時候,catchL if(pet instanceof Cat){ //向下轉型 ((Cat) pet).catchL(); } //傳鳥時候,fly if(pet instanceof Bird){ //向下轉型 ((Bird) pet).fly(); } } public static void main(String[] args) { Dog dog = new Dog("旺財", "哈二"); Cat cat = new Cat("加菲貓", "肥貓"); Bird bird = new Bird("虎皮貓", "鸚鵡"); Girl girl = new Girl(); girl.play(bird); girl.play(cat); girl.play(dog); //List<String> list = new ArrayList<String>(); }}