Java學習第六天

来源:https://www.cnblogs.com/demain/archive/2019/07/30/11273570.html
-Advertisement-
Play Games

1.構造函數的作用: 實現屬性的初始化 使用構造函數實現成員變數的初始化 非靜態成員變數 隨著對象的常見才開闢空間,所以只能使用對象來訪問 靜態成員變數,隨著類的載入而開闢空間,可以通過類直接訪問 2.static關鍵字: static修飾成員變數的特點: 1:static修飾的成員變數是隨著類的加 ...


1.構造函數的作用:
  實現屬性的初始化
  使用構造函數實現成員變數的初始化
  非靜態成員變數 隨著對象的常見才開闢空間,所以只能使用對象來訪問
  靜態成員變數,隨著類的載入而開闢空間,可以通過類直接訪問

2.static關鍵字:

static修飾成員變數的特點:

1:static修飾的成員變數是隨著類的載入而在方法區中的靜態區開闢記憶體的
2:static修飾的成員變數是其所屬類的所有對象共用的
3:static修飾的成員變數可以通過類直接訪問,也可以通過對象訪問

缺點:占用記憶體時間太長(static修飾的變數存儲在方法區的靜態區中,直到程式結束才會釋放記憶體)

3.非靜態的方法:靜態的和非靜態的都能用
 靜態的先出現,非靜態的後出現,靜態的只能用靜態的
 靜態的優先於非靜態的開闢記憶體


4.靜態成員變數和非靜態成員變數對比:

1: 訪問方式

靜態成員變數可以通過類名訪問,也可以通過對象訪問
非靜態成員變數只能通過對象來訪問

2:存儲位置

靜態成員變數是隨著類的載入在方法區的靜態區中開闢記憶體
非靜態成員變數是隨著對象的創建在堆中開闢記憶體

3:存儲數據

靜態成員變數存儲的是其所屬類的所有對象共用的數據
非靜態成員變數存儲的是其所屬類的每個對象特有的數據

4:生命周期

  靜態成員變數是隨著類的載入在方法區的靜態區中開闢記憶體,程式退出時才釋放記憶體
  非靜態成員變數是隨著對象的創建在堆中開闢記憶體,當對象被垃圾回收時才釋放記憶體

 1 class Student
 2 {
 3   String name; //非靜態成員變數 隨著對象的創建才開闢記憶體,所以只能使用對象來訪問
 4   static String country="CN"; //靜態成員變數,隨著類的載入而開闢記憶體,可以通過類直接訪問
 5   //非靜態方法:靜態和非靜態的都能使用
 6   public void study(){
 7     System.out.println("好好學習,天天向上"+name+","+country);
 8   }
 9 
10   public static void show()//靜態方法 Student.show(); 靜態的先出現,非靜態的後出現,靜態的只能使用靜態的
11   {
12     System.out.println("萬元戶"+name);//無法從靜態上下文中引用非靜態變數
13   }
14 }

 

1 public static void main(String[] args) 
2 public :公共的
3 static:靜態成員變數是隨著類的載入在方法區的靜態區中開闢記憶體,程式退出時才釋放記憶體
4 void:說明該方法無返回值
5 String[] args:main方法的參數是一個字元串數組

 

main函數可以重載,只有public static void main(String[] args) 這樣的JVM才會識別為程式的入口,從而進入程式
由靜態可以通過類名調用,通過類名訪問可知,程式入口main()函數定義為static的原因為JVM直接調用類名.main自動運行程式

5.static 只能修飾成員變數、成員方法、內部類
  1.什麼情況下使用static?

   什麼情況下需要把成員變數修飾為static?
      當該成員變數的值需要被所有對象共用時,該變數的值在記憶體中只有一份
   什麼情況下需要把成員方法修飾為static?
      當該方法沒有用到所在類的任何非靜態成員,因為靜態的只能用靜態的,只要方法用到了非靜態的就不能被修飾為static


