目录
一、静态内部类与非静态内部类的定义
按照是否有static修饰分为静态内部类和非静态内部类,有static修饰的为静态内部类,没有static修饰的为非静态内部类。
二、静态内部类与非静态内部类
(1)非静态内部类
a、非静态内部类在非静态方法中
非静态内部类在非静态方法中可直接用内部类类名创建内部类对象,然后用内部类对象调用内部类中定义的方法:
package moon;
public class Body {
class Stomach { // 非静态内部类
void work() {
System.out.println("doing......");
}
}
public void getStomach(int a) { // 非静态方法
Stomach stomach = new Stomach();
stomach.work();
}
}
b、非静态内部类在静态方法中
非静态内部类在静态方法中需要先创建外部类对象,然后创建内部类对象,用内部类类名创建内部类对象,然后用内部类对象调用内部类中定义的方法:
package moon;
public class Body {
class Stomach { // 非静态内部类
void work() {
System.out.println("doing......");
}
}
static public void getStomach(int a) { // 静态方法
Stomach stomach = new Body().new Stomach();
stomach.work();
}
}
(2)静态内部类
a、静态内部类在非静态方法中的调用
静态类内部类在非静态方法中可以直接用类名创建新对象,但有一点比较特殊,如下代码所示:
public class Body {
static class Stomach { // 静态内部类
void work() {
System.out.println("doing......");
}
}
static public void getStomach(int a) { // 非静态方法
Stomach stomach = new Stomach(); //实际上,这行语句为"Stomach stomach = new Body.Stomach();"省略,因为Stomach是静态类,所以可以用外部类类名来创建内部类对象。
stomach.work();
}
}
b、静态内部类在静态方法中的调用
静态类内部类在非静态方法中也可以直接用类名创建新对象,原理与在非静态方法中相同
三、注意
1.静态内部类只能直接定义在外部类中
2、静态内部类仅能直接访问外部类的静态成员变量和方法,可以通过创建外部类的对象间接使用非静态的成员变量和方法。
public class OutClass {
private double weight=72;
public static void print(String name) {
System.out.println(name);
}
static class InClass{
{
double weight = new OutClass().weight;//由于weight是非静态的,所以在静态内部类中使用时必须先创建外部类对象
print("Tom");//由于print方法为静态方法,所以可以直接使用。
}
}
}
3、在非外部类中定义的内部类和局部变量一样,其使用范围从定义的位置开始到其所在直接语句块结束。
public class OutClass {
public static void main(String[] args) {
if(args!=null) {
class InClass{
}
}
InClass inClass = new InClass();//无法创建对象,因为内部类作用范围无法作用到这里
}
}
4、只有有名静态内部类中才允许有静态成员(静态属性、静态代码块和静态方法)。
以上,就是对Java中静态内内部类与非静态内部类的详述。