1. 程式人生 > 其它 >最新Java面試題整理!Class

最新Java面試題整理!Class

最新Java面試題整理!Class

類變數就是static變數;初始值指的是類變數型別的預設值而不是實際要賦的值

(3)解析:jvm將常量池內的符號引用轉換為直接引用

3、初始化

行類變數賦值和靜態程式碼塊

二、Class.forName()和classloader.loadclass區別


1、Classloder.loaderClass(String name)

其實該方法內部呼叫的是:Classloder. loadClass(name, false)

方法:Classloder. loadClass(String name, boolean resolve)

(1)引數name代表類的全限定類名

(2)引數resolve代表是否解析,resolve為true是解析該類

2、Class.forName(String name)

其實該方法內部呼叫的是:Class.forName(className, true, ClassLoader.getClassLoader(caller))

方法:Class.forName0(String name, boolean initialize, ClassLoader loader)

引數name代表全限定類名

引數initialize表示是否初始化該類,為true是初始化該類

引數loader 對應的類載入器

3、二者最大區別

Class.forName得到的class是已經初始化完成的;

Classloder.loaderClass得到的class是還沒有連結的;

三、怎麼使用


有些情況是隻需要知道這個類的存在而不需要初始化的情況使用Classloder.loaderClass,而有些時候又必須執行初始化就選擇Class.forName

例如:資料庫驅動載入就是使用Class.froName(“com.mysql.jdbc.Driver”),

下面我們來看看Driver的原始碼:


public class Driver extends NonRegisteringDriver implements java.sql.Driver {

 

     public Driver() throws SQLException {

 

     } <br>

     static {

         try {

             DriverManager.registerDriver( new Driver());

         } catch (SQLException var1) {

             throw new RuntimeException( "Can\'t register driver!" );

         }

     }

}

從Driver的原始碼中我們可以看出Driver這個類只有一個static塊,這樣我們需要初始化後才能得到DriverManager,所以我們選擇使用Class.forName()。

四、class.forName主要功能



Class.forName(xxx.xx.xx)返回的是一個類

Class.forName(xxx.xx.xx)的作用是要求JVM查詢並載入指定的類,

也就是說JVM會執行該類的靜態程式碼段

五、通過解答以下三個問題的來詳細講解下Class.forName()的用法。


1、什麼時候用Class.forName()?

先來個熱身,給你一個字串變數,它代表一個類的包名和類名,你怎麼例項化它?你第一想到的肯定是new,但是注意一點:


A a = (A)Class.forName(“pacage.A”).newInstance();

這和你 A a = new A(); 是一樣的效果。現在言歸正傳。

動態載入和建立Class 物件,比如想根據使用者輸入的字串來建立物件時需要用到:


String str = “使用者輸入的字串” ;

Class t = Class.forName(str);

t.newInstance();

在初始化一個類,生成一個例項的時候,newInstance()方法和new關鍵字除了一個是方法,一個是關鍵字外,最主要有什麼區別?它們的區別在於建立物件的方式不一樣,前者是使用類載入機制,後者是建立一個新類。那麼為什麼會有兩種建立物件方式?這主要考慮到軟體的可伸縮、可擴充套件和可重用等軟體設計思想。

Java中工廠模式經常使用newInstance()方法來建立物件,因此從為什麼要使用工廠模式上可以找到具體答案。 例如:


class c = Class.forName(“Example”);

factory = (ExampleInterface)c.newInstance();

其中ExampleInterface是Example的介面,可以寫成如下形式:


String className = “Example”;

class c = Class.forName(className);

factory = (ExampleInterface)c.newInstance();

進一步可以寫成如下形式:


String className = readfromXMlConfig;//從xml 配置檔案中獲得字串

class c = Class.forName(className);

factory = (ExampleInterface)c.newInstance();

上面程式碼已經不存在Example的類名稱,它的優點是,無論Example類怎麼變化,上述程式碼不變,甚至可以更換Example的兄弟類Example2 , Example3 , Example4……,只要他們繼承ExampleInterface就可以。

知其然不知其所以然,大廠常問面試技術如何複習?

1、熱門面試題及答案大全

面試前做足功夫,讓你面試成功率提升一截,這裡一份熱門350道一線網際網路常問面試題及答案助你拿offer

面試寶典+書籍+核心知識獲取:戳這裡免費下載!誠意滿滿!!!

2、多執行緒、高併發、快取入門到實戰專案pdf書籍

3、文中提到面試題答案整理

4、Java核心知識面試寶典

覆蓋了JVM 、JAVA集合、JAVA多執行緒併發、JAVA基礎、Spring原理、微服務、Netty與RPC、網路、日誌、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、設計模式、負載均衡、資料庫、一致性演算法 、JAVA演算法、資料結構、演算法、分散式快取、Hadoop、Spark、Storm的大量技術點且講解的非常深入