1. 程式人生 > >java類和對象詳解

java類和對象詳解

權限 類和對象 字節 pre 空白 我們 框架 類設計 static

對象和類詳解 什麽是對象:萬物皆對象,什麽東西都是對象,例如,貓狗人
什麽是類:類是同一事物的統稱,它描述一類對象的行為和狀態。
設計類:抽象過程 類的屬性 類的方法
什麽是實例化:由類得到對象這個過程叫做實例化
對象和類的區別:一個是抽象一個是具體,一個是集合一個是個體等等。一個是魔板一個是實例,一個是數據一個是數據結構等等。
如何設計類:public class student{}//把類的共同提出提取出來,
學生會有什麽:名字,年齡,性別,等等,這就是共同特征。
//共同特征為類的屬性,共同行為為類的方法。
舉個栗子: 屬性/成員變量:
String name; int age; String sex; String Phone; 方法/成員方法: public void Eat() { System.out.println("吃飯"); } public void sleep() { System.out.println("睡覺"); } ()裏面的為參數列表
最前面的是修飾符,一共有四種修飾符
public:對任何人都是可用的 protect:繼承的類可以訪問以及和private一樣的權限 default:包訪問權限,即在整個包內均可被訪問 private:除類型創建者和類型的內部方法之外的任何人都不能訪問的元素
第二個表示返回值類型,void表示返回為空 其他返回值類型需要返回對應的類型。return什麽什麽
類的實例化:舉例
Student s=new Student();
System.out.println(s);
//打印對象的時候相當於輸出了對象的toString方法
System.out.println(s.toString());
//類裏面沒有toString方法會輸出什麽呢
/**
* public String toString() {
* return getClass().getName() + "@" + Integer.toHexString(hashCode());
*/
//為什麽需要重寫toString方法?
如果類沒有toSting方法,會默認調用他的父類的toString方法,如果沒有父類,會調用他的超類object的toString
實在不會寫就。。。,把Obj的復制過來,然後改一下,當然我會自動生成,零基礎還是自己寫吧,哈哈哈 類的作用是什麽:方便要由類,方便得到實例,方便操作實例,
對象實例化時,內存是如何操作的。(問題:對象初始化時,默認值初始值問題)
對應數據類型的默認值,int是0,double是0.0,char是空白字符 對象類型是null等等
為什麽是這樣子呢,emmmm,本來想畫個圖的,但是我畫圖技術不行,舉個栗子吧,比如你去叫人給你找個對象,你沒和別人說你要高矮胖瘦,什麽性格,什麽年齡等等,別人也不方便給你找對吧。萬一你喜歡胖胖的大媽呢,是吧。所以人家暫時也不知道你需要什麽類型的就給你默認的符合大眾的。
構造方法:每個類都有構造方法。如果沒有顯式地為類定義構造方法,Java編譯器將會為該類提供一個默認構造方法。一個類可以有多個構造方法,可以寫參數也可以不寫參數。 public Student() {//無參構造方法 // TODO Auto-generated constructor stub } public Student(String name, int age, String sex, String phone) { //有參構造方法 super(); this.name = name; this.age = age; this.sex = sex; Phone = phone; }
方法重載:多個方法擁有相同的名字但是參數傳遞不一樣。
public class Method {
/**
* 方法重載
* 方法名相同
* 方法的參數類型,參數數量不一樣
* 方法的返回類型可以不相同
* 方法的修飾符可以不相同
* main方法也可以重載
*/
public void show() {
// TODO Auto-generated method stub
System.out.println("weIcome");
}
public void show(String name) {
System.out.println("weIcome"+name);
}
public void show(String name,int age){
System.out.println("weIcome"+name+age);
}
public void print() {
// TODO Auto-generated method stub
System.out.println("無參構造方法");
}
public void print(int a){
System.out.println(a);
}
public void print(String name,int a){
System.out.println("這是什麽的名字"+name+a);
}
public void nosta(){
System.out.println("靜態方法中不能直接調用非靜態方法");
}
/**
* 構造方法
* 使用new+構造方法 創建一個新的對象
* 構造方法是定義在java類中的一個用來初始化對象的方法
* 構造方法與類名相同且沒有返回值
*
* 語法
* 沒有返回值類型 與類名相同 有無參構造方法
* public 構造方法名(){
* }
*/
public Method() {
// TODO Auto-generated constructor stub
System.out.println("無參的構造方法");
}
float screen;
float cpu;
float mem;
public Method(float newScreen,float newCpu,float newMen ){
//給成員變量賦值
screen=newScreen;
cpu=newCpu;
mem=newMen;
System.out.println("有參數的方法執行了"+screen+cpu+mem);
}
/*
* java中的static使用之靜態變量
* static修飾的成員被稱為靜態成員或類成員
* 它屬於整個類所有,而不是某個對象所有
* 相當於是所有類都擁有它
* 靜態成員可以使用類名直接訪問
* 也可以使用對象名訪問
* 因為它的特殊性,(建議使用類名訪問)
*/
public static String hobby="imooc";//定義一個靜態變量hobby
String name="我是誰我要幹嘛";
public static void println(){
Method me=new Method();
System.out.println("歡迎您:主人有什麽可以幫助您的::"+hobby);
//System.out.println("歡迎您:主人有什麽可以幫助您的"+name);
//靜態方法不能直接調用非靜態成員
System.out.println("您可能中毒了:需要去:"+me.name);
//通過對象來實現這靜態方法中調用非靜態變量
}
public static void main(String[] args) {
Method me=new Method();//通過無參的構造方法可以創建對象
Method met=new Method(5.0f,1.4f,2.0f);//通過有參的構造方法也可以創建對象
//當沒有指定構方法時,系統會自動添加無參的構造方法
//當有指定構造方法時,
//無論是有參或者無參的構造方法都不會添加自動添加無參構造方法
me.show("這",20);
me.print("name", 15);
//構造方法重載:和方法重載一樣
//構造方法不但可以給對象的屬性賦值,
//還可以保證給對象的屬性賦一個合理的值
System.out.println("通過類名訪問hobby"+Method.hobby);
//靜態變量可以直接使用類名來訪問,無需創建類的對象
System.out.println("通過對象名訪問hobby"+me.hobby);
//使用對象名來訪問靜態變量
me.hobby="我一天不裝逼就不舒服";
System.out.println("通過類名訪問hobby:"+Method.hobby);
//再次使用類名訪問靜態變量,值已被修改
Method.println();//使用對象名直接調用
me.println();//使用對象名調用方法
me.nosta();
//靜態方法中不能直接調用非靜態方法,需要通過對象來訪問
}
}
this的作用:區分成員變量和形式參數,this可以省略 java面向對象的四大特性: 封裝;是指一種將抽象性函式接口的實現細節部份包裝、隱藏起來的方法。
public class Persons {
private int preID;//id
private String preName;//名字
private String prePass;//密碼
private String ptrEmail;//郵箱
private int preAge;//年齡
private String preAddress;//地址
private String preCity;//現居城市
public Persons() {
super();
// TODO Auto-generated constructor stub
}
public Persons(int preID, String preName, String prePass, String ptrEmail, int preAge, String preAddress,
String preCity) {
super();
this.preID = preID;
this.preName = preName;
this.prePass = prePass;
this.ptrEmail = ptrEmail;
this.preAge = preAge;
this.preAddress = preAddress;
this.preCity = preCity;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return super.equals(obj);
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
@Override
public String toString() {
return "Persons [preID=" + preID + ", preName=" + preName + ", prePass=" + prePass + ", ptrEmail=" + ptrEmail
+ ", preAge=" + preAge + ", preAddress=" + preAddress + ", preCity=" + preCity + "]";
}
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
super.finalize();
}
public int getPreID() {
return preID;
}
public void setPreID(int preID) {
this.preID = preID;
}
public String getPreName() {
return preName;
}
public void setPreName(String preName) {
this.preName = preName;
}
public String getPrePass() {
return prePass;
}
public void setPrePass(String prePass) {
this.prePass = prePass;
}
public String getPtrEmail() {
return ptrEmail;
}
public void setPtrEmail(String ptrEmail) {
this.ptrEmail = ptrEmail;
}
public int getPreAge() {
return preAge;
}
public void setPreAge(int preAge) {
this.preAge = preAge;
}
public String getPreAddress() {
return preAddress;
}
public void setPreAddress(String preAddress) {
this.preAddress = preAddress;
}
public String getPreCity() {
return preCity;
}
public void setPreCity(String preCity) {
this.preCity = preCity;
}
繼承:比如我兒子們繼承我的東西(皮使我開心。), Java這裏繼承的實體是類,也就是說繼承子類擁有父類的成員 java是單繼承的繼承的好處:子類就直接擁有了父類的所有屬性和方法 子類可以復用父類的 在類的設計中,可以通過關鍵字extends來指明其父類 語法: 修飾符 class 子類名字 父類名字 方法重寫
如果子類對繼承父類的方法不滿意,是可以重寫
父類繼承的方法的,當調用方法時,會優先調用
子類重寫的方法
語法規則 : 返回值類型 方法名和參數類型都必須
要與父類繼承的方法相同,才叫做方法重寫
public class pig extends Animal{
public String paolu;
public String chihenduo;
public void syso() {
// TODO Auto-generated method stub
System.out.println("你是豬");
}
// public void eat() {//實例方法的重寫
// // TODO Auto-generated method stub
// System.out.println("豬擁有吃很多東西的能力");
// }//已經被final
public pig(){
System.out.println("我要輸出什麽呢");
}
// 繼承的初始化順序
// 1.初始化父類再初始化子類
// 2.先執行初始化對象中屬性,再執行構造方法中的初始化
// 父類對象=》屬性初始化=》構造方法=》
// 子類對象=》子類屬性的初始化=》構造方法
/**
* final關鍵字
* 使用final關鍵字做標示有“最終的”含義
* final可以修飾類 方法 屬性和變量
* final修飾類,則該類不允許被繼承
* final修飾方法,則標示該方法不能重寫
* final修飾變量,只能賦值一次
* @return
*/
// final void piga(){}
// final void piga(int a){
//
// }
} super關鍵字:在對象中使用,可以代表父類對象
super可以調用父類的屬性和方法。
super點屬性或者方法就行 多態:對象的多種形態,同一個行為具有多個不同表現形式,
舉個栗子:比如你老師,你是不是有高數,英語,java等等老師。
引用多態:父類的引用可以指向子本類的對象/子類的對象
方法多態:創建本類對象時,調用的為子類的方法。
創建子類對象時,調用方法為子類重寫的方法或者繼承的方法。
抽象類: 一個抽象的類,一個類中沒有包含足夠的信息來描繪一個具體的對象。
package demo1; public abstract class abstrtel { /** * 抽象類 * 語法定義: * 抽象類前使用abstract關鍵字修飾,則該類為抽象類 * 應用場景: * 某寫情況下,某個父類只是知道其子類應該包含怎樣的方法, * 但無法準確知道這些子類如何實現這些方法 * 抽象類是約束子類必須包含什麽樣的方法 * * 從某個具有相同特征的類中抽象出一個抽象類,以這個抽象類 * 作為子類的模板,從而避免了子類設計的隨意性 * * 作用:不關註子類的實現,但是限制規定子類必須實現某些方法, * 但是不註意細節 * * 使用規則: * a.abstract定義抽象類 * b.absteact定義抽象方法,只有聲明,不需要實現 * c.包含抽象方法的類是抽象類 * d.抽象類中可以包含普通的方法,也可以沒有抽象方法 */ public abstract void call();//抽象方法 public abstract void message();//
} 類的初始化過程: .java的源代碼文件通過javac.exe這個文件將他編譯成.class的字節碼文件。 源碼要運行,必須先轉成二進制的機器碼。這是編譯器的任務。
然後class文件通過字節碼的方式傳輸到類加載器,(傳輸的對象就是本地字節碼和網絡傳輸)。
類加載器通常由jvm來提供,我們稱為系統類加載器,我們也可以繼承classloader類來提供自定義類加載器。同時會調用本地的內褲。
類加載器分為三種:bootstrap加載器(這個不是前端的框架那個),application加載器和忘了。。。
不同的類加載器可以實現加載本地字節碼文件,jar包和war包中的字節碼,通過網絡加載字節碼等等。萬物皆對象,類是用來描述對象的,那誰來描述類這個對象呢,就用java.lang.Class對象來描述。java.lang.Class也作為方法區這個類的各種數據的入口。 當調用java命令來運行某個java程序時,該命令將會啟動一個jvm進程。同一個jvm‘中的所有線程變量都處同一個進程中,共享該jvm的內存區域. 當出現以下情況會讓jvm退出
1.程序正常執行結束,
2.使用system.exit()方法;
3.出現異常時,沒有捕獲異常 4.平臺強制結束jvm進程 jvm一旦結束,該進程中內存中的數據將會丟失 然後檢測被加載的類是否有正常的內部結構,這一階段的主要目的是為了確保Class文件的字節流中包含的信息是否符合當前虛擬機的要求,並且不會危害虛擬機自身的安全。 開始給類變量分配內存,並給初始值。 然後虛擬機將常量池中類的二進制數據中的符號引用替換為直接引用。

直接引用:直接引用到某塊內存空間

註意:除了在加載階段可以自定義類加載器以外,其它操作都由JVM主導。

java8以後會把方法區放在堆裏面了;
這個還是舉例子吧; woman w=new woman(); 首先會先把這個類裏面的元信息加載到方法區(jdk8以後堆方法區就在堆裏面了。)元信息:什麽構造方法,屬性,方法等等。然後會用new關鍵字來在堆內存裏面去申請一塊空間(任何情況下,只要看見關鍵字new,都表示要分配新的堆內存空間,一旦堆內存空間分配了,裏面就會有類中定義的屬性)。把我們的new woman()存儲進去,當調用狗雜方法的時候,會把方法區非靜態的成員屬性給到堆裏面去。再把他值傳過去,沒賦值就是默認值。再把內存地址放到棧內存裏面去就是w。所以java沒有引用傳遞,只有值傳遞。當你通過w去操作的時候其實是操作的new woman()這塊內存地址。 引用傳遞:woman w = new woman () ; // 聲明並實例化對象 w1.name = "張三" ; w1.age = 20 ; woman w2= w1 ; // 引用傳遞 w1.name = "李四" ; w1.Eat() ;

java類和對象詳解