Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
一、内部类一词解析
在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性 定义方式一致。
一个内部类的例子:
public class Outer {
private int radius = 1;
public static int count = 2;
public Outer() {
}
class inner{
public void visitOuter() {
System.out.println("visit outer private member variable:" + radius);
System.out.println("visit outer static variable:" + count);
}
}
}复制代码
二、内部类的种类
内部类可以分为四种:成员内部类、局部内部类、匿名内部类和静态内部类。
几种内部类的共性:
A、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。
B、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,
无论是否是private的。
1、成员内部类
成员内部类:形式如下
class Outer {
class Inner{}
}
编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。
成员内部类内不允许有任何静态声明!下面代码不能通过编译。
class Inner{
static int a = 10;
}
能够访问成员内部类的唯一途径就是通过外部类的对象!
A、从外部类的非静态方法中实例化内部类对象。
示例1:
public class OuterClass {
//外部类的方法
public void test(){
System.out.println("this is test...");
InnerClass in=new InnerClass();
in.show();
}
//内部类
class InnerClass{
public void show()
{
System.out.println("This is innerClass show");
}
}
public static void main(String[] args) {
OuterClass out=new OuterClass();
out.test();
}
}
表面上,我们并没有创建外部类的对象就实例化了内部类对象,和上面的话矛盾。事实上,如果不创建外部类对象也就不可能调用
makeInner()方法,所以到头来还是要创建外部类对象的。你可能试图把makeInner()方法修饰为静态方法,
即static public void makeInner()。这样不创建外部类就可以实例化外部类了!
但是在一个静态方法里能访问非静态成员和方法吗?显然不能。它没有this引用。没能跳出那条规则!
但是如果在这个静态方法中实例化一个外部类对象,再用这个对象实例化外部类呢?完全可以!