java靜態類和非靜態類的區別_Java中靜態內部類和非靜態內部類到底有什么區別?...

內部類(Inner Class)和靜態內部類(Static Nested Class)的區別:

定義在一個類內部的類叫內部類,包含內部類的類稱為外部類。內部類可以聲明public、protected、private等訪問限制,可以聲明 為abstract的供其他內部類或外部類繼承與擴展,或者聲明為static、final的,也可以實現特定的接口。外部類按常規的類訪問方式使用內部 類,唯一的差別是外部類可以訪問內部類的所有方法與屬性,包括私有方法與屬性。

(1)創建實例

OutClass.InnerClass obj = outClassInstance.new InnerClass(); //注意是外部類實例.new,內部類:

AAA.StaticInner in = new AAA.StaticInner();//

注意是外部類本身,靜態內部類

(2)內部類中的this

內 部類中的this與其他類一樣是指的本身。創建內部類對象時,它會與創造它的外圍對象有了某種聯系,于是能訪問外圍類的所有成員,不需任何特殊條件,可理 解為內部類鏈接到外部類。 用外部類創建內部類對象時,此內部類對象會秘密的捕獲一個指向外部類的引用,于是,可以通過這個引用來訪問外圍類的成員。

(3)外部類訪問內部類

內部類類似外部類的屬性,因此訪問內部類對象時總是需要一個創建好的外部類對象。內部類對象通過‘外部類名.this.xxx’的形式訪問外部類的屬性與方法。如:

System.out.println("Print in inner Outer.index=" + pouter.this.index);

System.out.println("Print in inner Inner.index=" + this.index);

(4)內部類向上轉型

內部類也可以和普通類一樣擁有向上轉型的特性。將內部類向上轉型為基類型,尤其是接口時,內部類就有了用武之地。如果內部類是private的,只可以被它的外部類問,從而完全隱藏實現的細節。

(5)方法內的類

方法內創建的類(注意方法中也能定義類),不能加訪問修飾符。另外,方法內部的類也不是在調用方法時才會創建的,它們一樣也被事先編譯了。

(6)靜態內部類

定義靜態內部類:在定義內部類的時候,可以在其前面加上一個權限修飾符static。此時這個內部類就變為了靜態內部類。

通常稱為嵌套類,當內部類是static時,意味著:

[1]要創建嵌套類的對象,并不需要其外圍類的對象;

[2]不能從嵌套類的對象中訪問非靜態的外圍類對象(不能夠從靜態內部類的對象中訪問外部類的非靜態成員);

嵌 套類與普通的內部類還有一個區別:普通內部類的字段與方法,只能放在類的外部層次上,所以普通的內部類不能有static數據和static字段, 也不能包含嵌套類。但是在嵌套類里可以包含所有這些東西。也就是說,在非靜態內部類中不可以聲明靜態成員,只有將某個內部類修飾為靜態類,然后才能夠在這 個類中定義靜態的成員變量與成員方法。

另外,在創建靜態內部類時不需要將靜態內部類的實例綁定在外部類的實例上。普通非靜態內部類的 對象是依附在外部類對象之中的,要在一個外部類中定義一個靜態的內部類,不需要利用關鍵字new來創建內部類的實例。靜態類和方法只屬于類本身,并不屬于 該類的對象,更不屬于其他外部類的對象。

(7)內部類標識符

每個類會產生一個.class文件,文件名即為類名。同樣,內部類也會產生這么一個.class文件,但是它的名稱卻不是內部類的類名,而是有著嚴格的限制:外圍類的名字,加上$,再加上內部類名字。

(8)為何要用內部類?

1. 內部類一般只為其外部類使用;

2. 內部類提供了某種進入外部類的窗戶;

3. 也是最吸引人的原因,每個內部類都能獨立地繼承一個接口,而無論外部類是否已經繼承了某個接口。因此,內部類使多重繼承的解決方案變得更加完整。

package com.test.xml;

