Java面向對象01——類與對象

来源:https://www.cnblogs.com/baiye123/p/18122338
-Advertisement-
Play Games

大家好,我是白夜,今天和大家聊聊類與對象 一、初識面向對象(瞭解) 1.1、面向過程和麵向對象 面向過程編程 C 語言就是面向過程編程的,關註的是過程,分析出求解問題的步驟,通過函數調用逐步解決問題。 面向對象編程 JAVA 是基於面向對象的,關註的是對象,將一件事情拆分成不同的對象,靠對象之間的交 ...


大家好,我是白夜,今天和大家聊聊類與對象

一、初識面向對象(瞭解)

1.1、面向過程和麵向對象

面向過程編程

C 語言就是面向過程編程的,關註的是過程,分析出求解問題的步驟,通過函數調用逐步解決問題。

面向對象編程

JAVA 是基於面向對象的,關註的是對象,將一件事情拆分成不同的對象,靠對象之間的交互完成。

舉個例子,比如洗衣服

面向過程:1.拿桶 2.把衣服放桶里 3.接水 4.放洗衣服 5.搓 6.再接水 7.把衣服擰乾 8.曬衣服

面向對象:1.把衣服和洗衣粉放進洗衣機 2.打開洗衣機 3.把衣服拿出來晾乾

在這裡洗衣機就是一個對象,所以只要操作洗衣機所具備的功能,都要定義在對象中。

1.2、面向過程和麵向對象的區別

面向過程:註重的是過程,在整個過程中所涉及的行為,就是功能。

面向對象:註重的是對象,也就是參與過程所涉及到的主體。是通過邏輯將一個個功能實現連接起來

二、類與對象

什麼是類?

​ 類是具備某些共同特征的實體的集合,是對所具有相同特征實體的抽象, 例如人類、車類、星球類,動物類, 豬類等

什麼是對象?

對象是類的實例,簡單的認為對象就是類中具體的個體。

用一個例子給你說明一下他們的關係:

比如“人類”就是一個類,那麼具體的某個人“張三”就是“人類”這個類的對象,而“名字、年齡”等信息就是對象的屬性,人的動作比如“吃飯、穿衣”等就是對象的方法

2.1、類的定義

語法:

class People{
    //成員變數/欄位/屬性
    //修飾符/數據類型/變數名
    public String name ;
    public String sex;
    public int age;

    //成員方法/行為
    public void show(){
        System.out.println("姓名:"+name+"性別:"+sex+"年齡:"+age);
    }
}

要求:

  1. 類名,大駝峰,見名知意,不能以jdk中存在的類命名
  2. 成員變數名和方法名,小駝峰,見名知意
  3. 在類名、方法名、成員變數名上面寫文檔註釋

2.2、類的實例化

用類類型創建對象的過程,稱為類的實例化

我們已經知道通過class關鍵字來定義一個類了,而我們知道類只是相當於一個模板,所以我們要通過類來實例化對象,由類產生對象的過程叫做 實例化一個對象。

2.2.1、語法

class People{//類名大駝峰
    //成員變數/欄位/屬性
    public String name ;
    public String sex;
    public int age;

    //成員方法/行為
    public void show(){
        System.out.println("姓名:"+name+"性別:"+sex+"年齡:"+age);
    }
}
 
public class Test {
    public static void main(String[] args) {
        //我們通過 new 關鍵字來實例化一個對象
        People p1 = new People();
        //通過 new 關鍵字我們是可以實例化多個對象的
        People p2 = new People();
        People p3 = new People();
    }
}

圖片1

2.2.2、類在記憶體中的分析

每創建一個對象就會在記憶體中開闢一片空間,在棧上會開闢一個引用地址,會指向堆上的對象

p1 和p2 這些變數都是局部變數它們(對象)屬於引用

註意:類裡面的方法並不是是存在堆區的 ,方法本身是不占記憶體的,方法是存在方法區里的方法表中,在每個對象 new 好之後前面有幾個位元組存的就是方法表的地址,只有在調用這個方法時,會通過方法表的地址找到這個這個方法,然後在棧上為這個方法開闢棧幀。

圖片2

2.2.3、訪問類的成員

成員變數的訪問:對象名 . 屬性名

成員方法的訪問:對象名 . 方法名

class People{
    //成員變數/欄位/屬性
    public String name ;
    public String sex;
    public int age;
    //成員方法/行為
    public void show(){
        System.out.println("姓名:"+name+"性別:"+sex+"年齡:"+age);
    }
}
public class Test {
    public static void main(String[] args) {
        People p1 = new People();
        System.out.println(p1.name);
        System.out.println(p1.sex);
        System.out.println(p1.age);
        p1.show();
    }
}

