目錄
類和物件
1. 類與物件的初步認知
【面向物件概念】
【面向物件設計】
2. 類和類的實體化
3. 類的成員
3.1 欄位/屬性/成員變數
3.2 方法 (method)
3.3 static 關鍵字
注意事項
參考相關注意事項:
4. 封裝
4.1 private實作封裝
4.2 getter和setter方法
5. 構造方法
5.1 基本語法
面試相關問題:
6. 認識代碼塊
6.1 構造代碼塊 和 靜態代碼塊
7. toString方法
8. 匿名物件
類和物件
1. 類與物件的初步認知
C語言是面向程序的,關注的是程序,分析出求解問題的步驟,通過函式呼叫逐步解決問題,
JAVA是基于面向物件的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成,
面向程序注重的是程序,在整個程序中所涉及的行為,就是功能,
面向物件注重的是物件,也就是參與程序所涉及到的主體,是通過邏輯將一個個功能實作連接起來
面向程序: 1.把冰箱打開 2. 把大象放入 3. 冰箱關起來
面向物件: 打開冰箱,儲存,關閉都是對冰箱的操作,是冰箱的行為,冰箱就是一個物件,所以只要操作冰箱所具備的功能,都要定義在冰箱中,
【面向物件概念】
1.面向物件是思考問題的一種思考方式,是一種思想,比如:概念與實體,理論與實踐,名和實等等,
2.類就是一類物件的統稱,物件就是這一類具體化的一個實體,
3.面向物件的好處:將復雜的事情變簡單了,只要面對一個物件就行,
【面向物件設計】
開發時:找物件,創建物件,使用物件,并維護物件之間的關系,
2. 類和類的實體化
類就是一類物件的統稱,物件就是這一類具體化的一個實體,
一個類,可以產生無數的物件
宣告一個類就是創建一個新的資料型別,而類在 Java 中屬于參考型別, Java 使用關鍵字 class 來宣告類,下面簡單的宣告一個類,
代碼實體:
class Person{
public String name;
public int age;
public void eat(){
System.out.println(name+"正在吃飯!");
}
}
類中的元素稱為:成員屬性,類中的函式稱為:成員方法,

類的實體化
用型別別創建物件的程序,稱為類的實體化
class Person{
//成員屬性
public String name;
public int age;
//成員方法
public void eat(){
System.out.println(name+"正在吃飯!");
}
}
public class TestDemo {
public static void main(String[] args) {
// person1是一個物件 通過new實體化物件
Person person1 = new Person();
person1.eat();//成員方法呼叫需要通過物件的參考呼叫
person1.name = "niubi";
person1.age = 666;
System.out.println(person1.name);
System.out.println(person1.age);
//產生物件 實體化物件
Person person2 = new Person();
Person person3 = new Person();
//一個類可以產生無數個物件
}
}
運行結果:

注意事項:
- new 關鍵字用于創建一個物件的實體.
- 使用來訪問物件中的屬性和方法.
- 同一個類可以創建對個實體.
3. 類的成員
3.1 欄位/屬性/成員變數
在類中, 但是方法外部定義的變數. 這樣的變數我們稱為 "欄位" 或 "屬性" 或 "成員變數"(三種稱呼都可以, 一般不會嚴 格區分).
成員變數分為:普通成員變數,靜態成員變數.
class Person{
//普通成員變數
public String name;
public int age;
//靜態成員變數->類變數
public static int count;
}
3.2 方法 (method)
show 方法是和 實體相關聯的. 如果創建了其他實體, 那么 show 的行為就會發生變化
class Person{
public String name = "niubi";
public int age=666;
//方法
public void show() {
System.out.println("我叫" + name + ", 今年" + age + "歲");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
person.show();
}
}
運行結果:

