|
把一個事物搞的越不具體 就是越抽象.. 比如一個人的抽象是動物 .再抽象點是哺乳類. ..等等.. 定義了一個抽象的父類 里面可以有一些抽象的方法 然后再定義子類來實現這些方法.. 用abstract 來修飾抽象. . 如 abstract class Test //定義抽象類 { private String name; Test(String n) { name=n; }
public abstract String gethaha(); //定義一個抽象的方法. }
抽象類是不能實例對像的.. 可以定義一個抽象類的對象變量,但是他只能引用非抽象子類的對象 如: Test a=new Employee("xiaoqiao",9000);
import java.text.*;
import java.util.*;
public class PersonTest
{
public static void main (String[] args)
{
Person [] staff=new Person[2];
staff[0]=new Employee("鄭成橋",5000,1989,05,06);
//這里注意 Person是抽象的類 不能實例對象,可以定義一個抽象類的對象變量,但是他只能引用非抽象子類的對象
staff[1]=new Student("哈哈啊","你好嗎");
for(Person e:staff)
{
System.out.println(e.getName()+"\t"+e.getDescription());
}
}
}

abstract class Person //定義一個抽象的類
{
private String name;
public Person(String n)
{
name=n;
}
public abstract String getDescription();//定義一個抽象的方法
public String getName()
{
return name;
}

}
class Employee extends Person //Employee實現這個抽象的類
{
private double salary;
private Date hireDay;
public Employee(String n,double s,int year,int month,int day)
{
super(n);
salary=s;
GregorianCalendar calendar =new GregorianCalendar(year,month -1,day);
hireDay=calendar.getTime();
}
public double getSalary()
{
return salary;
}
public Date getHireDay()
{
return hireDay;
}
public String getDescription()
{
return String.format("an employee with a salary of $%.2f",salary);
}
public void raiseSalary(double byPercent)
{
double raise=salary*byPercent/100;
salary+=raise;
}
}
class Student extends Person
{
private String major;
public Student(String n,String s)
{
super(n);
major=s;
}
public String getDescription()
{
return "a student majoring in"+major;
}
}
__作者: 鄭成橋
1 2 import java.util.*; 3 public class ManagerTest 4 { 5 public static void main (String[] args) 6 { 7 Manager boss=new Manager("xiaoqiao",8000,1989,04,11); 8 boss.SetBonus(5000); 9 Employee [] staff=new Employee[3]; 10 staff[0]=boss; //父類 可以被子類轉換 .... 但是子類 不能被父類轉換. 11 staff[1]=new Employee("dddd",5000,1989,10,12); 12 staff[2]=new Employee("aaaaa",4000,1988,11,12);
if(staff[1] instanceof Manager) //staff[1] 能不能 (instanceof)轉換為: Manager /* 我試圖把staff[1]轉換為Manager 但是失敗了 */ { Manager aa=(Manager)staff[1]; } else { System.out.println("不能裝換"); }
13 14 for(Employee e:staff) 15 System.out.println("mingzi \t"+e.getName()+"\t gongzi \t"+e.getSalary()+"\t shengri \t"+e.getHrireDay()); 16 } 17 18 } 19 class Employee 20 { 21 public Employee(String n,double s,int year,int month,int day) //首先我們傳5個參數 22 { 23 name=n; 24 salary=s; 25 GregorianCalendar calendar =new GregorianCalendar(year,month -1,day); 26 hireDay=calendar.getTime(); 27 } 28 public String getName() //得到名字 29 { 30 return name; 31 } 32 public double getSalary() //得到工資 33 { 34 return salary; 35 } 36 public Date getHrireDay() //得到年齡 37 { 38 return hireDay; 39 } 40 public void raiseSalary(double byPercent) 41 { 42 double raise=salary*byPercent/100; 43 salary+=raise; 44 } 45 private String name; 46 private double salary; 47 private Date hireDay; 48 } 49 class Manager extends Employee //定義一個 Manager 類繼承 Employee 50 { 51 /**//** 52 @parm n the employee's name 53 @parm s the salary 54 @parm year the hire year 55 @parm month the hire month 56 @parm day the hire day 57 */ 58 public Manager(String n,double s,int year,int month,int day) 59 { 60 super(n,s,year,month,day); //關鍵字 繼承Employee 里的方法 61 bonus=0; 62 } 63 public double getSalary() //定義一個方法重載.. 64 { 65 double baseSalary=super.getSalary(); 66 return baseSalary+bonus; //就是在工資的基本上加上獎金 67 } 68 public void SetBonus(double b) //定義一個方法 存儲獎金 69 { 70 bonus=b; 71 } 72 private double bonus; 73 }
動態的綁定的意思 . 假如 調用 x.f("Hello") 編譯器會挑 x.f(String) 不會挑x.f(int) 假如你子類想覆蓋 父類的方法 . 那么方法返回的類型必須是一樣的 比如: Employee 類中有 public Employee gethaha() { ........... } 那么在后面的 Manager中可以 按照一樣的方法 public Manager gethaha() { ........... } 如果你想要覆蓋一個父類的方法的時候. 你的子類的方法不能低于父類的可見性 比如.父類是 public . 那么你子類覆蓋他 也必須是 public 否則會出現錯誤的... 今天繼承就寫這么多. 如果你想阻止繼承的話. 就用 final 修飾符.. 可以看看下面的代碼就會懂了
public class Test //假如在這加一個final就會報錯. 因為一個被final修飾的類 是不能繼承的.
{
private String name;
private double salary;
Test(String name,double salary)
{
this.name=name;
this.salary=salary;
}
public final String getName() //假如在這加一個 final 編譯不會影響什么. 因為子類沒有覆蓋這個方法
{
return name;
}
public double getsalary() //然而我們在這加一個 final 編譯就會報錯了.因為子類覆蓋了這個類.
{
return salary;
}
public static void main (String[] args)
{
Test1 t1=new Test1("xiaoqiao",80000);
t1.aaa(600);
System.out.println("小橋="+t1.getName()+"\t"+t1.getsalary());
}
}
class Test1 extends Test
{
private double bb;
public Test1(String name,double salary)
{
super(name,salary);
}
public double getsalary()
{
double aa=super.getsalary();
return aa+bb;
}
public void aaa(double bb)
{
this.bb=bb;
}
}
___作者: 鄭成橋
只針對Java2平臺-而且是在國內可以找到的中文版的,其實書好不好是見仁見智的(高手可以去看Sun的開發文檔,這也可以理解)--這只是一家之見而已--歡迎大家點評。 第一名:Java編程思想第二版(Thinking in java second)-包含范圍:全部。 沒說的--絕對的大師作品--當之無愧的第一--第一版時就享譽整個java界(當時網上好象也有人譯了)--國內版是京京工作室翻譯的-基本上毀了此書--錯誤術語太多-推薦高手看E文版,新手就不要先看此書了。第二版更精采--臺灣的侯捷譯了此書-可以到www.csdn.net看看前幾章的中文版(不過是臺灣術語)。希望國內會快些引入此書,你也可到http://www.BruceEckel.com--作者的主頁免費下載此書推薦http://www.bdelmee.easynet.be/java/index.html--有chm格式的--非常棒!BTW:這位大師最近在寫Thinking in Python相信又是一本經典名著:)
第二名:Java2編程詳解(special edition java2)-包含范圍:全部--這本書會排在core java2的前面可能很多人會不同意--但是就中譯本和內容來看非常全面-適合新手成為高手-雖然國內的價位高了些(150)-但基本還是值得的--該有的內容都有了,做參考書也很不錯-BTW-這個系列中的oracle8/8i使用手冊也是一本很經典的書--同樣推薦。
第三名:Java2核心技術卷一,二(core java2 volume1,2)-包含范圍-全部 這兩本我把它們看成一本不會有人有異議吧-這也是Sun的官方的書-我覺得相對來說-第二卷高級特性要比第一卷基礎知識好(第一卷又是京京工作室譯的--真影響情緒:()-內容同樣很全面--但是卷一雖說是基礎知識,同樣對新手來說不是很合適--感覺條理性不強-而且內容有些混雜-但第二卷完全可以彌補這些---精辟而細致-很適合有一定基礎的Java程序員看。
第四名:Java 2圖形設計 卷1:AWT 卷2:Swing-Graphic Java 1.2 Mastering the JFC Volume I:AWT SWING 3rd Edition包含范圍--Java圖形設計--沒什么說的了--盡管圖形設計不如J2EE那么火 ,而且Win32下做應用程序也不是java的強項--但是AWT和Swing仍然是Java程序員的必修課--看這兩本就夠了--看看厚度就知道了--而且這也是Sun官方出的圖書。
第五名:J2EE構建企業系統??專家級解決方案 包含范圍J2ee清華大學出版社譯作者: [美]Paul J. Perrone,et al.著 張志偉等譯--又是一本極厚的書1038頁,105元--不過內容十分豐富--適合想對J2EE整體做了解的程序員,至于每項都想精就不太可能了-呵呵-畢竟在Java中思想是主要的。在這類中有本Java服務器高級編程也很不錯-機工華章出的-wrox系列中的。
第六名: Java XML編程指南 電子工業出版社譯作者: [美]Tom Myers,Alexander Nakhimovsky著包含范圍Java+XML-XML在Java中的地位也越來越重要了--而國內能看到的還有一本中國電力出的o eilly的Java和XML--最后我還是選了這本wrox的,當然你要是想好好學學XML本身-還是看看那本XML高級編程吧--wrox系列中的-機工華章出的。
第七名:書名:Jini核心技術英文原書名: Core Jini 作者: W.Keith Edwards 包含范圍Jini--Jini也是Java體系中很重要的部分--而且更重要的是這本可能是國內唯一的一本Jini專著-翻譯的也不錯--在我看來是當之無愧的經典-同樣是Sun的官方圖書--內容很清晰透徹。
第八名:Enterprise JavaBeans第二版英文原書名: Enterprise JAVABEANS 作者: (美)Richard Monson-Haefel包含范圍EJB --O‘reilly出的--ejb的重要性我不用多說了吧--盡管有人說這本譯的不好--但是同樣它是國內目前唯一的EJB專著-o eilly的書就是只講一方面或一項技術-很細-但價格也不菲,這本書的架構還可以--值得一看。
第九名:數據結構與算法分析(Java版)譯作者: [美]Clifford A.Shaffer著 張銘 劉曉丹譯包含范圍Java算法--盡管基本上Java圖書都是講Java本身的特性--因為Java的體系太龐大了--而用Java來實現的數據結構與算法--這本書也是唯一一本---所以盡管這本不是那么的好但還是做以推薦。
第十名:軟件工程Java語言實現-英文原書名: Software Engineering with Java 作者: Stephen R.Schach 譯者: 袁兆山等--這本書沒什么多說的--純理論性的東西--但軟件工程的重要也是有目共睹的-而且同樣是這個領域中唯一的一本Java書。
補充一本:Java2編程起步Java2:A beginner guide譯作者: [美]Herbert Schildt著 史興華譯-寫了這么多才發現還沒有為Java新手選一本書--這里是指對那些一竅不通而又想學的--(不久前的我呵呵)--看了幾本后-包括Java2從入門到精通,21天學通java2-第二版后--還是選了這本--我覺得這本是最好的java入門書--好在哪里--看了就知道:)
后記:這十本不一定是最好的-只是我的個人看法-難免有誤--而且Java的很多方面還沒有包括進去--比如JSP--wrox有本JSP編程指南-但不是特別好-所以沒有把它評進去,也沒有看到太經典的JSP書--同樣J2ME也沒有好書只有本Palm應用程序設計??使用Java語言太薄了。還有本Java 2平臺安全技術-結構,API設計和實現-是講Java2安全的-同樣很薄-Java2類庫增補版--太貴不如去看文檔。還有Jbuilder,Websphere等應用服務器,CORBA等其他和Java有關的方面都有些不錯的書--在此就不多寫了--不足之處請大家指出-也希望對大家有所幫助
|