1. 複習
對象:真實存在的唯一的事物。
類: 同一種類型的事物公共屬性與公共行為的抽取。
java面向對象語言:
核心思想: 找适合的對象做适合的事情.
找對象的方式:
方式一: sun已經定義好了很多了類,我們隻需要認識這些類即可建立對象使用。
方式二: 我們需要自定義類,通過自定義類建立對象。
在整理筆記的過程中對自己有疑問的概念使用代碼驗證或者推翻它。
自定義類三步驟:
1. 自定義一個類。
class 類{
事物 的公共屬性使用成員 變量描述
事物的公共行為使用函數描述。
}
2. 可以通過類建立對象。
3. 通路(設定)對象的屬性或者調用對象的方法。
成員變量與局部變量 的差別:
1. 自定義的位置差別:
1. 成員變量是定義在方法之外,類之内的變量。
2. 局部變量是聲明在方法之内的變量。
2. 作用上的差別:
1. 成員變量的作用描述一類事物的屬性。
2. 局部變量的作用是提供一個變量給方法内部使用的。
3. 生命周期的差別;
1. 成員變量随着對象的建立而存在,随着對象的消失而消失。
2. 局部變量是調用到了對應的方法執行 到了建立該變量的語句時存在,一旦出了自己的作用域馬上從記憶體中消失。
4. 初始值的差別:
1. 成員變量是有預設的初始值的。
2. 局部變量是沒有預設的初始值的,必須要先初始化才能使用。
匿名對象: 沒有引用類型變量指向的對象就稱作為匿名對象。
匿名對象要注意的細節:
1. 一般不會給匿名對象的屬性指派,因為永遠都沒法擷取到。
2. 兩個匿名對象永遠都不可能是同一個對象。
匿名對象好處:簡化書寫。
匿名對象的應用場景:
1. 如果調用一個對象的方法一次時,然後這個對象就不再使用,那麼這時候可以使用匿名對象。
2. 可以作為實參調用一個函數。
封裝:
封裝的步驟:
1. 使用private修飾需要被封裝的屬性.
2. 根據需要提供get或者set方法設定以及擷取屬性。
封裝的好處:
1. 提高了資料的安全性。
2. 操作簡單。
3. 隐藏了實作。
注意:一般實體類的屬性我們都會封裝起來。
2.構造函數
1)構造函數的作用
給對應的對象進行初始化
2)構造函數定義的格式
修飾符 函數名(形式參數){
函數體...
}
3)構造函數要注意的細節
ü 構造函數 是沒有傳回值類型的。
ü 構造函數的函數名必須要與類名一緻。
ü 構造函數并不是由我們手動調用的,而是在建立對應的對象時,jvm就會主動調用到對應的構造函數。
ü 如果一個類沒有顯式的寫上一個構造方法時,那麼java編譯器會為該類添加一個無參的構造函數的。
ü 如果一個類已經顯式的寫上一個構造方法時,那麼java編譯器則 不會再為該類添加 一個無參 的構造方法。
ü 構造函數是 可以在一個類中以函數重載 的形式存在多個 的。
4)`構造函數代碼示例
<span style="font-family:Microsoft YaHei;font-size:14px;">class Baby{
int id; //身份證
String name; //名字
//構造函數
public Baby(int i ,String n){
id = i;
name = n;
System.out.println("baby的屬性初始化完畢!!");
}
//無參 的構造函數
public Baby(){
System.out.println("無參的構造函數被調用了..");
}
//哭
public void cry(){
System.out.println(name+"哇哇哭...");
}
}
class Demo2
{
public static void main(String[] args)
{
//建立一個baby對象
Baby b1 = newBaby(110,"狗娃"); //嬰兒誕生 白戶
System.out.println("編号:"+ b1.id +" 姓名:"+ b1.name);
b1.cry();
b1.cry();
}
}</span>
5)構造函數的疑問
建立對象時,jvm就會調用到對應的構造方法,那麼我們以前沒有學構造方法,那麼
以前建立對象時,jvm是否 也會調用構造方法呢?如果有?構造方法從何而來呢?
會調用, java編譯器在編譯的 時候給加上去的。
jdk提供了一個java開發工具(javap.exe)給我們進行反編譯的。
javap 反編譯工具的使用格式:javap -c -l -private 類名
6)構造函數與普通函數的差別
1. 傳回值類型的差別:
ü 構造函數是沒有傳回值類型 的,
ü 普通函數是有傳回值類型的,即使函數沒有傳回值,傳回值類型也要寫上void。
2. 函數名的差別:
ü 構造函數的函數名必須要與類名一緻,
ü 普通函數的函數名隻要符合辨別符的命名規則即可。
3. 調用方式的差別:
ü 構造函數是 在建立對象的時候由jvm調用的。
ü 普通函數是由我們使用對象調用的,一個對象可以對象多次普通 的函數
4. 作用上的差別:
ü 構造函數 的作用用于初始化一個對象。
ü 普通函數是用于描述一類事物的公共行為的。
3.構造代碼塊(1)
1)構造代碼塊的作用:給對象進行統一的初始化。
2)構造函數的作用: 給對應的對象進行初始化。
3)構造代碼塊的格式
{
構造代碼塊
}
注意: 構造代碼塊的大括号必須位于成員位置上。
4)構造代碼塊的類别:
1. 構造代碼塊。
2. 局部代碼塊. 大括号位于方法之内。 作用:縮短局部 變量 的生命周期,節省一點點記憶體。
3. 靜态代碼塊 static
{
//System.out.println("構造代碼塊的代碼執行了......");
}
4.構造代碼塊(2)
構造 代碼塊要注意的事項:
1. java編譯器編譯一個java源檔案的時候,會把成員變量的聲明語句提前至一個類的最前端。
2. 成員變量的初始化工作其實都在在構造函數中執行的。
3. 一旦經過java編譯器編譯後,那麼構造代碼塊的代碼塊就會被移動構造函數中執行,是在構造函數之前執行的,構造函數的中代碼是最後執行的。
4. 成員變量的顯示初始化與構造代碼塊 的代碼是按照目前代碼的順序執行的。
<span style="font-family:Microsoft YaHei;font-size:14px;">class Demo5
{
//構造函數
public Demo5(){ //構造函數
i = 300000000;
}
//構造代碼塊 //構造代碼塊的初始化
{
i = 200000000;
}
int i = 100000000; //成員變量的顯初始化
public static void main(String[] args)
{
Demo5 d = new Demo5();
System.out.println("i = "+d.i); // 雙、吳、劉 :2000 :
}
}</span>
5.this關鍵字
1)this關鍵字
this關鍵字代表是對象的引用。也就是this在指向一個對象,所指向的對象就是調用該函數的對象引用。
2)this關鍵字的作用
ü 如果存在同名成員變量與局部變量時,在方法内部預設是通路局部變量的資料,可以通過this關鍵字指定通路成員變量的資料。
ü 在一個構造函數中可以調用另外一個構造函數初始化對象。
3)this關鍵字調用其他的構造函數要注意的事項
ü this關鍵字調用其他的構造函數時,this關鍵字必須要位于構造函數中的第一個語句。
ü this關鍵字在構造函數中不能出現互相調用 的情況,因為是一個死循環。
4)this關鍵字要注意的事項
ü 存在同名的成員變量與局部變量時,在方法的内部通路的是局部變量(java 采取的是“就近原則”的機制通路的。)
ü 如果在一個方法中通路了一個變量,該變量隻存在成員變量的情況下,那麼java編譯器會在該變量的 前面添加this關鍵字。
5)this關鍵字代碼執行個體
<span style="font-family:Microsoft YaHei;font-size:14px;">class Animal{
String name ; //成員變量
String color;
public Animal(String n , String c){
name = n;
color = c;
}
//this關鍵字代表了所屬函數的調用者對象
public void eat(){
//System.out.println("this:"+ this);
String name = "老鼠"; //局部變量
System.out.println(name+"在吃..."); //需求: 就要目前的name是成員變量的name.
}
}
class Demo6
{
public static void main(String[] args)
{
Animal dog = new Animal("狗","白色"); //現在在記憶體中存在兩份name資料。
Animal cat = new Animal("貓","黑色");
cat.eat();
}
}</span>
6.this關鍵字調用本類的構造方法
<span style="font-family:Microsoft YaHei;font-size:14px;">classStudent{
int id; //身份證
String name; //名字
//目前情況:存在同名 的成員 變量與局部變量,在方法内部預設是使用局部變量的。
public Student(int id,String name){ //一個函數的形式參數也是屬于局部變量。
this(name); //調用了本類的一個參數的構造方法
//this(); //調用了本類無參的 構造方法。
this.id = id; // this.id = id 局部變量的id給成員變量的id指派
System.out.println("兩個參數的構造方法被調用了...");
}
public Student(){
System.out.println("無參的構造方法被調用了...");
}
public Student(String name){
this.name = name;
System.out.println("一個參數的構造方法被調用了...");
}
}
classDemo7
{
public static void main(String[] args)
{
Student s = new Student(110,"鐵蛋");
System.out.println("編号:"+ s.id+" 名字:" + s.name);
/*
Student s2 = new Student("金胖子");
System.out.println("名字:" + s2.name);
*/
}
}</span>
總結:實際工作中,存在着構造函數之間的互相調用,但是構造函數不是普通的成員函數,不能通過函數名自己接調用
是以sun公司提供this關鍵字。
this是什麼
1:在構造函數中列印this
2:建立對象,列印對象名p
3:this和p是一樣的都是記憶體位址值。
4:this代表所在函數所屬對象的引用。
7.this關鍵字的練習
需求: 使用java定義一個人類,人具備 id、name 、 age三個屬性,還具備一個比較年齡的方法。
要求: 必須 要 寫上構造函數,構造函數也必須要使用上this關鍵字。
<span style="font-family:Microsoft YaHei;font-size:14px;">class Person{
int id; //編号
String name; //姓名
int age; //年齡
//構造函數
public Person(int id,String name ,int age){
this.id = id;
this.name = name;
this.age = age;
}
//比較年齡的方法
public void compareAge(Person p2){
if(this.age>p2.age){
System.out.println(this.name+"大!");
}else if(this.age<p2.age){
System.out.println(p2.name+"大!");
}else{
System.out.println("同齡");
}
}
}
class Demo8{
public static void main(String[] args)
{
Person p1 = new Person(110,"狗娃",17);
Person p2 = new Person(119,"鐵蛋",9);
p1.compareAge(p1);
}
}</span>
8.static修飾成員變量
static(靜态\修飾符)
1. static修飾成員變量 :如果有資料需要被共享給所有對象使用時,那麼就可以使用static修飾。
靜态成員變量的通路方式:
方式1: 可以使用對象進行通路。
格式: 對象.變量名。
方式二: 可以使用類名進行通路。
格式: 類名.變量名;
注意:
1. 非靜态的成員變量隻能使用對象進行通路,不能使用類名進行通路。
2. 千萬不要為了友善通路資料而使用static修飾成員變量,隻有成員變量的資料是真正需要被共享的時候
才使用static修飾。
static修飾成員變量的應用場景: 如果一個資料需要被所有對象共享使用的時候,這時候即可好實用static修飾。
2. static修飾成員函數:
<span style="font-family:Microsoft YaHei;font-size:14px;">classStudent2{
static Stringname; //非靜态成員變量
static String country = "中國"; //靜态的成員變量
public Student2(String name){
this.name = name;
}
}
classDemo10 {
public static void main(String[] args)
{
Student2 s1 = new Student2("狗娃");
Student2 s2 = new Student2("狗剩");
//System.out.println("國籍:"+Student.country);
System.out.println("名字:"+ s1.name);
System.out.println("名字:"+ s2.name);
}
}</span>
9.static修飾成員變量的應用場景
需求: 統計一個類被使用了多少次建立對象,該類對外顯示被建立的次數。
<span style="font-family:Microsoft YaHei;font-size:14px;">class Emp{
//非靜态的成員變量。
static int count = 0; //計數器
String name;
//構造代碼塊
{
count++;
}
public Emp(String name){
this.name = name;
}
public Emp(){ //每建立一個對象的時候都會執行這裡 的代碼
}
public void showCount(){
System.out.println("建立了"+ count+"個對象");
}
}
class Demo11
{
public static void main(String[] args)
{
Emp e1 = new Emp();
Emp e2 = new Emp();
Emp e3 =new Emp();
e3.showCount();
}
}</span>