requestfacade 這個是什么類?_Java 的大 Class 到底是什么?

1a5e8dd2d7c2dabef76fbd3ec4980690.png

作者在之前工作中,面試過很多求職者,發現有很多面試者對Java的 Class 搞不明白,理解的不到位,一知半解,一到用的時候,就不太會用。

想寫一篇關于Java Class 的文章,沒有那么多專業名詞,希望用通俗的語言能把Java的 Class 這個概念講明白,理解了Class后,Java的反射也就好理解多了。

Class很容易,保證看了就明白,我們先來熟悉一個最基礎的概念,什么是類?

什么是類?

這個想必所有的學過面向對象編程語言的同學應該都知道,下面給出正式一點的描述類就是具備某些共同特征的實體的集合

比如下面定義一個 Student 類

class Student{String name;int age;public void learn(){System.out.println("正在學習");}public int getAge(){return age;}public void hello(String message){System.out.println(message);}
}

所有的學生都有一姓名,都有年齡,都要去學習,這些都學生的共性

那么既然所有的學生都有一些公共的特性,那么我們Java(其它語言也一樣)語言中,所有的類是不是也都有公共的特性呢?

是不是不太明白?所有的類都有公共的特性? 是的?沒聽錯
我們再定義一個類Book,如下

class Book{private float price;private String author;
}

所有的書都有 價格,作者等公共的特性(這里為了簡單,例子盡可能代碼少點)

所以,不管是上面的Student,Book類,還是Java語言中的自帶類比如String

所有的類,都有下面的一些共性:

  • 所有的類,都有一個類名:比如上面的 Student, BookString類,再加上包名,假如包名是 com.test , 那么這些類的名字就是com.test.Student , com.test.Book, com.test.String
  • 所有的類,都有0個或者多個字段,比如上面的 name,age,price,author
  • 所有的類,都有0個或者多個方法,比如上面的learn()
  • 所有的類,都有修飾符,比如public,private,protected
  • 所有的類,都有0個或者多個靜態方法
  • 等等等

Class到底是什么?

通過上面的分析我們知道,所有的類都有一些公共特性,那么我們就定義一個類,來描述這些公共特性,我們暫且把這個類起個類名,叫 Info

其實我們這里的Info類,就是java中的Class,java中的Class其實就是個普通的類而已,和其它的類沒什么不一樣的。不信看看Class定義

b90745c0819c5cf129fb815acdacfa36.png

是不是就是一個普通的類,我們把繼承關系去掉,是不是就是下面這樣了

public class Class {....
}

可不就是個普通的類嘛,只不過類名也叫Class,和java中的關鍵字class,只是首字母大寫了而已,要我說當初就不應該起名叫Class,應該叫Type,就不會有那么多人誤解了,就不會有人把Classclass這兩個弄的暈頭轉向的傻傻分不清了。

總之一句話:Class就是一個普通的類,這個類描述的是所有的類的公共特性

Class類能干什么?

了解Class類能干什么之前,我們先來擴展一些其它的東西

既然上面我們知道了,所有的類都是有公共特性的,我們定義了一個叫Class的類來描述這些公共特性

那么是不是所有的類的方法,所有的類的字段,是不是也有公共的特性?
答案是的

是不是有點迷糊? 不要怕,很簡單,舉個例子就知道了。
還是上面的Student,Book類,

  • 所有的類的字段,都有名字。
    比如Book類中的price字段,它的名字是不是"price"
  • 所有的類的字段,都有類型。
    比如Book類中的price字段,它的類型是 float
  • 所有的類的字段,都有修飾符。
    比如Book類中的price字段,它的修飾符是 private

所以這些類的字段公共的特性,我們也可以定義一個類來描述,這個類就是Field
我們看一下JDK中關于Field的定義

1daadaca3e51ff833b15d524ca799d6c.png

是不是和Class類一樣,Field類也是一個普通的類

