内部类及base调用子类方法

8 篇文章 0 订阅

1.静态内部类不能访问外部类的普通成员变量,只能访问外部类的静态成员和静态方法(包括私有类型),可以在静态内部类中定义静态或非静态的方法和属性 ,若是有静态代码块外部类的静态代码块会执行,但静态内部类的静态代码块不会执行,非静态内部类不能定义静态代码块

package niuke;

public class static1 {
    static {
        System.out.println("111");
    }
    static class static2 extends static1{
        static {
            System.out.println("222");
        }
}
    public static void main(String[] args) {

    }
}

执行结果是:111

2.静态内部类去掉static就变成了成员内部类:
成员内部类可以自由引用外部类的属性和方法,无论这些属性和方法是静态还是非静态的,非静态内部类不能有静态的成员,静态代码块也不能有(但有一个例外,必须是属性,不能是方法,在非静态内部类,声明静态变量时加上static final让他成为常量就可以,见文末尾)。
3.局部内部类,定义在代码块的内部,作用范围是代码块里面,他和局部变量一样,不能被public protected private 以及static修饰。


/* 外围类访问静态内部类:内部类. */
        System.out.println(InnerClass1._name1);
        /* 静态内部类 可以直接创建实例不需要依赖于外围类,也不能 */
        new InnerClass1().display();
        new OutClass.InnerClass1().display();   //这样也可以
       //下面3种方式都不行outclass_Instance是外部类的一个实例
        //new outclass_Instance.Class1().display();
        //outclass_Instance.new  Class1().display();
        //OutClass.new  Class1().display();

        /* 非静态内部的创建需要依赖于外围类 */
        OuterClass.InnerClass2 inner2 = new OuterClass().new InnerClass2();
        /* 访问非静态内部类的成员需要使用非静态内部类的实例 */
        System.out.println(inner2._name2);
        inner2.display();

Base 和 Sub的方法调用


public class Base {
     private String name="Base";

    public Base(){
        callname();
    }
    void callname(){
        System.out.println(name);
    }
      class Sub extends Base{
         private String name="Sub";
         @Override
        void callname() {
             System.out.println(name);
        }
}
    public static void main(String[] args) {
        Base base=new Base();
        //若 Sub是static
        //Base b=new Sub();  //可以
        //Base b1=new Base.Sub();//可以
        //Base b2=new base.Sub();//不可以
        //Base b= base.new Sub();//不可以
        //Base b= Base.new Sub();//不可以

        //若 Sub不是static 就要写成下面这样
          Base b= base.new Sub();

          b.callname();
        }
}
结果:
Base
null
Sub

第一个不用说,调用父类的callname(),
第二个在构造方法中调用callname()方法,由于子类中也存在此方法所以就调用子类的callname(),又因为这个时刻子类还没构造出来,所以变量name是null
第三个 ,子类已经构造出来所以是Sub

上面代码中将Sub类中的
private String name=”Sub”;
改为:
private static final String name=”Sub”;//因为是在非静态内部类中 所以要加static必须要加 final
这是的输出结果就变为
Base
Sub
Sub


The field t cannot be declared static in a non-static inner type, unless initialized with a constant expression
也就是说 在非静态内部了中不能定义非静态的属性 除非他被初始化为一个常量,而且不能是对象
比如:
private static final String name=”123”;//不报错
private static final String name=new String (“123”);//报错
我的理解是:
非静态内部类的创建依赖外部实例,所以不能被声明为单纯的static,但放在常量池中的变量比如int long String(不用new创建的)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值