内部类是这样的public class A { int i; A() { } public void gg() { } class B { } } 类B就是内部类Do you Understand?
初步认识: 对于外部类的外边来说: 内部类是被编译成 外部类$内部类.class 的一个内。对于外部内自身来说: 内部类和一个普通的公用类没有太多的差别。内部类是嵌套在外部类中的类,即类中的类。如果需要的话,一个内部类还可以在它的内部有他自己的另一个内部类。无需创建外部类的对象,即可从内部类访问外部类的变量和方法。静态内部类的访问: Outside.SkinSide example=new Outside.SkinSide() 非静态内部类的访问: Outside outside=new Outside(); Outside.SkinSide skinSide=outside.new SkinSide;静态内部类可以访问外部类中的静态成员 非静态内部类可以访问外部类的所有成员,而不管他们的访问属性如何。非静态内部类可以访问在同一个外部类中所有静态内部类的静态成员。当然如果继续就很难一下子说清楚了。 只能说一些算一些吧: interface I{}class Out{ class Inner implements I{} I createI(){ return new Inner(); } }匿名内部类: class Out{}public class TestOI{ public static void main(String[] args){ Out o = new Out(){}; } }
继承内部类:class Out{ class Inner{} }class Test extends Out.Inner{ public Test(){ new Out().super(); } }public class TestOI{ public static void main(String[] args){ Out o = new Out(){}; } } 方法中的内部类:interface I{}public class TestOI{ public I createI(){ return new I(){}; } }
javafaq2004说的很详细 我有几点没看懂 1: I createI(){ return new Inner(); } 是个什么类型的方法,对象类型的吗?这个方法是返回一个对象的吗,如果是怎么不用构造函数呢? 2: public Test(){ new Out().super(); } 这个继承类的构造方法不是很明白,是调用父类构造方法吗,是我只知道直接调用父类构造方法直接super(); 3: 方法中的内部类return new I(){};完全不明白。 呵呵,我还菜的厉害,不要鄙视我哈,I enjoy losing my face! 谢谢你们,还麻烦你们一下,呵呵!
内部类按照存在的位置可以分为两种:1.在类中能够存取外部类的所有实例变量----无论这些实例变量有什么样的存取控制符。就像类中的方法能够存取方法所在类的所有变量一样。2.在方法中能够存取方法所在的类中的实例变量,也能存取该方法中的局部变量,但该局部变量必须是final的,也就是只能访问方法中的常量.看看amay's notes中的例子可以加深理解:public class InOut{ String s= new String("Between"); public void amethod(final int iArgs) { int iam; class Bicycle{ Bicycle() { System.out.println(s); //这两句话可以,也就是说可以访问s System.out.println(iArgs); //和final int 常量 //System.out.println(iOther); } } new Bicycle(); } public void another(){ int iOther; } public static void main(String[] args) { InOut inout= new InOut(); inout.amethod(22); } } 上面所说的都是普通内部类;若是是静态内部类,则不能存取外部类中非静态的变量。参考文献:amay's notes&新东方讲义
当然内部类也可以出现在接口中,这时,我们就可以给接口加上实作了。不过注意这时的内部类必须为静态。 public interface I{ public static class C{} }1: I createI(){ return new Inner(); } 是对象类型的方法,对象类型的吗?比构造函数更具有可控制性,可读性。 比如我们可以进行判断是返回new Inner()还是null。 2: public Test(){ new Out().super(); } 是调用父类构造方法吗。因为子类实例化必须先实例化超类,而这里超类的实例化必须先实例化超类的外部类,所以必须这样写。 3: 方法中的内部类return new I(){}; 这里主要是把匿名内部类和方法中的内部类以及抽象和具体结合起来使用。对于不同的方法,我们可以返回对接口I的不同实现。
{
int i;
A()
{
}
public void gg()
{
}
class B
{
}
} 类B就是内部类Do you Understand?
对于外部类的外边来说:
内部类是被编译成
外部类$内部类.class
的一个内。对于外部内自身来说:
内部类和一个普通的公用类没有太多的差别。内部类是嵌套在外部类中的类,即类中的类。如果需要的话,一个内部类还可以在它的内部有他自己的另一个内部类。无需创建外部类的对象,即可从内部类访问外部类的变量和方法。静态内部类的访问:
Outside.SkinSide example=new Outside.SkinSide()
非静态内部类的访问:
Outside outside=new Outside();
Outside.SkinSide skinSide=outside.new SkinSide;静态内部类可以访问外部类中的静态成员
非静态内部类可以访问外部类的所有成员,而不管他们的访问属性如何。非静态内部类可以访问在同一个外部类中所有静态内部类的静态成员。当然如果继续就很难一下子说清楚了。
只能说一些算一些吧:
interface I{}class Out{
class Inner implements I{}
I createI(){
return new Inner();
}
}匿名内部类:
class Out{}public class TestOI{ public static void main(String[] args){
Out o = new Out(){};
}
}
class Inner{}
}class Test extends Out.Inner{
public Test(){
new Out().super();
}
}public class TestOI{ public static void main(String[] args){
Out o = new Out(){};
}
}
方法中的内部类:interface I{}public class TestOI{ public I createI(){
return new I(){};
}
}
我有几点没看懂
1:
I createI(){
return new Inner();
}
是个什么类型的方法,对象类型的吗?这个方法是返回一个对象的吗,如果是怎么不用构造函数呢?
2:
public Test(){
new Out().super();
}
这个继承类的构造方法不是很明白,是调用父类构造方法吗,是我只知道直接调用父类构造方法直接super();
3:
方法中的内部类return new I(){};完全不明白。
呵呵,我还菜的厉害,不要鄙视我哈,I enjoy losing my face!
谢谢你们,还麻烦你们一下,呵呵!
String s= new String("Between");
public void amethod(final int iArgs) {
int iam;
class Bicycle{
Bicycle() {
System.out.println(s); //这两句话可以,也就是说可以访问s
System.out.println(iArgs); //和final int 常量
//System.out.println(iOther);
}
}
new Bicycle();
}
public void another(){
int iOther;
}
public static void main(String[] args) {
InOut inout= new InOut();
inout.amethod(22);
}
}
上面所说的都是普通内部类;若是是静态内部类,则不能存取外部类中非静态的变量。参考文献:amay's notes&新东方讲义
public interface I{
public static class C{}
}1:
I createI(){
return new Inner();
}
是对象类型的方法,对象类型的吗?比构造函数更具有可控制性,可读性。
比如我们可以进行判断是返回new Inner()还是null。
2:
public Test(){
new Out().super();
}
是调用父类构造方法吗。因为子类实例化必须先实例化超类,而这里超类的实例化必须先实例化超类的外部类,所以必须这样写。
3:
方法中的内部类return new I(){};
这里主要是把匿名内部类和方法中的内部类以及抽象和具体结合起来使用。对于不同的方法,我们可以返回对接口I的不同实现。