同理,類中所有的方法,是不是也有公共的特性?
答案:是的

  • 所有的類的方法,都有方法名
    比如Student類中的getAge()方法,它的方法名是 "getAge"
  • 所有的類的方法,都有返回值類型
    比如Student類中的getAge()方法,它的返回值是 int類型
  • 所有的類的方法,都有參數。(無參數也是算是特殊的參數吧)
    比如Student類中的hello(String message)方法,有一個參數,參數的類型是值是 String類型
  • 所有類的方法,都有修飾符號。
    比如Student類中的getAge()方法,它修飾符號是 public

所以這些類的方法的公共的特性,我們也可以定義一個類來描述,這個類就是Method
我們看下JDK中的定義

a10bade698a5f94693ae449c89fc4eba.png

同樣是一個普通的類

由上面可以,那么Class類就是通過FieldMethod來描述類中的字段和方法
我們來看一下JDK中Class類中,關于Field和Method的成員

585ef869bfe9ed70f7beb456abd07253.png

這些數組就是保存類中的字段或者方法的。

扯遠了,回到開頭,Class類能干什么?
既然通過上面我們知道了,Class類中保存的是所有類的公共特性,那么是不是我們通過Class知道某個類中有多少方法,有多少字段,每個字段叫什么名字,每個字段的類型是什么,每個方法的方法名是什么,某個方法有幾個參數,等等

答案是肯定的
那如何通過Class知道你說的這些信息呢?
當然是寫代碼啊,比如我們在程序運行的時候,點擊某個按鈕,打印出某個類的信息,是可以做到的

Class如何使用?

既然上面我們知道了Class能干什么了?下面我們簡單的了解一下,如何使用Class

如何使用Class?

Class就是一個普通的類啊,使用普通的類就是創建一個對象,才能使用啊
很簡單啊,我們創建一個Class的對象就行了啊,就可以調用對象的各種方法了啊
使用就是這么簡單

如何獲取一個Class的對象?

我們先看一下JDK中 Class類的構造函數

f6c3c302f82dcbbb37f94273be54cd71.png

就這一個構造函數,還是私有的,所以,我們不能直接new一個對象了

如何獲取一個Class的對象?
答案:有以下3種方法,直接上代碼

