java學習第五天

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>();   }}

相關文章
相關標籤/搜索