6.記憶體:靜態成員變數是隨著位元組碼文件的載入載入到在方法區的靜態區中開闢記憶體,程式退出時才釋放記憶體
  所以可以直接通過類名訪問

 

 1 class Person
 2 {
 3   int age;
 4   static String country="CN";
 5 
 6   Person(){}
 7 
 8   Person(int age){
 9   this.age=age;
10   }
11 
12   public static void show(Person person)//沒有用到本類中的非靜態成員變數,用到的是新的對象中的age屬性,和當前的show方法不是一個類中,所以可以是static的
13   {
14     System.out.println(person.age);
15   }
16 
17   public static int add(int a,int b)
18   {
19     return a+b;
20   }
21 }

 


7.靜態(static)的應用:工具類

  讓類不能new對象,為了實現禁止創建對象
  實現:private Array(){};//自定義構造方法,並且用private修飾

8.javadoc -d doc Array.java
  //生成api(說明書)-d(路徑)doc(文件目錄) Array.java(要生成api的java源程式)
  //類必須用public修飾

9.自定義的class類中定義的屬性,即成員變數,在堆中開闢記憶體空間,有預設值
 局部變數,在棧中開闢記憶體空間,沒有預設值,一般需要手動初始化

 靜態代碼塊:隨著類的載入而執行,只執行一次,因為.class文件只載入一次,優先於main的執行

1 class A
2 {
3   static int num=10;
4   static
5   {
6   System.out.println(num);
7   //靜態代碼塊
8   }
9 }

作用:可以把程式的初始化功能寫在靜態代碼塊中,隨著類的載入就同時執行了
應用場景1:對資料庫的連接操作可以寫進靜態代碼塊中

10.構造代碼塊:對象一創建就執行,優先於構造函數

  作用:構造代碼塊用於定義所有對象共同的行為

 1 class Person
 2 {    
 3     String name;
 4     int age;
 5     {
 6         System.out.println("哈哈");
 7     }
 8     Person(String name,int age)
 9     {
10         this.name=name;
11         this.age=age;
12     }
13 }

11.對象初始化過程:
  1.因為創建對象需要位元組碼,所以先載入Person.class到方法區
  2.如果有靜態代碼塊執行靜態代碼塊
  3.到堆中開闢記憶體
  4.給成員變數賦預設值
  5.如果有初始值,給成員變數賦初始值
  6.執行構造代碼塊
  7.執行構造函數
  8.把對象在堆中的記憶體地址賦給棧中變數

12.單例設計模式:解決的是讓一個類在記憶體中只能有一個對象
  1.要想讓一個類只有一個對象,首先這個類肯定不能new
  2. 構造方法修飾為private,那麼一個對象都沒有了,只能在本類中創建對象
  3.需要把這個對象提供給外界使用
  (外部不能new,不能創建對象,但是在內部能new,能創建自己類型的成員的變數)

 1 單例模式-------餓漢式(實際中使用)    
 2 class Earth
 3 {
 4     private static Earth earth=new Earth();/*Earth類型的成員變數,這裡不能修飾為public,因為如果是public,則可以Earth.diqiu調用,但是如果    Earth.diqiu=null,則沒有對象了,不安全*/
 5     private Earth(){};
 6     //讓外界得到內部創建的對象
 7     public static Earth getIntet()
 8     {
 9     return earth;
10     }
11 }
 1 單例模式-------懶漢式(多線程中容易出現線程安全問題)
 2 class Earth
 3 {
 4     private static Earth earth=null;
 5     private Earth(){};
 6     //讓外界得到內部創建的對象
 7     public static Earth getIntet()//只有在初始化的時候才new對象
 8     {
 9         if (earth==null)
10     {
11         earth=new Earth();
12     }
13         return earth;
14     }
15 }

 

