java內部類this
『壹』 java中類名.this和這個類的對象有區別嗎
一般用於內部類需要使用其外部類的實例對象時候使用 ClassName.this 代表其外部類對象。
直接寫this則代表內部類本身對象 。
這種用法也用於匿名類
『貳』 Java:關於Java中的this,這里為什麼加不加都一樣呢
this指直譯是「這個」,在java中指「當前的」。不管在哪裡,只要用到this,指的一定就是當前的這個對象。最常見的用法是在寫java bean中。比如下面的代碼
publicclassStudent{
privateStringname;
privateintage;
publicStudent(){}
publicStudent(Stringname,intage){
this();
this.setName(name);
this.age=age;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnthis.age;
}
}
上面的代碼是一個javabean。所謂的javabean就是一個類,這個類有一些屬性,方法只有這些屬性的Getter或者Setter(從Object類繼承的方法不算在此列)。
這個bean有兩個屬性,在構造器中為屬性賦值的時候寫的this.setName(name).意思是調用當前你創建的這個對象的Setter給這個對象的屬性賦值。而setName裡面的this.name=name;這一句,等號之前的this.name表示當前對象的name,也就是在類裡面定義的privateStringname這個變數,而等號之後的name表示從外界調用這個方法時候傳進來的參數。所以這句話的意思就是將外界傳來的字元串變數的值賦給當前對象的name屬性。
那麼構造器第一行的this()是做什麼的呢?這句話是調用當前這個對象的無參構造,就是調用上面的publicStudent(){}這個構造器。在這段代碼里this()體現不出來什麼作用。但是我們知道構造器的作用是在構造對象的時候給屬性賦值的。如果上面個無參構造裡面寫一些賦值語句的話那麼這里就可以避免代碼的重復了。但是請注意,調用this()的時候一定要寫在該方法的第一行,否則會報錯。
另外,this關鍵字不能使用在有static關鍵字修飾的方法和代碼塊裡面。因為static是這個類的所有對象共用的,而this指的只是當前這個對象的「私人」的一些東西,在屬性上面就沖突了。
『叄』 java中內部類的概念
簡單的說,內部(inner)類指那些類定義代碼被置於其它類定義中的類;而對於一般的、類定義代碼不嵌套在其它類定義中的類,稱為頂層(top-level)類。對於一個內部類,包含其定義代碼的類稱為它的外部(outer)類。 1 Static member class(靜態成員類) 類聲明中包含「static」關鍵字的內部類。如以下示例代碼, Inner1/Inner2/Inner3/Inner4就是Outer的四個靜態成員類。靜態成員類的使用方式與一般頂層類的使用方式基本相同。
1內部類的嵌套可以理解成類的鏈關系,在構造一個內部類(非static)的實例的時候,會將直接外層類的實例
作為參數傳進構造函數,而外層類的實例也是用其外層類的實例構造,所以是一種鏈狀關系,內部的類可以使用所有
外層的類的實例,而外層的類不能使用內層的類, 應用a.this(最外層類實例) ,a.b.c.this(鏈中某個外層的實例)。
class TheOuter{
class kk {
class gg {
int tt = 100;
}
}
class aa {
class bb {
int jj = 10;
class cc {
{ int ff = TheOuter.aa.bb.this.jj;
// 無法直接訪問到gg不在鏈關系內
System.out.println(ff);
}
}
}
}
}
2 創建一個內部類 new aa().new bb().new()cc 實際上是調用 外層類實例.new 本層構造函數()
如果內部類是static的不需要外層類的實例 多個static嵌套的內部類的實例 aa.bb.cc test = new aa.bb.cc();
3
class a0 {
class b0 {
}
}
class vvv{
class ff extends a0.b0 {// ff這里不是內部類也行
ff(a0 kk){
kk.super();
}
}
}
繼承自內部類要調用父類的外層類的super()
4
class dd {
void print(){
System.out.println("dd.println is there");
}
class kk {
kk(int i){}
class cc {
void pp() {
System.out.println("****");
}
void ddpp() {
dd.this.print();
}
}
}
}
class aa {
public static void main (String agrs[]) {
dd.kk.cc test = new dd().new kk(10).new cc();
test.ddpp();
}
}
在類內部可以是使用外層類,但是如果生成一個實例的句柄就沒有提供訪問上層類的功能。
5 this 是指本類的實例
6 預設的new
class cc {
{
new test();
}
class kk {
{
System.out.println("there kk");
}
}
class test {
{
new kk();
}
class kk {
{
System.out.println("there test_kk");
}
}
}
}
可以直接使用new,new的范圍可以是 之際外層.this.new 和this.new 但是如果內層與外層出現同名類以內部優先
7
//當有鏈關系的時候要注意類不要重名
class vv {
class bb {} //!
class kk {
//class vv{} 這樣就會出錯
class bb {} //!這樣就不會出錯
}
}
8
class a0 {
class b0 {
}
}
class vvv{
class ff extends a0.b0 {// 不是內部類也行
ff(a0 kk){
kk.super();
}
}
}
繼承自內部類要調用父類的外層類的super()
9 匿名內部類
interface oo {
//oo(int g) {}
int k = 10;
void pt();
}
class pp {
pp(int g) {
}
int get() {
return 100;
}
}
class me {
/*
interface oo {
void pt();
}
*/
class kk{
oo testmed() {
final int i = 10;
int g = 100;
return new oo() {
int kk;
{
// 使用外面的東西要聲名成final
// 繼承介面內部優先
// 匿名內部類沒有構造函數,只能使用塊,初始化
kk = i + k ;
}
public void pt() {
System.out.println(kk);
}
};
}
pp testmed0() {
return new pp(10){ // 繼承自類
public int get() {
return super.get() * 10;
}
};
}
}
}
匿名內部類可以繼承自介面也可以繼承自類,繼承自類的構造函數中 可以有參數。
10
class bf {
interface kk {}
class aa {
// 介面能嵌套在介面中(不受限制),或者嵌套在頂層,下面就不行
//interface gg {}
}
}
『肆』 在java中類名.this得到的是什麼
你這個問題應該是問在3g平台下面把,那麼得到的是上下文對象-context。在j2se得到是當前類的一個對象
『伍』 Java中的this關鍵字請舉個具體的例子來說明用它的好處
this
關鍵字表示的是當前類
比如
this.name
是指當前類的name屬性,有些時候可以用於區分同名屬性,如你在類里有個屬性為name,有個方法里也有個屬性叫name,你在該方法里使用this.name是指類屬性,直接使用name則是指方法的name屬性,這樣不會混淆;
可以用this.method()調用本類的method()方法;
可以調用父類的方法和屬性,比如你繼承了某個類,在該類中你不能直接看到父類的方法和屬性,你需要打開父類去查看他的方法和屬性,這樣比較麻煩,你可以直接用this.的方式查看到父類的方法和屬性;
使用this關鍵字調用類方法和屬性通常比較方便,比如你的類比較長,有時,你想調用某個方法或屬性,你又忘了它的名稱,直接使用this.的方式直接就能找到;
還有一點要注意,比如你有個類包含一個內部類,你在內部類使用this,則是指調用內部類的方法和屬性,此時this不能調用到外部類的方法及屬性。