註意:這裡的成員變數並沒有初始化,不同於局部變數不初始化會報錯。成員變數不初始化是其類型對應的0值。

圖片3

2.3、類的成員

2.3.1、初始化成員變數

我們把定義在類的內部,方法的外部的變數叫“欄位”或者叫它成員變數有時候也叫它“屬性"。這三種叫法並沒有嚴格區分

public static void main(String[] args) {
        People p1 = new People();
        p1.name = "java";
        p1.sex = "nan";
        p1.age = 50;
        p1.show();
    }
}

還有一種就是在定義成員變數的時候賦值,但並不建議這樣寫,因為在實例化後還是能初始化,沒必要多此一舉。而且這個類是一個模板,把模板初始化也是不合適的。

class People{
    //成員變數/欄位/屬性
    public String name = "zhangsan" ;
    public String sex = "lisi";
    public int age = 22;
    //成員方法/行為
    public void show(){
        System.out.println("姓名:"+name+"性別:"+sex+"年齡:"+age);
    }
}

再來看一個代碼,這個代碼是什麼意思呢?

public static void main(String[] args) {
    	//p1和p2都指向了這個對象
        People p1 = new People();
        People p2 = p1;
}

圖片4

就是我們曾經講過的方法,用於描述一個對象的行為.

class People{
    //成員變數/欄位/屬性
    public String name ;
    public String sex;
    public int age;
    //成員方法/行為
    public void show(){
        System.out.println("姓名:"+name+"性別:"+sex+"年齡:"+age);
    }
    public void prt(){
        System.out.println("愛java");
    }
}
public class Test {
    public static void main(String[] args) {
        People p1 = new People();
        p1.show();
        p1.prt();
    }
}

圖片5

2.3、修飾符(瞭解)

對 Java 當中的,類,變數,方法,構造方法等等.....進行修飾,賦予被修飾內容特殊意義。

public(公共訪問控制符):它表示公共的意思,被public修飾的類、介面、方法和變數等成員都可以被任何其他類或對象所訪問。

private(私有訪問控制符):它表示私有的意思,只有在定義該成員的類內部才能被訪問。被private修飾的類、方法、變數或介面只能在自己的類中被調用,無法被同一個包內或者其他包中的其他類或對象所訪問。

protected(保護訪問控制符): 它表示受保護的意思。被protected修飾的類、方法、變數或者介面只能被相同包或其子類中的類或對象所訪問。

static(靜態修飾符):它可以用來修飾成員變數、成員方法和代碼塊。當一個變數或方法被聲明為 static 時,它就是一個靜態成員。

final:有最終的、不可變更的意思,它可用於修飾類、變數和方法。用於表示它修飾的類、方法和變數不可改變。

native: 本地修飾符。指定此方法的方法體是用其他語言在程式外部編寫的

abstract: 將一個類聲明為抽象類,沒有實現的方法,需要子類提供方法實現。

transient(過度修飾符): 指定該變數是系統保留,暫無特別作用的臨時性變數。

volatile: 指定該變數可以同時被幾個線程式控制制和修改。

synchronize: 同步修飾符,在多個線程中,該修飾符用於在運行前,對他所屬的方法加鎖,以防止其他線程的訪問,運行結束後解鎖。

三、構造方法

3.1、構造方法的基本使用

構造方法是一種特殊方法, 使用關鍵字new實例化新對象時會被自動調用, 用於完成初始化操作 構造方法沒有返回值,且方法名和類名是相同的 構造方法是用來構造對象的(實例化對象)

new 執行過程

1.為對象分配記憶體空間

2.調用合適的構造方法

語法:

  1. 構造方法的名字和類名完全一致(包括大小寫完全一致)。

  2. 沒有返回值類型(void也不行)。

  3. 構造方法方法體不能返回任何的值(即不能在方法體中return 值)。

  4. 其他的和普通方法類似 ,可以有修飾符(public、protected、private、預設),可以有形參列表。

  5. 構造方法必須有方法體。

  6. 構造方法不能有任何非訪問性質的修飾符修飾,例如 static、final、synchronized、abstract等都不能修飾構造方法。

class People{
    private String name ;
    private int age;//普通成員變數
    public static int cont;//靜態成員變數
	
    public People(){
        System.out.println("這是一個不帶有參數的構造方法");
    }

}
public class Test {
    public static void main(String[] args) {
       People p = new People();
    }
}

運行結果:

圖片6

