你聽過這個笑話嗎?你有對象嗎?沒有的話就new一個吧!
但是此對象非彼對象哦~
1.什么是對象?
Java是一門面向對象的語言(OOP),在Java中,有一句話叫:萬事萬物皆為對象。
我們生活中的每一件東西都可以看作是一個對象,包括我們本身都是一個對象。
這是一種抽象的思想,我們將一件事物提取出特征和行為,將特征定義為屬性,將行為封裝成方法。
如,一個人,特征有姓名、年齡、性別、職業等等,行為有吃飯、睡覺、學習等等。
2.什么是面向對象?
-
面向過程:了解面向對象前,先了解面向過程。我們之前所編寫的程序都是面向過程的,分析解決問題的步驟,然后按照步驟第一步做什么,第二步做什么......如果將步驟寫成了方法,就依次調用方法。適合處理簡單的問題。
-
面向對象:而面向對象是一種抽象的分類的思想,分析解決問題需要從哪幾個方面出發,即有哪幾個分類,然后對這些分類進行單獨的面向過程的思考,每一個分類需要具體的完成什么。用於處理復雜的問題。
例:
-
面向過程:一個人要喝水,那么他首先就看看杯子里有沒有水,有的話就喝水,沒有的話,就倒水再喝水。
-
面向對象:現在要建一棟房子,這就更復雜了,首先需要分為三大類,需要設計人員設計圖紙,需要建築人員建房子,需要裝修人員裝修;而設計人員怎么設計圖紙,建築人員怎么建造,裝修人員怎么裝修又是每一個分類的具體細節。
而我們到最后要用Java來完成的東西,肯定是復雜的,所以面向對象思想極其重要。我們主要從以下思考出發:
對象有哪些?對象的特征(屬性)和行為(方法)是什么?對象與對象的關系是什么?
3.類與對象的關系
我們知道,不管使用什么思想,Java的代碼一定是編寫在類中的,所以我們的對象也肯定是在類中的,而上述我們又提到,我們要在類中定義對象的特征(屬性)和行為(方法),所以我們可以總結面向對象編程的本質:
面向對象編程的本質:以類的形式組織代碼,以對象的形式組織(封裝)數據。
那類是對象是什么關系呢?
從認識論的角度來看:我們先確定了對象,再為該對象書寫一個類。(我們確定了學生為一個對象,就需要定義一個對應的學生類,在類 中書寫學生的特征(屬性)和行為(方法));
從代碼運行角度來看:我們是先有了類,再使用類創造了對象。(我們代碼的運行首先會加載該學生類,再運行該類中的代碼,如對象操 作等內容)。
所以,類與對象的關系總結如下:
類是對象的模板。(在類中定義了對象的屬性和行為,即提供了對象的基本框架。)
對象是類的實例。(我們通過類來創建對象。)
類是具有共同屬性和行為的對象的抽象。(一個學生類,張三是學生,李四也是學生,他們擁有姓名、性別、學號等,也有共同的行為,學習。)
4.類的定義
之前,我們沒有具體的探究過類的定義,直接使用的是IDEA中自動生成的模板,我們現在再來看一下這個模板:
package com.dh.oop;
public class OopDemo01 {
}
權限修飾符
自動生成的類中的權限符為最大的public,我們換成其它的修飾符會怎么樣呢?



可以看到,只能用public或者是default這兩個權限修飾符來修飾類,protected和private是不能用來修飾類的!
其實也不難理解,因為類是Java的最小單位,我們解決問題就是通過一個一個類聯合起來的,如果權限符為protected和private了,就有了很大的訪問局限,這個類差不多就是個單獨的類,和別的類沒什么關系,那這個類的意義也就不大了。就像煮飯,菜刀拿來切菜,但是你把菜刀鎖進了櫃子里,只有擁有那把鑰匙的廚師才能使用它,那這菜刀存在的意義就不大了。
那可以定義多個類嗎?