3.3 static 關鍵字
a) 修飾屬性
class Person{
//普通成員變數
public String name;
public int age;
//靜態成員變數->類變數
public static int count;
}
public class TestDemo {
public static void main(String[] args) {
Person person1 = new Person();
person1.count++;
person1.age++;
System.out.println(person1.age);
System.out.println(person1.count);
System.out.println("========================");
Person person2 = new Person();
person2.count++;
person2.age++;
System.out.println(person2.age);
System.out.println(person2.count);
}
}
記憶體決議圖:


b)修飾方法
如果在任何方法上應用 static 關鍵字,此方法稱為靜態方法,
- 靜態方法屬于類,而不屬于類的物件,
- 可以直接呼叫靜態方法,而無需創建類的實體,
- 靜態方法可以訪問靜態資料成員,并可以更改靜態資料成員的值,
class Person{
//類方法
public static void staticFunc(){
System.out.println("static::func()");
}
}
public class TestDemo {
public static void main(String[] args) {
Person.staticFunc();
}
}
注意事項
1. 普通方法內部,不能定義靜態變數
class Person{
public void eat(){
static int size = 0;//err
System.out.println(name+"正在吃飯!");
}
public static void staticFunc(){
static int size = 10;//err
System.out.println("static::func()");
}
}

2.靜態內部不能呼叫普通的方法.
class Person{
public String name;
public int age;
public void eat(){
System.out.println(name+"正在吃飯!");
}
//類方法
public static void staticFunc(){
eat();//err
System.out.println("static::func()");
}
}

參考相關注意事項:
1.
class Person{
public String name;
public int age;
}
public class TestDemo {
public static void main(String[] args) {
Person person = null;//這個參考不指向任何物件
}

2.
class Person{
public String name;
public int age;
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
Person person1 = person;
}

3.
class Person{
public String name;
public int age;
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
person = new Person();
person = new Person();
person = new Person();
person = new Person();
person = new Person();
}

4.
參考一定在堆疊上面嗎?
肯定不是!!!
class Person{
public String name;
public int age;
}
public class TestDemo {
Person person = new Person();
public static void main(String[] args) {
TestDemo testDemo = new TestDemo();
}
}

4. 封裝
4.1 private實作封裝
private/ public 這兩個關鍵字表示 "訪問權限控制" .
- 被 public 修飾的成員變數或者成員方法, 可以直接被類的呼叫者使用.
- 被 private 修飾的成員變數或者成員方法, 不能被類的呼叫者使用.
此時只能在當前類當中使用他--封裝起來了
class Person{
private String name;
private int age;
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
person.age=18;//err
person.name = "www";//err
}
}

4.2 getter和setter方法
class Person{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
person.setAge(20);
person.setName("wwww");
System.out.println(person.getAge());
System.out.println(person.getName());
}
}
注意事項:
- getName 即為 getter 方法, 表示獲取這個成員的值.
- setName 即為 setter 方法, 表示設定這個成員的值.
- 當set方法的形參名字和類中的成員屬性的名字一樣的時候,如果不使用this, 相當于自賦值. this 表示當前實體 的參考.
- 不是所有的欄位都一定要提供 setter / getter 方法, 而是要根據實際情況決定提供哪種方法.
- 在 IDEA 中可以使用 alt + insert (或者 alt + F12) 快速生成 setter / getter 方法. 在 VSCode 中可以使用滑鼠右鍵 選單 -> 源代碼操作 中自動生成 setter / getter 方法.
5. 構造方法
5.1 基本語法
語法規則 :
1.方法名稱必須與類名稱相同
2.構造方法沒有回傳值型別宣告
3.每一個類中一定至少存在一個構造方法(沒有明確定義,則系統自動生成一個無參構造)
new 執行程序:
- 為物件分配記憶體空間
- 呼叫物件的構造方法
代碼示例:
class Person{
private String name;
private int age;
public Person(){
System.out.println("Person()==不帶引數的構造方法");
}
public Person(String name){
this.name = name;
System.out.println("Person(String)==帶一個String型別的構造方法");
}
public Person(String name , int age ){
this.name = name;
this.age = age;
System.out.println("Person(String,int)==帶兩個String,int型別的構造方法");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
System.out.println("========");
Person person1 = new Person("wwww");
System.out.println("========");
Person person2 = new Person("wwwzz",18);
}
}
運行結果:

注意事項:
- 如果類中沒有提供任何的建構式,那么編譯器會默認生成一個不帶有引數的建構式
- 若當前類中定義了其他的構造方法,那么,編譯器就默認的無參構造將不再生成.
- 構造方法之間構成多載. 規則和普通方法的多載一致.
面試相關問題:
this 和 super 有什么區別?
this:
1. this.data 呼叫當前物件的屬性2. this.func 呼叫當前物件的方法
3. this() 呼叫當前物件的其他構造方法
注:this()存放在建構式當中!

6. 認識代碼塊
6.1 構造代碼塊 和 靜態代碼塊
構造塊:定義在類中的代碼塊(不加修飾符),也叫:實體代碼塊,構造代碼塊一般用于初始化實體成員變數,
class Person{
private String name;
private int age;
{
System.out.println("實體代碼塊!");
}
static{
System.out.println("靜態代碼塊!");
}
public Person(){
System.out.println("Person()==不帶引數的構造方法");
}
public Person(String name){
this.name = name;
System.out.println("Person(String)==帶一個String型別的構造方法");
}
public Person(String name , int age ){
this.name = name;
this.age = age;
System.out.println("Person(String,int)==帶兩個String,int型別的構造方法");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
System.out.println("========");
Person person1 = new Person();
}
運行結果:

注意事項:
1. 靜態代碼塊不管生成多少個物件,其只會執行一次,且是最先執行的,
2. 靜態代碼塊執行完畢后, 實體代碼塊(構造塊)執行,再然后是建構式執行,
靜態代碼塊不用實體化物件,也可以被執行,只執行一次
class Person{
public static int count = 10;
static{
count = 99;
System.out.println("靜態代碼塊!");
}
}
public class TestDemo {
public static void main(String[] args) {
System.out.println(Person.count);
}
}
運行結果:

注意:
如果都是靜態的,那么和定義的順序是有關的
如果當count沒有初始化時,默認值就是99
7. toString方法
class Person{
//普通成員變數
public String name;
public int age;
//靜態成員變數->類變數
public static int count;
public void eat(){
//static int size = 0;
System.out.println(name+"正在吃飯!");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//類方法
public static void staticFunc(){
System.out.println("static::func()");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person);
}
}
輸出結果:
注意事項 :
- toString 方法會在 println 的時候被自動呼叫.
- 將物件轉成字串這樣的操作我們稱為 序列化.
- toString 是 Object 類提供的方法, 我們自己創建的 Person 類默認繼承自 Object 類, 可以重寫 toString 方法實 現我們自己版本的轉換字串方法. (關于繼承和重寫這樣的概念, 我們后面會重點介紹).
- @Override 在 Java 中稱為 "注解", 此處的 @Override 表示下面實作的 toString 方法是重寫了父類的方法. 關于 注解后面的課程會詳細介紹.
- IDEA快速生成Object的toString方法快捷鍵:alt+f12(insert)
8. 匿名物件
匿名只是表示沒有名字的物件.
- 沒有參考的物件稱為匿名物件.
- 匿名物件只能在創建物件時使用.
- 如果一個物件只是用一次, 后面不需要用了, 可以考慮使用匿名物件.
代碼實體:
class Person{
public String name = "wwww";
public int age = 18;
public void eat(){
System.out.println(name+"正在吃飯!");
}
public void sleep(){
System.out.println(name+"正在睡覺!");
}
}
public class TestDemo {
public static void main (String[] args) {
new Person().eat();
new Person().sleep();
System.out.println(new Person());
}
}
運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/342197.html
標籤:java
上一篇:Java正則運算式
