Java自學筆記之面向對象思想

面向對象的三大特徵
封裝  (Encapsulation)
繼承  (Inheritance)
多態  (Polymorphism)

===================================Start 1=================================
class Person{
 int age;
 void shout(){
  //int age = 60;成員變量隱藏
  System.out.println("Mys age is "+age);
 }
 public static void main(String[] args){
  Person p1 = new Person();
  Person p2 = new Person();
  //p1.age = -30;
  p1.shout();
  p2.shout();
  
  String str1 = new String("abc");
  String str2 = new String("abc");
  String str3 = str1;
  if(str1==str2){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  if(str1.equals(str2)){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  if(str1==str3){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  
  getSomeOne(p1);
  getSomeOne(p2);
  getSomeOne(new Person());//傳值時常用
 }
 public static void getSomeOne(Person p){
  p.shout();
 }
}
/*
result:
Mys age is 0
Mys age is 0
false
true
true
Mys age is 0
Mys age is 0
Mys age is 0
*/
================================End 1=================================

================================Start 2===============================
class Person{
 private int age;
 void shout(){
  //int age = 60;成員變量隱藏
  System.out.println("Mys age is "+age);
 }
}
class TestPerson{
 public static void main(String[] args){
  Person p1 = new Person();
  Person p2 = new Person();
  p1.age = -30;//提示爲Person中私有
  p1.shout();
  p2.shout();
  
  String str1 = new String("abc");
  String str2 = new String("abc");
  String str3 = str1;
  if(str1==str2){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  if(str1.equals(str2)){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  if(str1==str3){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  
  getSomeOne(p1);
  getSomeOne(p2);
  getSomeOne(new Person());
 }
 public static void getSomeOne(Person p){
  p.shout();
 }
}
================================End 2====================================

================================Start 3==================================
class Person{
 private int age;
 void shout(){
  //int age = 60;成員變量隱藏
  System.out.println("Mys age is "+age);
 }
 public static void main(String[] args){
  Person p1 = new Person();
  Person p2 = new Person();
  p1.age = -30;//提示爲Person中私有
  p1.shout();
  p2.shout();
  
  String str1 = new String("abc");
  String str2 = new String("abc");
  String str3 = str1;
  if(str1==str2){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  if(str1.equals(str2)){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  if(str1==str3){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  
  getSomeOne(p1);
  getSomeOne(p2);
  getSomeOne(new Person());
 }
 public static void getSomeOne(Person p){
  p.shout();
 }
}
class TestPerson{
 public static void main(String[] args){
  Person p1 = new Person();
  Person p2 = new Person();
  //p1.age = -30;//提示爲Person中私有
  p1.shout();
  p2.shout();
  
  String str1 = new String("abc");
  String str2 = new String("abc");
  String str3 = str1;
  if(str1==str2){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  if(str1.equals(str2)){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  if(str1==str3){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  
  getSomeOne(p1);
  getSomeOne(p2);
  getSomeOne(new Person());
 }
 public static void getSomeOne(Person p){
  p.shout();
 }
}
//哪個有“main”方法運行哪個
=================================End 3===================================

=================================Start 4=================================
class Person{
 private int age;//封裝
 public void setAge(int age){
  if(age<0)//可進行判斷
   return ;
  this.age = age;
 }
 public int getAge(){
  return this.age;
 }
 void shout(){
  //int age = 60;成員變量隱藏
  System.out.println("Mys age is "+age);
 }
}
class TestPerson{
 public static void main(String[] args){
  Person p1 = new Person();
  Person p2 = new Person();
  p1.age = -30;//提示爲Person中私有
  p1.shout();
  p2.shout();
  
  /*String str1 = new String("abc");
  String str2 = new String("abc");
  String str3 = str1;
  if(str1==str2){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  if(str1.equals(str2)){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  if(str1==str3){
   System.out.println("true");
  }else{
   System.out.println("false");
  }*/
  
  /*getSomeOne(p1);
  getSomeOne(p2);
  getSomeOne(new Person());*/
 }
 /*public static void getSomeOne(Person p){
  p.shout();
 }*/
}
==================================End 4==================================

==================================Start 5================================
class Person{
 private int age;
 private String name;
 
 public Person(){//我們不寫構造方法,系統自動創建一個,但一但定義了構造系統將不再產生默認構造方法
 }
 public Person(int age){
  age = age;//這樣寫編譯運行沒有問題,但結果不正確
 }
 public Person(String xname,int age){//這樣寫也可以,xname--name
  name = xname;
  //age = age;//這樣寫編譯運行沒有問題,但結果不正確
  this.age = age;
 }
 
 public void setAge(int age){
  if(age<0)//可進行判斷
   return ;
  this.age = age;
 }
 public int getAge(){
  return age;
 }
 void shout(){
  //int age = 60;成員變量隱藏
  System.out.println(name+"'s age is "+age);
 }
}
class TestPerson{
 public static void main(String[] args){
  Person p1 = new Person(30);
  Person p2 = new Person("zhoujiaoshou",20);
  //p1.age = -30;//提示爲Person中私有
  p1.shout();
  //p1.getAge();
  p2.shout();
  //p2.getAge();
  
  /*String str1 = new String("abc");
  String str2 = new String("abc");
  String str3 = str1;
  if(str1==str2){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  if(str1.equals(str2)){
   System.out.println("true");
  }else{
   System.out.println("false");
  }
  if(str1==str3){
   System.out.println("true");
  }else{
   System.out.println("false");
  }*/
  
  /*getSomeOne(p1);
  getSomeOne(p2);*/
  getSomeOne(new Person());//我們不寫構造方法,系統自動創建一個,但一但定義了構造
        //系統將不再產生默認構造方法,如果這時沒有上面寫的無參構造將出錯
 }
 public static void getSomeOne(Person p){
  p.shout();
 }
}
result:
null's age is 0
zhoujiaoshou's age is 20
null's age is 0
================================End 5===================================

================================Start 6=================================
//演示"this"的用法
class Person{
 
 private String name;
 
 public Person(){
 }
 public Person(String name){
  this.name = name;
 }
 
 public void fun1(){
  System.out.println(name);
 }
 public void fun2(){
  Person a2 = new Person("a2");
  a2.fun1();
  this.fun1();//這裏也可以寫成"fun1()",系統會進行識別
 }
 public static void main(String[] args){
  Person a1 = new Person("a1");
  a1.fun2();
 }
}
result:
a2
a1

//this又一用法,構造方法中調用另一構造方法
class Person{
 
 private String name;
 
 public Person(){
  System.out.println("被/"this/"調用");
 }
 public Person(String name){
  this();//注意:this的又一用法
  this.name = name;
 }
 
 public void fun1(){
  System.out.println(name);
 }
 public void fun2(){
  Person a2 = new Person("a2");
  a2.fun1();
  this.fun1();
 }
 public static void main(String[] args){
  Person a1 = new Person("a1");
  a1.fun2();
 }
}
說明:this引用句柄的存放位置
每個成員方法內部,都有一個this引用變量,指向調用這個方法的對象

this引用句柄的應用
一個類中的成員方法可以直接調用同類中的其他成員,其實我們在一個方法內部使用“this.其他成員”的引用方式和直接使用“其他成員”的效果是一樣的,那this還有多大的作用呢?在有些情況下,我們還是非得用this關鍵字不可的 :
1. 讓類的成員變量名和對其進行賦值的成員方法的形參變量同名是必要的,這樣的代碼誰看了都能明白這兩個變量是彼此相關的,老手看到函數的定義,就能揣摩出函數中的代碼,大大節省了別人和自己日後閱讀程序的時間。
2. 假設我們有一個容器類和一個部件類,在容器類的某個方法中要創建部件類的實例對象,而部件類的構造方法要接收一個代表其所在容器的參數。
3. 構造方法是在產生對象時被java系統自動調用的,我們不能在程序中象調用其他方法一樣去調用構造方法。但我們可以在一個構造方法裏調用其他重載的構造方法,不是用構造方法名,而是用this(參數列表)的形式,根據其中的參數列表,選擇相應的構造方法。

=================================End 6==================================

=================================Start 7================================
//垃圾回收演示
class Person{
 
 public Person(){
  System.out.println("我被創建了!");
 }
 public void finalize(){
  System.out.println("ZHOUJIAOSHOU我來收垃圾啦!");
 }
 public static void main(String[] args){
  new Person();
  new Person();
  Person l=new Person();
  l.finalize();
  //System.gc();
 }
}
/*
finalize
protected void finalize()
                 throws Throwable當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。子類重寫 finalize 方法,以配置系統資源或執行其他清除。
finalize 的常規協定是:當 JavaTM 虛擬機已確定尚未終止的任何線程無法再通過任何方法訪問此對象時,將調用此方法,除非由於準備終止的其他某個對象或類的終結操作執行了某個操作。finalize 方法可以採取任何操作,其中包括再次使此對象對其他線程可用;不過,finalize 的主要目的是在不可撤消地丟棄對象之前執行清除操作。例如,表示輸入/輸出連接的對象的 finalize 方法可執行顯式 I/O 事務,以便在永久丟棄對象之前中斷連接。

Object 類的 finalize 方法執行非特殊性操作;它僅執行一些常規返回。Object 的子類可以重寫此定義。

Java 編程語言不保證哪個線程將調用某個給定對象的 finalize 方法。但可以保證在調用 finalize 時,調用 finalize 的線程將不會持有任何用戶可見的同步鎖定。如果 finalize 方法拋出未捕獲的異常,那麼該異常將被忽略,並且該對象的終結操作將終止。

在啓用某個對象的 finalize 方法後,將不會執行進一步操作,直到 Java 虛擬機再次確定尚未終止的任何線程無法再通過任何方法訪問此對象,其中包括由準備終止的其他對象或類執行的可能操作,在執行該操作時,對象可能被丟棄。

對於任何給定對象,Java 虛擬機最多隻調用一次 finalize 方法。

finalize 方法拋出的任何異常都會導致此對象的終結操作停止,但可以通過其他方法忽略它。


拋出:
Throwable - 此方法拋出的 Exception
*/
==================================End 7============0:37 2008-5-5========

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章