我們可以看到,在一個.java文件中,可以定義多個類,但是只能有一個被public修飾。
但是一般不建議在一個java文件中書寫多個類,一個java文件一般只書寫一個類,不就是多建一個java文件的事嘛,也不麻煩對不對
class
Java使用class關鍵字來定義一個類。
類名
類名的定義要符合標識符的命名規則,最好見名知意,一般為駝峰命名法,每個單詞的首字母都大寫。
需要注意的是:在同一個包下的類不允許重名,在不同包下的類允許同名。
注意:
在類體中不能直接出現可執行語句,會直接紅色波浪線報錯
- if、switch、while、do...while、for;
- 打印語句;
- 賦值語句;
- ......
5.對象的聲明和使用
首先,我們要在類中定義對象的屬性和方法:
package com.dh.oop;
//學生類
public class Student {
//屬性和方法是同一級別的
//屬性
public String name;
public int age;
public char sex;
public int num;
//方法
public void study(){
System.out.println("學生學習");
}
//程序入口:main方法
public static void main(String[] args) {
}
}
成員變量、局部變量、類變量
之前我們都是將變量直接定義在方法內部的,現在卻定義在了方法的外部。這里就涉及到了成員變量和局部變量的概念了。
成員變量:定義在類的內部,方法的外部。具有默認值(整數為0,浮點數為0.0,布爾值為false,char為'',引用為null);
別名:實例變量。
作用域:類中。(本類中可直接使用,其他類也可能可以使用對象調用,具體看是否有權限)
使用方法:對象.變量調用,this.變量名調用,直接調用。
局部變量:定義在方法的內部。沒有默認值,必須賦初始值才能使用,否則使用會報錯;
作用域:定義的那個方法中。
使用方法:在方法中直接使用。
類變量:被static修飾的變量,也是成員變量的一種。**該變量屬於類,凌駕於對象之上,只有一份,給所有的實例對象共享。
別名:靜態變量。
作用域:類中。(本類中可直接使用,其他類也可能可以使用對象調用或者類名調用,具體看是否有權限)
注意:只能修飾成員變量,不能修飾局部變量。
使用方法:在static方法中直接使用,可以通過對象.變量名調用,也可以直接使用類名.變量名調用。
(可能有些現在不理解的,會慢慢在后續講到~)
成員變量和局部變量可重名,重名時遵循就近原則:
package com.dh.oop;
public class Student {
public String name = "張三";
public static void study(String name){
System.out.println(name +"在學習");
}
public static void main(String[] args) {
study("李四");
}
}
局部變量和成員變量都為name,但是輸出結果為李四在學習,可以證明,使用的是局部變量:

對象的聲明
語法:類名 對象名 ;
Student student;
對象的聲明可以在類體中,也可以在方法中。
對象的實例化
語法:對象名 = new 類名();
student = new Stdent();
擴展:在類體中實例化自身而導致的棧溢出問題
針對上述在類體中聲明對象,如果該對象是在static方法中實例化的話,注意對象也需要定義成static。如果直接在類體中實例化對象,當其他方法中有實例化對象的操作時,會發生棧溢出錯誤:
package com.dh.oop;
public class StudentDemo {
public String name;
public int age;
StudentDemo s = new StudentDemo();//棧溢出
public static void main(String[] args) {
StudentDemo studentDemo = new StudentDemo();
}
}

錯誤原因分析:在main方法中new一個對象的話,會初始化該類的成員變量,變量里又有new操作,又要去初始化成員變量,又有new,然后就一直得在棧里開辟空間,就會導致棧溢出錯誤。
解決方案:將需要在類中實例化的對象定義成static。
原理:如果是static的話,只在首次new的時候開辟內存,new新對象的時候,再就不會開辟新的內存,直接指向第一個,就不會棧內存不夠而溢出了。
邊聲明邊實例化
語法:類名 對象名 = new 類名();
//聲明一個student對象
Student student = new Student();
//可聲明多個,不可重名
Student student1 = new Student();
//student和student是不同的兩個對象
推薦使用這種方法!
對象的賦值和使用
語法:
屬性的賦值:對象名.變量名 = 值;
屬性的使用:對象名.變量名;
方法的使用:對象名.方法(【參數】);
//屬性的使用
student.name = "zhangsan";
student.age = 18;
student.sex = '男';
student.num = 001;
System.out.println(student.name+"\t"+student.age+"\t"+student.sex+"\t"+student.num);
//方法的使用
student.study("李四");
不同的對象可以自定義其自己的屬性值
//不同的對象可以有不同的屬性
student1.name = "lisi";
student1.age = 19;
student1.sex = '男';
student1.num = 002;
System.out.println(student1.name+"\t"+student1.age+"\t"+student1.sex+"\t"+student1.num);
//不同的對象調用方法
student1.study("lisi");
總代碼:
package com.dh.oop;
public class Student {
//可以賦初值,如果不賦值的話也會有默認值
public String name = "張三";
public int age;
public char sex;
public int num;
//成員方法
public void study(String name){
System.out.println(name+"在學習");
}
public static void main(String[] args) {
//聲明一個student對象
Student student = new Student();
//可聲明多個,但不可重名
Student student1 = new Student();
//屬性的使用
student.name = "zhangsan";
student.age = 18;
student.sex = '男';
student.num = 1001;
System.out.println(student.name+"\t"+student.age+"\t"+student.sex+"\t"+student.num);
//方法的使用
//對象可以在static方法中直接調用非static方法(如果直接調用就只能調用static方法,對象的強大性來了!)
student.study("zhangsan");
//不同的對象可以有不同的屬性
student1.name = "lisi";
student1.age = 19;
student1.sex = '男';
student1.num = 1002;
System.out.println(student1.name+"\t"+student1.age+"\t"+student1.sex+"\t"+student1.num);
//不同的對象調用方法
student1.study("lisi");
}
}
代碼運行結果:

本人水平有限,若有錯誤望指出~感激不盡!
