❶ Java如何調用內部類的方法
參閱下段: 《內部類》
內部類是指在一個外部類的內部再定義一個類。內部類作為外部類的一個成員,並且依附於外部類而存在的。內部類可為靜態,可用protected和private修飾(而外部類只能使用public和預設的包訪問許可權)。內部類主要有以下幾類:成員內部類、局部內部類、靜態內部類、匿名內部類
為什麼需要內部類?
典型的情況是,內部類繼承自某個類或實現某個介面,內部類的代碼操作創建其的外圍類的對象。所以你可以認為內部類提供了某種進入其外圍類的窗口。使用內部類最吸引人的原因是:
每個內部類都能獨立地繼承自一個(介面的)實現,所以無論外圍類是否已經繼承了某個(介面的)實現,對於內部類都沒有影響。如果沒有內部類提供的可以繼承多個具體的或抽象的類的能力,一些設計與編程問題就很難解決。從這個角度看,內部類使得多重繼承的解決方案變得完整。介面解決了部分問題,而內部類有效地實現了「多重繼承」。
A:成員內部類
作為外部類的一個成員存在,與外部類的屬性、方法並列。
publicclass Outer {
privatestaticinti = 1;
privateintj = 10;
privateintk = 20;
publicstaticvoidouter_f1() {
}
publicvoidouter_f2() {
}
// 成員內部類中,不能定義靜態成員
// 成員內部類中,可以訪問外部類的所有成員
class Inner {
// static int inner_i = 100;//內部類中不允許定義靜態變數
intj = 100; // 內部類和外部類的實例變數可以共存
intinner_i = 1;
void inner_f1() {
System.out.println(i);
//在內部類中訪問內部類自己的變數直接用變數名
System.out.println(j);
//在內部類中訪問內部類自己的變數也可以用this.變數名
System.out.println(this.j);
//在內部類中訪問外部類中與內部類同名的實例變數用外部類名.this.變數名
System.out.println(Outer.this.j);
//如果內部類中沒有與外部類同名的變數,則可以直接用變數名訪問外部類變數
System.out.println(k);
outer_f1();
outer_f2();
}
}
//外部類的非靜態方法訪問成員內部類
publicvoidouter_f3() {
Inner inner = new Inner();
inner.inner_f1();
}
// 外部類的靜態方法訪問成員內部類,與在外部類外部訪問成員內部類一樣
publicstaticvoidouter_f4() {
//step1 建立外部類對象
Outer out = new Outer();
//step2 根據外部類對象建立內部類對象
Inner inner = out.new Inner();
//step3 訪問內部類的方法
inner.inner_f1();
}
publicstaticvoid main(String[] args) {
//outer_f4();//該語句的輸出結果和下面三條語句的輸出結果一樣
//如果要直接創建內部類的對象,不能想當然地認為只需加上外圍類Outer的名字,
//就可以按照通常的樣子生成內部類的對象,而是必須使用此外圍類的一個對象來
//創建其內部類的一個對象:
//Outer.Inner outin = out.new Inner()
//因此,除非你已經有了外圍類的一個對象,否則不可能生成內部類的對象。因為此
//內部類的對象會悄悄地鏈接到創建它的外圍類的對象。如果你用的是靜態的內部類,
//那就不需要對其外圍類對象的引用。
Outer out = new Outer();
Outer.Inner outin = out.new Inner();
outin.inner_f1();
}
}
注意:內部類是一個編譯時的概念,一旦編譯成功,就會成為完全不同的兩類。對於一個名為outer的外部類和其內部定義的名為inner的內部類。編譯完成後出現outer.class和outer$inner.class兩類。
B:局部內部類
在方法中定義的內部類稱為局部內部類。與局部變數類似,局部內部類不能有訪問說明符,因為它不是外圍類的一部分,但是它可以訪問當前代碼塊內的常量,和此外圍類所有的成員。
publicclass Outer {
privateints = 100;
privateintout_i = 1;
publicvoid f(finalint k) {
finalint s = 200;
int i = 1;
finalint j = 10;
//定義在方法內部
class Inner {
ints = 300;// 可以定義與外部類同名的變數
// static int m = 20;//不可以定義靜態變數
Inner(int k) {
inner_f(k);
}
intinner_i = 100;
voidinner_f(int k) {
//如果內部類沒有與外部類同名的變數,在內部類中可以直接訪問外部類的實例變數
System.out.println(out_i);
//可以訪問外部類的局部變數(即方法內的變數),但是變數必須是final的
System.out.println(j);
//System.out.println(i);
//如果內部類中有與外部類同名的變數,直接用變數名訪問的是內部類的變數
System.out.println(s);
//用this.變數名訪問的也是內部類變數
System.out.println(this.s);
//用外部類名.this.內部類變數名訪問的是外部類變數
System.out.println(Outer.this.s);
}
}
new Inner(k);
}
publicstaticvoid main(String[] args) {
// 訪問局部內部類必須先有外部類對象
Outer out = new Outer();
out.f(3);
}
}
C:靜態內部類(嵌套類):(注意:前兩種內部類與變數類似,所以可以對照參考變數)
如果你不需要內部類對象與其外圍類對象之間有聯系,那你可以將內部類聲明為static。這通常稱為嵌套類(nested class)。想要理解static應用於內部類時的含義,你就必須記住,普通的內部類對象隱含地保存了一個引用,指向創建它的外圍類對象。然而,當內部類是static的時,就不是這樣了。嵌套類意味著:
1. 要創建嵌套類的對象,並不需要其外圍類的對象。
2. 不能從嵌套類的對象中訪問非靜態的外圍類對象。
publicclass Outer {
privatestaticinti = 1;
privateintj = 10;
publicstaticvoidouter_f1() {
}
publicvoidouter_f2() {
}
// 靜態內部類可以用public,protected,private修飾
// 靜態內部類中可以定義靜態或者非靜態的成員
staticclass Inner {
staticintinner_i = 100;
intinner_j = 200;
staticvoidinner_f1() {
//靜態內部類只能訪問外部類的靜態成員(包括靜態變數和靜態方法)
System.out.println("Outer.i" + i);
outer_f1();
}
voidinner_f2() {
// 靜態內部類不能訪問外部類的非靜態成員(包括非靜態變數和非靜態方法)
// System.out.println("Outer.i"+j);
// outer_f2();
}
}
publicvoidouter_f3() {
// 外部類訪問內部類的靜態成員:內部類.靜態成員
System.out.println(Inner.inner_i);
Inner.inner_f1();
// 外部類訪問內部類的非靜態成員:實例化內部類即可
Inner inner = new Inner();
inner.inner_f2();
}
publicstaticvoid main(String[] args) {
newOuter().outer_f3();
}
}
生成一個靜態內部類不需要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象可以直接生成:Outer.Inner in = new Outer.Inner();而不需要通過生成外部類對象來生成。這樣實際上使靜態內部類成為了一個頂級類(正常情況下,你不能在介面內部放置任何代碼,但嵌套類可以作為介面的一部分,因為它是static 的。只是將嵌套類置於介面的命名空間內,這並不違反介面的規則)
❷ 如何調用內部類中的靜態方法
一般來說,外部類調用內部類的方法分為以下幾種情況:
1.使用static可以聲明一個內部類, 可以直接在外部調用
// 定義外部類
class Outer
{
// 定義外部類的私有屬性
private static String info = "hello world";
// 使用static定義內部類為外部類
static class Inner
{
// 定義內部類的方法
public void print()
{
// 直接訪問外部類的私有屬性
System.out.println(info);
}
};
// 定義外部類的方法
public void fun()
{
// 通過內部類的實例化對象調用方法
new Inner().print();
}
};
public class InnerClassDemo03
{
public static void main(String args[])
{
// 調用外部類的fun()方法
new Outer.Inner().print() ;
}
};
2.不使用statc聲明一個內部類 ,使外部調用
//定義外部類
class Outer
{
//定義外部類的私有屬性
private String info = "hello world";
//定義內部類
class Inner
{
//定義內部類的方法
public void print()
{
//直接訪問外部類的私有屬性
System.out.println(info);
}
};
//定義外部類的方法
public void fun()
{
//通過內部類的實例化對象調用方法
new Inner().print();
}
};
❸ 如何調用內部類
例如類A里有個類B,則調用時為
A a = new A();
A.B b = a.new B();
❹ java 主方法怎麼調用內部類的方法
一般來說,外部類調用內部類的方法分為以下幾種情況:
1.使用static可以聲明一個內部類, 可以直接在外部調用
// 定義外部類
class Outer
{
// 定義外部類的私有屬性
private static String info = "hello world";
// 使用static定義內部類為外部類
static class Inner
{
// 定義內部類的方法
public void print()
{
// 直接訪問外部類的私有屬性
System.out.println(info);
}
};
// 定義外部類的方法
public void fun()
{
// 通過內部類的實例化對象調用方法
new Inner().print();
}
};
public class InnerClassDemo03
{
public static void main(String args[])
{
// 調用外部類的fun()方法
new Outer.Inner().print() ;
}
};
2.不使用statc聲明一個內部類 ,使外部調用
//定義外部類
class Outer
{
//定義外部類的私有屬性
private String info = "hello world";
//定義內部類
class Inner
{
//定義內部類的方法
public void print()
{
//直接訪問外部類的私有屬性
System.out.println(info);
}
};
//定義外部類的方法
public void fun()
{
//通過內部類的實例化對象調用方法
new Inner().print();
}
};
public class InnerClassDemo04
{
public static void main(String args[])
{
//外部類實例化對象
Outer out = new Outer();
//實例化內部類對象
Outer.Inner in = out.new Inner();
//調用內部類的方法
in.print();
}
};
3.在方法中定義內部類 ,使外部調用
//定義外部類
class Outer
{
//定義外部類的私有屬性
private String info = "hello world";
//定義外部類的方法
public void fun(final int temp)
{
//在方法中定義的內部類
class Inner
{
//定義內部類的方法
public void print()
{
//直接訪問外部類的私有屬性
System.out.println("類中的屬性:" + info);
System.out.println("方法中的參數:" + temp);
}
};
//通過內部類的實例化對象調用方法
new Inner().print();
}
};
public class InnerClassDemo05
{
public static void main(String args[]){
//調用外部類的方法
new Outer().fun(30);
}
};
❺ java 內部類怎麼調用外部類的函數
你好!
方法1:定義內部類的一個對象,用該對象調用外部類的成員函數
方法2:直接用語句:this.外部類的成員函數名。
僅代表個人觀點,不喜勿噴,謝謝。
❻ java中,關於類中的方法的調用有哪些
Java中主類不可以用static修飾,也就是不能為靜態的。但是可以作為某個類的內部類用static修飾。如果B是A的靜態內部類,可以直接用A.B調用。因為static修飾的成員是屬於類的,不是對象,可以直接調用。
——————————————————
A,B兩個類,在B類里,需要先實例化A類,然後再用A的對象去調用其中的方法
A a=new A(); a.A的方法();
❼ java內部類中的調用規則
一般來說,外部類調用內部類的方法分為以下幾種情況:
1.使用static可以聲明一個內部類, 可以直接在外部調用
// 定義外部類
class Outer
{
// 定義外部類的私有屬性
private static String info = "hello world";
// 使用static定義內部類
static class Inner
{
// 定義內部類的方法
public void print()
{
// 直接訪問外部類的私有屬性
System.out.println(info);
}
}
// 定義外部類的方法
public void fun()
{
// 通過內部類的實例化對象調用方法
new Inner().print();
}
}
public class InnerClassDemo03
{
public static void main(String args[])
{
// 通過Outer.Inner創建內部類的實例,並調用它的print方法
new Outer.Inner().print() ;
}
}
2.不使用statc聲明一個內部類 ,使外部調用
//定義外部類
class Outer
{
//定義外部類的私有屬性
private String info = "hello world";
//定義內部類
class Inner
{
//定義內部類的方法
public void print()
{
//直接訪問外部類的私有屬性
System.out.println(info);
}
};
//定義外部類的方法
public void fun()
{
//通過內部類的實例化對象調用方法
new Inner().print();
}
};
public class InnerClassDemo04
{
public static void main(String args[])
{
//外部類實例化對象
Outer out = new Outer();
//實例化內部類對象
Outer.Inner in = out.new Inner();
//調用內部類的方法
in.print();
}
}
3.在方法中定義內部類 ,使外部調用
//定義外部類
class Outer
{
//定義外部類的私有屬性
private String info = "hello world";
//定義外部類的方法
public void fun(final int temp)
{
//在方法中定義的內部類
class Inner
{
//定義內部類的方法
public void print()
{
//直接訪問外部類的私有屬性
System.out.println("類中的屬性:" + info);
System.out.println("方法中的參數:" + temp);
}
}
//通過內部類的實例化對象調用方法
new Inner().print();
}
}
public class InnerClassDemo05
{
public static void main(String args[]){
//調用外部類的方法
new Outer().fun(30);
}
}
❽ 怎麼調用內部類的方法
內部類通常都會保存在同一個文件當中,所以你首先應該調用這個文件,然後用此調用的方式來調用一下使用的這個類。
❾ 內部類如何調用外部類的方法
1.使用static可以聲明一個內部類, 可以直接在外部調用
classOuter{//定義外部類
privatestaticStringinfo="helloworld";//定義外部類的私有屬性
staticclassInner{//使用static定義內部類為外部類
publicvoidprint(){//定義內部類的方法
System.out.println(info);//直接訪問外部類的私有屬性
}
};
publicvoidfun(){//定義外部類的方法
newInner().print();//通過內部類的實例化對象調用方法
}
};
publicclassInnerClassDemo03{
publicstaticvoidmain(Stringargs[]){
newOuter.Inner().print();//調用外部類的fun()方法
}
};
2.不使用statc聲明一個內部類 ,使外部調用
classOuter{//定義外部類
privateStringinfo="helloworld";//定義外部類的私有屬性
classInner{//定義內部類
publicvoidprint(){//定義內部類的方法
System.out.println(info);//直接訪問外部類的私有屬性
}
};
publicvoidfun(){//定義外部類的方法
newInner().print();//通過內部類的實例化對象調用方法
}
};
publicclassInnerClassDemo04{
publicstaticvoidmain(Stringargs[]){
Outerout=newOuter();//外部類實例化對象
Outer.Innerin=out.newInner();//實例化內部類對象
in.print();//調用內部類的方法
}
};
3.在方法中定義內部類 ,使外部調用
classOuter{//定義外部類
privateStringinfo="helloworld";//定義外部類的私有屬性
publicvoidfun(finalinttemp){//定義外部類的方法
classInner{//在方法中定義的內部類
publicvoidprint(){//定義內部類的方法
System.out.println("類中的屬性:"+info);//直接訪問外部類的私有屬性
System.out.println("方法中的參數:"+temp);
}
};
newInner().print();//通過內部類的實例化對象調用方法
}
};
publicclassInnerClassDemo05{
publicstaticvoidmain(Stringargs[]){
newOuter().fun(30);//調用外部類的方法
}
};