那麼為什麼我們前面示例化對象時為什麼沒有構造方法呢?

如果我們沒有寫構造方法,系統預設會有一個沒有參數且沒有任何內容的構造方法

圖片7

特點:

  1. 每一個類中都至少有一個構造方法;
  2. 如果沒有看到(顯示的),那麼存在一個隱式的無參數的構造方法;
  3. 如果一個類中有顯示的構造方法,那麼隱式的無參的構造方法就不存在了;

3.2、構造方法的重載

構造方法和方法一樣是可以實現重載的, 由於需求不同,會創建多個構造方法

重載:

1.方法名要相同
2.參數列表不同(類型和個數)
3.返回值不做要求

class People{
    private String name ;
    private int age;//普通成員變數
    public static int cont;//靜態成員變數

    public People(){
        System.out.println("這是一個不帶參的構造方法");
    }
    public People(String name){
        System.out.println("這是一個帶有一個參數的構造方法");
    }
    public  People(String name,String sex){
        System.out.println("這是一個帶有兩個參數的構造方法");
    }

}
public class Test {
    public static void main(String[] args) {
       People p = new People();
       People p1 = new People("張三");
       People p2 = new People("李四","男");
    }
}

圖片8

四、匿名對象(瞭解)

概念:

​ 匿名對象,就是創建的時候沒有使用變數接收保存一個對象。但是匿名對象本質也是一個對象(具體的值)

作用:

​ 可以節約資源,因為GC【垃圾回收器】會不定時回收匿名對象

使用場景

​ 匿名對象一般用在:只需要使用一次的情況(如:調用一次非static修飾的普通方法作為方法實參使用)

public class Main {
    public static void main(String[] args) {
        // 創建匿名對象並調用方法
        new MyClass().doSomething();

        // 在方法參數中使用匿名對象
        printMessage(new Message("Hello, World!"));
    }

    static void printMessage(Message message) {
        System.out.println(message.getText());
    }
}

class MyClass {
    void doSomething() {
        System.out.println("Doing something...");
    }
}

class Message {
    private String text;

    public Message(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、三次握手 三次握手(Three-way Handshake)其實就是指建立一個TCP連接時,需要客戶端和伺服器總共發送3個包 主要作用就是為了確認雙方的接收能力和發送能力是否正常、指定自己的初始化序列號為後面的可靠性傳送做準備 過程如下: 第一次握手:客戶端給服務端發一個 SYN 報文,並指明客 ...
  • 首先寫一個bind的簡單示例: 'use strict' function fn() { console.log('this::', this) console.log('arguments::', arguments) } // fn() // 這裡調用時this 在嚴格模式下是undefined ...
  • React 學習之 Hello World React 簡介 React是一個用於構建用戶界面的JavaScript庫,由Facebook開發並維護。React通過聲明式的方式來構建UI,使得代碼更易於理解和測試。React的核心概念包括組件(Component)和虛擬DOM(Virtual DOM ...
  • nvm nvm(Node Version Manager)是一個Node.js的版本管理器。 安裝nvm windows安裝nvm 1. 下載nvm 下載地址:nvm-windows,下載 nvm-noinstall 或者 nvm-setup.exe 如果使用 nvm-noinstall 可以運行 ...
  • 多租戶的概念是我在畢業後不久進第一家公司接觸到的,當時所在部門的業務是計劃建設一套基於自研的、基於開放 API 的、基於 PaaS 的、面向企業(ToB)的多租戶架構平臺,將我們的服務可以成規模地、穩定高效地交付給客戶使用。 ...
  • 什麼是客戶管理系統? 客戶管理系統,也稱為CRM(Customer Relationship Management),主要目標是建立、發展和維護好客戶關係。 CRM系統圍繞客戶全生命周期的管理,吸引和留存客戶,實現縮短銷售周期、降低銷售成本、增加銷售收入的目的,從而提高企業的盈利能力和競爭力。 CR ...
  • 布隆過濾器 極簡概括 英文名稱Bloom Filter,用於判斷一個元素是否在一個大數據集合中,如果檢測到存在則有可能存在,如果不存在則一定不存在。 Redis官網對於布隆過濾器的說明:https://redis.io/docs/data-types/probabilistic/bloom-filt ...
  • Spring學習總結 Spring基本介紹 Spring 學習的核心內容 1.IOC: 控制反轉, 可以管理java 對象 2.AOP : 切麵編程 3.JDBCTemplate : 是spring 提供一套訪問資料庫的技術, 應用性強,相對好理解 4.聲明式事務: 基於ioc/aop 實現事務管理 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...