13.繼承:實現了代碼的重覆使用,使類和類之間產生了關係,被繼承的是父類,繼承的是子類
 單繼承:java中的繼承是單繼承的,一個類只能繼承另外一個類
 多繼承:一個類能繼承多個類(多繼承會出現調用的不確定性)
   方法:提取共同的屬性和行為,封裝到一個類中

 1 class A
 2 {
 3   public void show(){
 4     System.out.println("A");
 5   }
 6 }
 7 class B
 8 {
 9   public void show(){
10     System.out.println("B");
11   }
12 }
13 class C extends A,B{
14 
15 }
16 public static void main(String[] args)
17 {
18   C c = new C();
19   c.show(); //多繼承會出現調用的不確定性
20 }

  

14.java支持多層繼承
  class D(){}
  class E extends D(){}
  class F extends E(){}

15.繼承中成員變數的特點:

this:是一個引用,總是指向當前被使用的對象
super:不是引用,代表的是父類的數據空間,當子父類中出現同名現象時用來進行區分的

//具備相同的行為,只是行為的表現方式不同
//重寫,覆蓋

16重寫:子類和父類中出現了相同的方法,這種現象叫重寫,也叫覆蓋
    當創建子類對象並調用重寫的方法時,執行的肯定是重寫以後的方法

1.子類在重寫時,方法的許可權必須大於等於父類中方法的許可權
2.private修飾的方法不能被重寫
3.父類中的方法是靜態的,子類重寫時也必須是靜態的


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

-Advertisement-
Play Games
更多相關文章
  • 官網:www.fhadmin.org 特別註意: Springboot 工作流 前後分離 + 跨域 版本 (許可權控制到菜單和按鈕) 後臺框架:springboot2.1.2+ activiti6.0.0+ mybaits+maven+介面 前端頁面:html +vue.js 形式 jquery aj ...
  • ​ 這篇文章我們來學習如何使用 Spring Boot 集成 Apache Shiro 。安全應該是互聯網公司的一道生命線,幾乎任何的公司都會涉及到這方面的需求。在 Java 領域一般有 Spring Security、 Apache Shiro 等安全框架,但是由於 Spring Security ...
  • RocketMQ中通過DefaultMQProducer創建Producer DefaultMQProducer定義如下: 其中defaultMQProducerImpl成員是Producer的具體實現,其餘的一些成員是對一些參數的設置:createTopicKey:是一個Topic值,在創建時使用 ...
  • 組件聲明 在類上聲明 @Component、@Configuration、@RestController、@Service、@Repository 等註解,表示這個類需要被註入IoC容器。 1、@Configuration 和 @Bean @Configuration 常用來和 @Bean 配合使用 ...
  • 引言 StringBuffer類的delete()方法和deleteCharAt()方法都是用來刪除StringBuffer字元串中的字元 區別 1.對於delete(int start,int end)這個方法一共有兩個參數是int類型的,代表從索引下標start刪除字元到索引下標end字元,但是 ...
  • INTRODUCTION: 圖論演算法在電腦科學中扮演著很重要的角色,它提供了對很多問題都有效的一種簡單而系統的建模方式。很多問題都可以轉化為圖論問題,然後用圖論的基本演算法加以解決。--百度百科 對於OI而言,圖是指由若幹給定的點及若幹條連接兩點的線(邊)所構成的圖形 藉助圖論知識,我們往往可以將一 ...
  • 前提 假設你瞭解過 SpringBoot 和 Kafka。 1、SpringBoot 如果對 SpringBoot 不瞭解的話,建議去看看 DD 大佬 和 純潔的微笑 的系列博客。 2、Kafka Kafka 的話可以看看我前兩天寫的博客 : Kafka 安裝及快速入門 學習的話自己開台虛擬機自己手 ...
  • SMTPDebug = 1; //設置郵件使用SMTP $mail->isSMTP(); // 設置郵件程式以使用SMTP $mail->Host = 'smtp.qq.com'; $mail->isSMTP(); /... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...