java oop
一:自定義類:
之前我們寫的類大多數(shù)是只有一個(gè)main方法并且沒(méi)有返回值。一個(gè)完整的程序包括各種主力類,這些自定義類有自己的實(shí)例域和返回值。一個(gè)程序中只有一個(gè)類有一個(gè)main方法,多個(gè)主力類組成。main方法主要寫各個(gè)類之間的調(diào)用。
自定義類的語(yǔ)法:
class classname{fields。。。 constructor.. statement ....... } 1 public class mod_cls { 2 public static void main(String[] args){ 3 Mod_Cl get_name=new Mod_Cl(); 4 String check_name=get_name.checkName("tom"); 5 System.out.println(check_name); 6 } 7 } 8 9 class Mod_Cl{ 10 String checkName(String x){ 11 String name=x; 12 return name; 13 } 14 }
?
類Mod_Cl就是自定義類,通過(guò)mod_cls調(diào)用自定義類中的checkNmame方法。
注意:在一個(gè)程序中只有一個(gè)公共類和多個(gè)非公共類組成。
構(gòu)造器:
之前我們的簡(jiǎn)單了解下構(gòu)造器,構(gòu)造器的名字和類的名字一致。構(gòu)造器當(dāng)初始化的時(shí)候通過(guò)new方法進(jìn)行調(diào)用,將對(duì)象的初始化的值(對(duì)象null,布爾false,int0)進(jìn)行改變,講對(duì)象的引用賦值對(duì)象的變量。
特點(diǎn):只能用public private protected 三個(gè)修飾符。
????????? 沒(méi)有返回值,因?yàn)闃?gòu)造器不是函數(shù),所以他沒(méi)有返回值,也不允許有返回值,但是允許return語(yǔ)句,如果有返回值,編譯器不會(huì)報(bào)錯(cuò),但是jvm認(rèn)為該類的構(gòu)造器和該函數(shù)重名,會(huì)報(bào)找不到構(gòu)造器。
?練習(xí):
需求:在一個(gè)公司里,有多個(gè)員工,員工有漲工資的屬性,模擬員工漲工資,并且將員工的漲完的工資信息輸出出來(lái)。
分析:有需求中,可以看出有employee類和一個(gè)公共類employee_test,其中類employee類為非共有類其中包含員工的字段信息,這些信息屬于私有(private)只能該類的方法的才能進(jìn)行修改,不能被其他類的方法進(jìn)行修改,這些字段信息初始化值是放在構(gòu)造器中。
即:employee類由以下組成:
1:非公有類
2:私有字段信息。
3:構(gòu)造器:初始化該類的私有信息字段。
4:方法:漲工資
完整代碼:
1 public class Employee_Test { 2 public static void main(String[] args){ 3 Employee[] em_arr= new Employee[3]; 4 em_arr[0]=new Employee("tom",22,1200); 5 em_arr[1]=new Employee("evil",22,22200); 6 em_arr[2]=new Employee("jack",22,2200); 7 System.out.printf("add salary information below:\n"); 8 for (Employee a:em_arr){ 9 System.out.printf("name is %s age: %d salary:%f\n",a.getName(),a.getAge(),a.addSalary(0.5)); 10 } 11 } 12 } 13 14 class Employee{ 15 private String name; 16 private int age; 17 private double salary; 18 public Employee(String aname,int age,double asalary){ 19 this.name=aname; 20 this.age=age; 21 this.salary=asalary; 22 } 23 public double addSalary(double addpercent){ 24 double addsalary=addpercent*this.salary; 25 salary+=addsalary; 26 return salary; 27 } 28 public String getName(){ 29 return this.name; 30 } 31 public int getAge(){ 32 return this.age; 33 } 34 35 }?
?解析:
多個(gè)源文件編譯規(guī)則:
一個(gè)java程序是由多個(gè)類組成,只有一個(gè)公共類其他非公共類,類的名字和源文件名字一樣的。靜態(tài)方法main方法只在公共類中。靜態(tài)方法是通過(guò)類的來(lái)調(diào)用,在初始化的程序的時(shí)候,是沒(méi)有創(chuàng)建對(duì)象,所以通過(guò)類的靜態(tài)方法的來(lái)調(diào)用。
如上程序是由2個(gè)類組成,我們把這2個(gè)類放在一起,形成Employee_Test.java文件,但是在IDE編譯的時(shí)候形成2個(gè)class文件。
對(duì)于大多數(shù)人來(lái)說(shuō),會(huì)把一個(gè)類放在一個(gè)文件中。形成2個(gè)java結(jié)尾的文件:Employee.java?Employee_Test.java.
我們?cè)诰幾g的時(shí)候,該怎么操作呢?
一種使用通配符*
javac? Employee*.java
一種是直接編譯
javac? Employee_Test.java
在java中,如果一個(gè)類的中代碼調(diào)用其他的類的時(shí)候,他會(huì)在當(dāng)前的目錄找到該類,并編譯該類,如果被調(diào)用的類代碼更新,在調(diào)用的時(shí)候會(huì)重新編譯。
字段:
如上程序,Employee類包含多個(gè)私有字段、一個(gè)構(gòu)造器、三個(gè)方法。
三個(gè)方法修飾符都是public,表示任意的類的方法都可以對(duì)Employee類的方法進(jìn)行調(diào)用。
?
private String name;private int age;
private double salary
?
如上字段,修飾符都是private ,表示這三字段只有 Employee類的對(duì)象的方法才能進(jìn)行對(duì)象狀態(tài)(實(shí)例域)的修改。其他類的無(wú)法訪問(wèn)和操作。這符合類的封裝的特性。想一想如果別的類能夠操作這些字段,那數(shù)據(jù)會(huì)出現(xiàn)混論!
類的方法可以訪問(wèn)類的所有對(duì)象的私有數(shù)據(jù)!
也就是說(shuō)類的字段一般設(shè)置為private修飾符
構(gòu)造器:
1 public Employee(String aname,int age,double asalary){ 2 this.name=aname; 3 this.age=age; 4 this.salary=asalary; 5 }?構(gòu)造器是給對(duì)象初始化狀態(tài),通過(guò)構(gòu)造器修改對(duì)象初始值。
調(diào)用方式:通過(guò)new初始化對(duì)象的時(shí)候?qū)?duì)象的引用值傳給對(duì)象變量的時(shí)候執(zhí)行了構(gòu)造器。
特點(diǎn):
修飾符只有public、private、protected。
沒(méi)有返回值。
構(gòu)造器可以多個(gè),不止一個(gè)。構(gòu)造器可以進(jìn)行重載多個(gè)構(gòu)造器。
構(gòu)造器的名字和類的名字的一致的。
不能對(duì)已經(jīng)有對(duì)象的對(duì)象變量進(jìn)行再次執(zhí)行構(gòu)造器修改狀態(tài)而達(dá)到重新設(shè)置值的目的。
構(gòu)造器的參數(shù)可以為0、1、。。。。多個(gè)。
參數(shù):
參數(shù)分隱式參數(shù)和顯式參數(shù)。比如上面的構(gòu)造器中:
1 private String name; 2 private int age; 3 private double salary; 4 public Employee(String aname,int age,double asalary){ 5 this.name=aname; 6 this.age=age; 7 this.salary=asalary; 8 }?
在構(gòu)造器中,參數(shù)aname、aage、asalary,屬于構(gòu)造器Employee的參數(shù)這叫做顯式參數(shù)。
而構(gòu)造器中的name、age、salary屬于類中定義的字段,并不屬于構(gòu)造器的參數(shù),這叫做隱式參數(shù)。
隱式參數(shù)用this.來(lái)表示,在構(gòu)造器塊中 this.name表示參數(shù)name。這樣用this更好區(qū)別的與構(gòu)造器的自己的局部變量參數(shù)。
構(gòu)造器的參數(shù)命令最好是能讓人易于理解,比如上面的aname、aage等。
訪問(wèn)器和更改器:
如上程序中,其中方法:getName()? getAge()? addSalary()。其中:getName()? getAge() 通過(guò)聲明public 2個(gè)訪問(wèn)器來(lái)訪問(wèn)實(shí)例域。通過(guò)聲明public的更改器,這樣只有通過(guò)Employee類的通過(guò)訪問(wèn)器和更改器來(lái)訪問(wèn)對(duì)象的實(shí)例域和修改實(shí)例域更為安全。避免出現(xiàn)數(shù)據(jù)混亂。
也就是說(shuō)需要獲得或者更改實(shí)例域的時(shí)候,需要提供以下:
1:私有的實(shí)例域。
2:公共的域訪問(wèn)器方法
3:公共的域更改器方法。
1 public double addSalary(double addpercent){ 2 double addsalary=addpercent*this.salary; 3 salary+=addsalary; 4 return salary; 5 } 6 public String getName(){ 7 return this.name; 8 } 9 public int getAge(){ 10 return this.age; 11 }?這種好處是:通過(guò)內(nèi)部的實(shí)現(xiàn),通過(guò)類的方法之外不會(huì)影響其他的代碼。
final 修飾符:
一 final數(shù)據(jù)
1.在修飾基本類型時(shí),表示它是一個(gè)常量,在定義時(shí)必須給予賦值.
?? 特別的一個(gè)既是static又是final 的字段只占據(jù)一段不能改變的存儲(chǔ)空間。
2.在修飾對(duì)象或者數(shù)組時(shí),它表示對(duì)對(duì)象或數(shù)組的引用恒定不變,然而對(duì)象本身卻是可以修改的.
? 空白final:聲明為final但末給定初值的字段,但必須確??瞻譮inal在使用前被初始化,一般在構(gòu)造方法完成。
? final參數(shù):在方法的參數(shù)列表以聲明的方式將參數(shù)指明為final,這意味著在方法里無(wú)法修改參數(shù)的引用所指向的對(duì)象。
如上面的字段name 可以用final來(lái)進(jìn)行修飾表示該變量自始至終未發(fā)生任何的改變。
靜態(tài)域合靜態(tài)方法:
類似于python 的靜態(tài)字段和類方法,無(wú)論創(chuàng)建多少個(gè)對(duì)象,他只創(chuàng)建一次靜態(tài)域,他不伴隨對(duì)象的創(chuàng)建而創(chuàng)建。靜態(tài)域和靜態(tài)方法通過(guò)類來(lái)進(jìn)行調(diào)用,在python中需要裝飾器@classmethod進(jìn)行修飾,并必需參數(shù)為cls。
靜態(tài)域他屬于類,即使沒(méi)創(chuàng)建類他也自己存在。100個(gè)對(duì)象,但只有一份拷貝的靜態(tài)域。
靜態(tài)變量用的比較少,但是靜態(tài)常量用的比較多。比如Math對(duì)象中的PI
1 import java.lang.Math; 2 public class Math_test { 3 public static void main(String[] args){ 4 System.out.println(Math.PI); 5 } 6 }他本身就是一個(gè)靜態(tài)常量。
靜態(tài)方法無(wú)法對(duì)對(duì)象實(shí)施操作的方法。
為什么呢?
因?yàn)殪o態(tài)方法、靜態(tài)變量和靜態(tài)常量,無(wú)需通過(guò)對(duì)象進(jìn)行調(diào)用,在啟動(dòng)程序的時(shí)候,還沒(méi)有創(chuàng)建對(duì)象時(shí)候,是通過(guò)類的進(jìn)行調(diào)用。而不管對(duì)象創(chuàng)建多少,靜態(tài)常量和變量只有一份拷貝。所以靜態(tài)方法無(wú)法對(duì)對(duì)象實(shí)施任何操作。
在調(diào)用的時(shí)候直接通過(guò)類進(jìn)行調(diào)用,比如我們每個(gè)程序都有main方法,Math中pow方法都屬于靜態(tài)方法。
什么時(shí)候使用靜態(tài)方法呢?
1:不需要訪問(wèn)類對(duì)象的實(shí)例域。
2:方法的參數(shù)都是顯式參數(shù)。
靜態(tài)方法另一個(gè)應(yīng)用:工廠方法。
?方法參數(shù):
1 public class args { 2 public static void main(String[] args){ 3 int a=2; 4 Base_Ar check_args =new Base_Ar("tom",20000); 5 check_args.set_Args(a); 6 check_args.prin_Info(); 7 System.out.printf("a is %d",a); 8 9 } 10 } 11 12 class Base_Ar{ 13 14 15 private double salary; 16 private String name; 17 public Base_Ar(String anme,double asalary){ 18 name=anme; 19 salary=asalary; 20 21 } 22 public void set_Args(int x){ 23 x+=3; 24 salary+=20; 25 } 26 public void prin_Info(){ 27 System.out.printf("name:%s salary:%f\n",name,salary); 28 29 } 30 31 }在java中變量參數(shù)的傳遞是值。
如上變量a,在調(diào)用set_Args中,將a的值傳遞給該方法,雖然在方法中進(jìn)行x+=3的操作,但是a的值并沒(méi)有發(fā)生變化。
而在對(duì)象中,傳遞的值是對(duì)象的引用值。在上面的salary中傳遞是對(duì)象的引用,他們都指同一個(gè)對(duì)象,所以修改了對(duì)象的狀態(tài)。
總結(jié)如下:
1:一個(gè)方法不能修改一個(gè)基本數(shù)據(jù)類型的參數(shù)(即數(shù)值型和布爾型)
2:一個(gè)方法可以改變一個(gè)對(duì)象的參數(shù)的狀態(tài)。
3:一個(gè)方法不能讓對(duì)象參數(shù)引用一個(gè)新的對(duì)象。
?
轉(zhuǎn)載于:https://www.cnblogs.com/evilliu/p/7624895.html
總結(jié)
- 上一篇: python中获取目录下所有文件名以及读
- 下一篇: 谈谈Intranet与Internet的