普通内部类和静态内部类总结

  1. 普通内部类可以访问其外部类的各种类型成员,但是静态内部类只能访问静态成员
  2. 普通内部类里面不能定义各种静态的成员(包括静态变量、静态方法、静态代码块和静态内部类),而静态内部类中则可以;
    • 静态变量和静态方法会出现这个语法错误(static methods can only be declared in a static or top level type)意思就是static方法只能在静态或者顶级类型(顶级类型应该就是外部类中)中声明,当然static变量和static内部类也是一样的道理。原因在静态变量和静态方法都只需要通过类名就能访问,不必通过任何实例化对象;而普通内部类的初始化要利用外部类的实例化对象,这明显违背了static的设计初衷。
    • 静态代码块会出现这个语法错误(Cannot define static initializer in inner type Outer.Inner)意思是不能在内部类中定义静态的初始化程序。
      原因跟以上的差不多,static声明的成员只能为类所共有,而不能仅属于一个实例化对象,通俗点来说就是不管有多少层的引用,都只能是类来引用而不能是对象。
import java.util.Date;
import java.util.StringTokenizer;


import test.Outer.Inner1;
abstract class Person{
    public abstract void work();
    public void f(){

    }
}
class Outer{
    private int id;
    int x;
    //普通内部类
    class Inner{
        public void fun1(){
            fun3();
            System.out.println(x);
            System.out.println(y);
            System.out.println(id);
        }
        /*
        //编译错误:static methods can only be declared in a static or top level type
        public static void fun2(){

        }
        static class A{

        }
        //编译错误:Cannot define static initializer in inner type Outer.Inner
        static{

        }
        */
        final static int a = 2;

    }
    static int y;
    static void fun3(){

    }
    //静态内部类
    static class Inner1{
        static{         
        }
        public void fun1(){
//          System.out.println(x);
            System.out.println(y);
        }
        public static void fun2(){  
        }
    }
//  匿名内部类
    Person p = new Person() {

        @Override
        public void work() {
            System.out.println("");

        }
    };
    public void fun1(){
        Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub

            }
        });
    }
}
public class Test01 extends Date{
    public static void main(String[] args) {
        //普通内部类实例化
        Outer.Inner inner = new Outer().new Inner();
        //静态内部类实例化
        Outer.Inner1 inner1 = new Outer.Inner1();
        Inner1 inner11 = new Inner1();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值