public class OutClassTest {

static int a;

int b;

public static void test() {

System.out.println("outer class static function");

}

public static void main(String[] args) {

OutClassTest oc = new OutClassTest();

// new一個外部類

OutClassTest oc1 = new OutClassTest();

// 通過外部類的對象new一個非靜態的內部類

OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();

// 調用非靜態內部類的方法

System.out.println(no_static_inner.getKey());

// 調用靜態內部類的靜態變量

System.out.println(OutClassTest.InnerStaticClass.static_value);

// 不依賴于外部類實例,直接實例化內部靜態類

OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();

// 調用靜態內部類的非靜態方法

System.out.println(inner.getValue());

// 調用內部靜態類的靜態方法

System.out.println(OutClassTest.InnerStaticClass.getMessage());

}

private class InnerClass {

// 只有在靜態內部類中才能夠聲明或定義靜態成員

// private static String tt = "0";

private int flag = 0;

public InnerClass() {

// 三.非靜態內部類的非靜態成員可以訪問外部類的非靜態變量和靜態變量

System.out.println("InnerClass create a:" + a);

System.out.println("InnerClass create b:" + b);

System.out.println("InnerClass create flag:" + flag);

//

System.out.println("InnerClass call outer static function");

// 調用外部類的靜態方法

test();

}

public String getKey() {

return "no-static-inner";

}

}

private static class InnerStaticClass {

// 靜態內部類可以有靜態成員,而非靜態內部類則不能有靜態成員。

private static String static_value = "0";

private int flag = 0;

public InnerStaticClass() {

System.out.println("InnerClass create a:" + a);

// 靜態內部類不能夠訪問外部類的非靜態成員

// System.out.println("InnerClass create b:" + b);

System.out.println("InnerStaticClass flag is " + flag);

System.out.println("InnerStaticClass tt is " + static_value);

}

public int getValue() {

// 靜態內部類訪問外部類的靜態方法

test();

return 1;

}

public static String getMessage() {

return "static-inner";

}

}

public OutClassTest() {

// new一個非靜態的內部類

InnerClass ic = new InnerClass();

System.out.println("OuterClass create");

}

}

/**

* 總結:

* 1.靜態內部類可以有靜態成員(方法,屬性),而非靜態內部類則不能有靜態成員(方法,屬性)。

* 2.靜態內部類只能夠訪問外部類的靜態成員,而非靜態內部類則可以訪問外部類的所有成員(方法,屬性)。

* 3.實例化一個非靜態的內部類的方法:

* a.先生成一個外部類對象實例

* OutClassTest oc1 = new OutClassTest();

* b.通過外部類的對象實例生成內部類對象

* OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();

* 4.實例化一個靜態內部類的方法:

* a.不依賴于外部類的實例,直接實例化內部類對象

* OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();

* b.調用內部靜態類的方法或靜態變量,通過類名直接調用

* OutClassTest.InnerStaticClass.static_value

* OutClassTest.InnerStaticClass.getMessage()

*/

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

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

相關文章

java寫便簽_如何編寫一個便簽程序(用Java語言編寫)

如何編寫一個便簽程序(用Java語言編寫)熱度:336 發布時間:2011-02-18 11:44:16如何編寫一個便簽程序(用Java語言編寫)因為以前沒有好好學習Java,都搞忘了,請大家原諒,也請你們指導一下,怎么編寫這個程序&…

java 生成log4j_Java log4j配置每天生成一個日志文件 - 永恒ぃ☆心 的日志 - 網易博客...

一、配置屬性文件log4j.propertieslog4j.rootLoggerINFO,stdout,Rlog4j.appender.stdoutorg.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layoutorg.apache.log4j.PatternLayout# Pattern to output the callers file name and line number.log4j.appender.stdout.layo…

java 子進程輸出流_具有輸入/輸出流的Java進程

首先,我建議更換這條線路。Process process Runtime.getRuntime ().exec ("/bin/bash");帶著線條ProcessBuilder builder new ProcessBuilder("/bin/bash");builder.redirectErrorStream(true);Process process builder.start();ProcessBuil…

java中if 運算符_[Java]Java基本語法結構(運算符,流程控制語句,if語句)

1:運算符(掌握)(1)算術運算符A:,-,*,/,%,,--B:的用法a:加法b:正號c:字符串連接符C:/和%的區別數據做除法操作的時候,/取得是商,%取得是余數D:和--的用法a:他們的作用是自增或者自減b:使用**單獨使用放在操作數據的前面和后面效果一樣。a或者a效果一樣。*…

java 變量取值范圍_JAVA中的變量及取值范圍

字節是二進制數據的單位。一個字節通常8位長。但是,一些老型號計算機結構使用不同的長度。為了避免混亂,在大多數國際文獻中,使用詞代替byte。變量:變量的數據類型;變量名變量值數據類型基本型數值型(整數)布爾型浮點型…

java object強制類型轉換_scala?object?轉Class?Scala強制類型轉換

asInstanceOf[T]將對象類型強制轉換為T類型。還是由于泛型存在類型擦除的原因,1.asInstanceOf[String]在運行時會拋出ClassCastException異常,而List(1).asInstanceOf[List[String]]將不會。packageresti.webimportorg.springframework.beans.factory.annotation.Au…

java毛玻璃_模糊效果(毛玻璃效果)

模糊效果(毛玻璃效果)效果演示:1. 使用iOS自帶的 UIImageImageEffects 文件文件中有這么幾個方法:- (UIImage *)applyLightEffect;- (UIImage *)applyExtraLightEffect;- (UIImage *)applyDarkEffect;- (UIImage *)applyTintEffectWithColor:(UIColor *)…

