1.1面向對象思想概述:
- java語言是一種面向對象的程序設計語言,而面向對象思想是一種程序設計思想,這裏的對象泛指現實中的一切事物,每種事物都具備自己的屬性和行爲。
- 特點:面向對象思想是一種更符合我們思考習慣的思想,它可以將簡單的事情複雜化,並將我們從執行者變成指揮者。
- 面向過程:把衣服脫下來-->找一個盆-->放點洗衣粉-->加點水-->浸泡10分鐘-->揉一揉-->清洗衣服-->擰乾-->晾
起來- 面向對象:把衣服脫下來-->打開全自動洗衣機-->扔衣服-->按鈕-->晾起來
- 面向過程:強調步驟。
- 面向對象:強調對象,這裏的對象就是洗衣機。
- 面向對象的語言中,包含了三大基本特徵,即封裝、繼承和多態。
1.2 類與對象:
- 類:是一組相關屬性和行爲的集合。可以看成是一類事物的模板,使用事物的屬性特徵和行爲特徵來描述該類事物。
- 現實中,描述一類事物:
- 屬性:就是該事物的狀態信息。
- 行爲:就是該事物能夠做什麼。
- 舉例:貓
- 屬性:名字、體重、年齡、顏色。
- 行爲:走、跑、叫。
- 對象:是一類事物的具體體現。對象是類的一個實例,必然具備該事物的屬性和行爲。
- 現實中,一類事物的一個實例:一隻小貓。
- 舉例:一隻小貓。
- 屬性:jack、10kg、1years、yellow
- 行爲:溜牆根走、蹦躂的跑、喵喵叫
1.3 類與對象的關係:
- 類是對一類事物的描述,是抽象的。
- 對象是一類事物的實例,是具體的。
- 類是對象的模板,對象是類的實體。
1 .4類的定義:
- 現實世界中的一類事物:
屬性:事物的狀態信息。 行爲:事物能夠做什麼。
- java中用class描述事物也是如此:
成員變量:對應事物的屬性。 成員方法:對應事物的行爲。
- 類的定義格式:
public class 類名{
//成員變量
//成員方法
}
- 定義類:就是定義類的成員,包括成員變量和成員方法。
- 成員變量:和以前定義變量幾乎是一樣的,只不過是位置發生了改變。在類中,方法外。
- 成員方法:和以前定義方法幾乎是一樣的,只不過把static去掉。
public class Student {
//成員變量
private String name;
private int age;
private double score;
//成員方法
public void eat(){
System.out.println("吃個蛋炒飯");
}
public void sleep(){
System.out.println("學習java累了要睡覺");
}
}
1.5 對象的使用:
對象的使用格式
創建對象: 類名 對象名=new 類名();
使用對象訪問類中的成員:
對象名.成員變量;
對象名.成員方法;
public class Student_Test01 {
public static void main(String[] args) {
//創建對象
Student s = new Student();
System.out.println("s:"+s);
//直接輸出成員變量的值
System.out.println("姓名:"+s.name);
System.out.println("年齡:"+s.age);
System.out.println("-------------");
//給成員變量賦值
s.name="馬雲";
s.age=19;
System.out.println("姓名:"+s.name);
System.out.println("年齡:"+s.age);
//調用成員方法
s.eat();
s.sleep();
}
}
1.6 成員變量的默認值:
數據類型 | 默認值 | |
基本數據類型 | 整型(byte,short,int,long) | 0 |
浮點數(float,double) | 0.0 | |
字符(char) | '\u0000' | |
布爾(boolean) | false | |
引用數據類型 | 數組,類,接口 | null |
2.1成員變量和局部變量的區別:
public class Car {
int x;//類中方法外的變量是成員變量
public void run(int speed){
int a=10;//方法中或參數上的變量都是局部變量
}
}
- 什麼是成員變量:放在類中方法外的變量
- 什麼是局部變量:放在方法中或參數上的變量
- 成員變量和局部變量的區別:
- (在類中的位置不同)
- 成員變量:放在類中方法外
- 局部變量:放在方法中或參數上的變量
- (作用範圍不一樣)
- 成員變量:類中都可以使用
- 局部變量:本方法中能用
- (初始化值不同)
- 成員變量:有默認值
- 局部變量:沒有默認值,不賦值不能用
- (在內存中的位置不同)
- 成員變量:堆內存
- 局部變量:棧內存
- (生命週期不同)
- 成員變量:隨着對象的創建而存在,隨着對象的消失而消失
- 局部變量:隨着方法的調用而存在,隨着方法的調用完畢而消失
3.1 面向對象三大特性:封裝、繼承、多態
- 封裝:
- 人的屬性:姓名,年齡,身高,性別,三圍,銀行卡密碼,錢包等。
- 人有很多屬性,但是有些屬性是隱私的,不能暴露出來。
- 封裝的原則(步驟):
- 將隱私的內容私有。
- 提供get/set方法(get表示獲取/set表示修改)
- 如何將成員變量私有:
- 使用private關鍵字。
- private表示私有,只有本類可以使用。
- private可以修飾成員變量和成員方法。
- private修飾成員變量格式:
- private 數據類型 變量名(如:private String name)
- 封裝的好處:提高代碼的安全性。
4.1 this關鍵字:
- 成員變量和局部變量重名了(就近原則),使用局部變量。
- this關鍵字的作用:用來區分局部變量和成員變量
- this.變量名 表示成員變量
- this到底是什麼東西呢?誰調用方法,this就是誰
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
name = name;
age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
age = age;
}
}
public class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
p.setAge(18);
p.setName("馬雲");
System.out.println("姓名:"+p.getName()+"年齡:"+p.getAge());
}
}
- 雖然使用了p.setAge和p.setName給成員變量賦值了,但是打印出來結果還是姓名:null年齡:0 。這是因爲get/set方法中name/age還是局部變量,並沒有賦值給成員變量。需要加上this關鍵字解決,this.name代表成員變量的name,則this.name=name,這樣就將值賦給成員變量了。
- 成員變量賦值失敗了,也就是說,在修改了setXxx() 的形參(方法小括號中的String name爲形參)變量名後,方
法並沒有給成員變量賦值!這是由於形參變量名(name)與成員變量名(name)重名,導致成員變量名被隱藏,方法中的變量名,無法訪問到成員變量,從而賦值失敗。所以,我們只能使用this關鍵字解決問題。
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("this="+this);
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
System.out.println("p="+p);
p.setAge(18);
p.setName("馬雲");
System.out.println("姓名:"+p.getName()+"年齡:"+p.getAge());
}
}
- 輸出結果:
p=Test.Person@58ceff1 this=Test.Person@58ceff1 姓名:馬雲年齡:18
在上面的代碼中,我們把對象p和this打印出來,發現p和this的地址值是一樣 的,都是 @58ceff1,說明是同一個對象,p調用了setName方法 ,setName中的this地址和p一樣,所以,誰調用了方法,this就是誰。
5.1 構造方法:
- 什麼是構造方法:構造方法也是一個方法,在創建對象的時候執行一次(早)
- 構造方法的作用:在創建對象的時候給成員變量賦值(給對象初始化)
- 構造方法格式:
public 類名(){ }
- 特點:
- 沒有返回值,連void都不能寫。
- 構造方法名稱和類名一致。
- 一個類不寫構造方法,java會默認贈送一個無參構造。
- 當我們自己添加了構造方法,就沒有默認的無參構造方法了。
- 構造方法可以重載。
- 構造方法什麼時候調用:
- 類名 對象名 = new 類名();
Person p = new Person
new :表示在堆中申請一塊內存空間
類名():表示調用構造方法
public class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
System.out.println("p="+p);
/*
問題1:如果代碼太多,可能會忘記賦值,最終沒值
問題2:如果有50個成員變量賦值,需要寫50個set方法,麻煩
有沒有什麼辦法一創建出對象,成員變量就有值了,後面直接使用
這時就需要使用有參構造方法
*/
p.setAge(18);
p.setName("馬雲");
System.out.println("姓名:"+p.getName()+"年齡:"+p.getAge());
System.out.println("-------------------------");
//創建對象,使用有參構造
Person p2 = new Person("馬化騰",19);
System.out.println("姓名:"+p2.getName()+"年齡:"+p2.getAge());
}
}
public class Person {
private String name;
private int age;
public Person() {
System.out.println("我是無參構造");
}
public Person(String name, int age) {
System.out.println("我是有參構造");
this.name = name;//將參數賦值給成員變量
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("this="+this);
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
構造方法可以給成員變量賦值,set方法也可以給成員變量賦值,他們的區別是:
- 構造方法會在創建對象的時候走一次,一個對象只能執行一次構造方法。
- set方法是在對象創建好之後,通過對象調用set方法,一個對象可以多次調用set方法,這樣就可以修改值。(比如年齡今年是18歲,過了一年變成19,那麼就需要通過set方法去修改值)
版權申明:本文爲博主原創文章,轉載請註明出處https://blog.csdn.net/Huangyuhua068/article/details/81417223
歡迎交流學習,聯繫郵箱:[email protected]