public static void main(String[] args){//第一種Class c1 = String.class;//第二種String s = "hello,world";Class c2 = s.getClass();//第三種,以上面的Book類為例,其實就是動態加載類,注意捕獲異常,因為類有可能不存在 try {Class c3 = Class.forName("com.test.Book");} catch (ClassNotFoundException e) {e.printStackTrace();}}

有了 Class的對象我們怎么用

我們直接通過一個demo來演示更加的直接,如下

package com.example.demo;public class Student {private String name;private int age;public static void main(String[] args){//一般我們把Class的對象叫字節碼Class c = Student.class;// 外部普通類System.out.println("Student類名是:" + c.getName());System.out.println("Student類的簡單類名是:" + c.getSimpleName());System.out.println("Student類有" + c.getDeclaredFields().length + "個字段");/*** ....* 我們可以通過 c (也就是Student這個類的對象,或者你也可以叫做Student類的字節碼)* 拿到Student類中所有的方法名,方法數,字段名,字段數量,甚至你還可以通過Method來調用方法* 只要查查API,熟悉了API,就能做到* 暫時我們只打印簡單*/}
}

總結一下:
綜上所述,我們知道了

  • Class就是一個普通的類,就是用來描述一個類的信息的(比如類有幾個字段,幾個方法,名字叫什么等等 )
  • 可以通過 3 種方法來獲取Class的對象,也就是某個類的字節碼
  • 有個某個類的字節碼以后,我們就知道知道這個類的許多信息了
  • Class一般是在運行時使用,你只要告訴我類名,我就可以知道這個類中有多少方法,有多少字段,怎么調用等等
  • Filed,Method(還有其它的,我們只說這2個),分別是描述類的字段和類的方法的

關于 Class 的知識就講到這里,主要是明白 Class 到底是個什么東西,剩下的就自己查一下API,寫個demo測試一下就行了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532381.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532381.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532381.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

初學機器學習:直觀解讀KL散度的數學概念

初學機器學習:直觀解讀KL散度的數學概念 轉自:初學機器學習:直觀解讀KL散度的數學概念 譯自:https://towardsdatascience.com/light-on-math-machine-learning-intuitive-guide-to-understanding-kl-divergence-2b382ca2b2a8 解讀…

php mysql讀取數據查詢_PHP MySQL 讀取數據

PHP MySQL 讀取數據從 MySQL 數據庫讀取數據SELECT 語句用于從數據表中讀取數據:SELECT column_name(s) FROM table_name我們可以使用 * 號來讀取所有數據表中的字段:SELECT * FROM table_name如需學習更多關于 SQL 的知識,請訪問我們的 SQL 教程。使用 …

MySQL應用安裝_mysql安裝和應用

1.下載mysql安裝包2.安裝mysql,自定義->修改路徑3.配置mysql,選擇自定義->server模式->500訪問量->勾選控制臺->設置gbk->設置密碼和允許root用戶遠程登錄等等。以管理員權限,在控制臺輸入:net start MySQL, 啟…

mysql 商品規格表_商品規格分析

產品表每次更新商品都會變動的,ID不能用,可是購物車還是用了,這就導致每次保存商品,哪怕什么都沒有改動,也會導致用戶的購物車失效。~~~其實可以考慮不是每次更新商品就除所有的SKU,畢竟有時什么都沒修改呢…

mysql維表的代理鍵字段_mysql多維數據倉庫指南--第三篇第12章(2)

賓夕法尼亞州地區客戶維在本節我將用賓夕法尼亞州地區客戶的子集維度來解釋第二種維度子集的類型。我也將向你說明如何測試該子集維度。相對的,一個向上鉆取的維包含了它基礎維的所有更高級別的數據。而一個特定子集維度則選擇了它基礎維的某個特定的數據集合。列表…

huggingface NLP工具包教程1:Transformers模型

huggingface NLP工具包教程1:Transformers模型 原文:TRANSFORMER MODELS 本課程會通過 Hugging Face 生態系統中的一些工具包,包括 Transformers, Datasets, Tokenizers, Accelerate 和 Hugging Face Hub。…

mysql日期比較timestamp_Mysql中的Datetime和Timestamp比較(轉載)

mysql中用于表示時間的三種類型date, datetime, timestamp (如果算上int的話,四種) 比較容易混淆,下面就比較一下這三種類型的異同相同點都可以用于表示時間都呈字符串顯示不同點1.顧名思義,date只表示YYYY-MM-DD形式的日期,datet…

隱馬爾可夫模型HMM推導

隱馬爾可夫模型HMM推導 機器學習-白板推導系列(十四)-隱馬爾可夫模型HMM(Hidden Markov Model) 課程筆記 背景介紹 介紹一下頻率派和貝葉斯派兩大流派發展出的建模方式。 頻率派 頻率派逐漸發展成了統計機器學習,該流派通常將任務建模為一…

ef mysql 的坑_C# EF 與 MySql 的那些坑

之前一直想用 mysql 和 ef 。然后多次嘗試也只能感嘆 還是 sqlsever 是親兒子。今天在單位又嘗試了一次,然后就成功了,記錄一下遇到的問題。首先是安裝包和驅動?。請保證 MySql.Data / MySql.Data.Entity.EF6 / mysql Connector/NET 版本對應…

使用randomaccessfile類將一個文本文件中的內容逆序輸出_Java 中比較常用的知識點:I/O 總結...

Java中I/O操作主要是指使用Java進行輸入,輸出操作. Java所有的I/O機制都是基于數據流進行輸入輸出,這些數據流表示了字符或者字節數據的流動序列。數據流是一串連續不斷的數據的集合,就象水管里的水流,在水管的一端一點一點地供水…

huggingface NLP工具包教程2:使用Transformers

huggingface NLP工具包教程2:使用Transformers 引言 Transformer 模型通常非常大,由于有數百萬到數百億個參數,訓練和部署這些模型是一項復雜的任務。此外,由于幾乎每天都有新模型發布,而且每個模型都有自己的實現&a…

huggingface NLP工具包教程3:微調預訓練模型

huggingface NLP工具包教程3:微調預訓練模型 引言 在上一章我們已經介紹了如何使用 tokenizer 以及如何使用預訓練的模型來進行預測。本章將介紹如何在自己的數據集上微調一個預訓練的模型。在本章,你將學到: 如何從 Hub 準備大型數據集如…

mysql精講_Mysql 索引精講

開門見山,直接上圖,下面的思維導圖即是現在要講的內容,可以先有個印象~常見索引類型(實現層面)索引種類(應用層面)聚簇索引與非聚簇索引覆蓋索引最佳索引使用策略1.常見索引類型(實現層面)首先不談Mysql怎么實現索引的,先馬后炮一…

pytorch lightning最簡上手

pytorch lightning最簡上手 pytorch lightning 是對原生 pytorch 的通用模型開發過程進行封裝的一個工具庫。本文不會介紹它的高級功能,而是通過幾個最簡單的例子來幫助讀者快速理解、上手基本的使用方式。在掌握基礎 API 和使用方式之后,讀者可自行到 …

RT-Smart 官方 ARM 32 平臺 musl gcc 工具鏈下載

前言 RT-Smart 的開發離不開 musl gcc 工具鏈,用于編譯 RT-Smart 內核與用戶態應用程序 RT-Smart musl gcc 工具鏈代碼當前未開源,但可以下載到 RT-Thread 官方編譯好的最新的 musl gcc 工具鏈 ARM 32位 平臺 比如 RT-Smart 最好用的 ARM32 位 qemu 平…

java list翻轉_JAVA實現兩種方法反轉單列表

/***authorluochengcheng* 定義一個單鏈表*/classNode {//變量private intrecord;//指向下一個對象privateNode nextNode;public Node(intrecord) {super();this.record record;}public intgetRecord() {returnrecord;}public void setRecord(intrecord) {this.record record;}…

OpenAI Whisper論文筆記

OpenAI Whisper論文筆記 OpenAI 收集了 68 萬小時的有標簽的語音數據,通過多任務、多語言的方式訓練了一個 seq2seq (語音到文本)的 Transformer 模型,自動語音識別(ASR)能力達到商用水準。本文為李沐老師…

mysql 工具 08s01_Mysql管理必備工具Maatkit詳解之十四(mk-kill)

mk-kill - 顧名思義,殺mysql線程。安裝方法查看這里。在一個OLTP的生產環境,一般不會讓sql執行過長的時間,特別是myisam這樣表鎖的引擎,如果出現長時間執行的sql一般是誤操作,要不就是出現問題了。出現這種情況&#x…

【經典簡讀】知識蒸餾(Knowledge Distillation) 經典之作

【經典簡讀】知識蒸餾(Knowledge Distillation) 經典之作 轉自:【經典簡讀】知識蒸餾(Knowledge Distillation) 經典之作 作者:潘小小 知識蒸餾是一種模型壓縮方法,是一種基于“教師-學生網絡思想”的訓練方法,由于其簡單&#xf…

深度學習三大謎團:集成、知識蒸餾和自蒸餾

深度學習三大謎團:集成、知識蒸餾和自蒸餾 轉自:https://mp.weixin.qq.com/s/DdgjJ-j6jHHleGtq8DlNSA 原文(英):https://www.microsoft.com/en-us/research/blog/three-mysteries-in-deep-learning-ensemble-knowledge…