java程序崩潰怎么重啟_android 異常崩潰后 重啟app(進程守護方式實現)

【實例簡介】【實例截圖】【核心代碼】package com.sunfusheng.daemon.sample;import android.content.ComponentName;import android.content.Intent;import android.os.Looper;import android.util.Log;import com.blankj.utilcode.util.AppUtils;import com.sunfusheng.daem…

mysql 存儲過程 循環結構 命名_mysql存儲過程----循環結構

循環結構一共分為三種:三種循環結構分別為while、repeat、loop。while循環語法while 表達式(如果表達式為true則執行業務邏輯,否則不執行,與repeat循環相反,repeat循環滿足表達式退出循環,不滿足一直執行) do業務邏輯e…

mysql 組合索引 or_Mysql_組合索引和單列索引

一、目標什么時候使用組合索引,什么時候使用單獨索引組合索引、單獨索引區別組合索引:最左前綴匹配原則二、前期數據準備1. 建表CREATE TABLE user (uidint(11) NOT NULLAUTO_INCREMENT,namevarchar(50) DEFAULT NULL,pwdvarchar(50) DEFAULT NULL,creat…

mysql與mangodb多租戶_MongoDB多租戶(Java):如何使用MongoClient在運行時切換具有不同數據庫憑據的MongoDB數據庫?...

我正面臨一個關于MongoDB多租戶的問題.我有兩個不同的mongoDB數據庫(db1和db2).這兩者都有不同的憑據.db1憑據:userName:admin密碼:passwddb2憑據:userName:admin1密碼:passwd1我需要在運行時從一個數據庫切…

python 庫 全局變量_python局部變量和全局變量global

當你在函數定義內聲明變量的時候,它們與函數外具有相同名稱的其他變量沒有任何關系,即變量名稱對于函數來說是 局部 的。這稱為變量的 作用域 。所有變量的作用域是它們被定義的塊,從它們的名稱被定義的那點開始。使用局部變量例7.3 使用局部…

java 自省_自知 自省 自立 自信 自尊 自治 自強 自制

自知 自省 自立 自信 自尊 自治 自強 自制能知人者有智力,能自知才是真正的智者;能戰勝別人者有力量,能戰勝自己才是真正的強者;能知足者就是富有,能勤奮頑強堅持才是真正的有志者;不失其立足之地的人可以長…

java中json重復數據結構_JAVA把各種數據結構轉換為JSON格式

Java代碼import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import net.sf…

字節字符區別Java_【JAVA基礎】字符數組與字節數組的區別

String.getBytes()和String.tocharArray(),字節數組和字符數組的區別String.getBytes()是將字符串轉化為一個字節數組。而String.toCharArray()是將一個字符串轉化為一個字符數組。【例如】byte bys[] “國慶60周年”.getBytes();char chs[]“國慶60周年”.toCharAr…

mysql日志管理_關于MySQL的日志管理(binlog)

關于MySQL的日志管理(binlog)一、查看binlog的啟用狀態最常用的mysql版本是5.7,默認不開啟binlog,可以在登錄mysql之后,利用以下命令查看當前的binlog啟用狀態:mysql show variables like "%log_bin%";圖中顯示“ON”&a…

java精確測量文本高度_基于文本精確計算UITableViewCell的高度

我正在開發一個ios應用程序,并使用autolayout我正在嘗試創建一個具有不同行高的表視圖 .原型單元的布局如下:我有一個主單元格(黑色)里面有一個UIView(紅色),里面有一個UILabel(藍色)我添加的Autolayout約束如圖所示:The UIView h…

php做一個微信退款,PHP實現微信退款功能

大家好,我是小編,最近在調微信退款接口,發現有許多坑,更大家分享一下① 要是在測試的時候,網頁提示 curl 58 說明 證書的路徑出現問題(這里要填物理路徑,也就是絕對路徑)②網頁提示curl 52 說明你的證書引入…

php顯示時間,php實現用已經過去多長時間的方式顯示時間

本文實例講述了php用已經過去多長時間的方式顯示時間的方法。分享給大家供大家參考。具體如下:這里以一種可讀性比較好的方式顯示已經過去多長時間,比如:距離現在10秒,距離現在1天等等。function time_is_older_than($t, $check_t…

java中日期計算時間差,java中依據,兩個日期,計算時間差

java中根據,兩個日期,計算時間差。分別獲取兩個時間的毫秒數Date.getTime(),相減,得到的值/1000為秒數,/60*1000為分鐘數,/60*60*1000為小時數。/*** 計算時間差** param begin* param end* return*/public…