Java中内部类、权限修饰符

 内部类:
         1)成员内部类---在外部类的成员位置定义的类   

class Outer{ //外部类
    private int num = 10 ;
    class Inner{//成员内部类//内部类的成员方法
        public void show(){
            System.out.println(num);
        }
    }

        2)局部内部类---在外部类的成员方法中定义的类

public void method(){
        //局部内部类
        class Inner{

成员内部类可以存在一些修饰符号:

         可以使用private修饰,可以保证数据的安全性;

成员内部类还可以加入static修饰的,

特点: 如果成员内部类都是静态的--成员内部类的这个方法是否静态,无关了,访问外部类成员---->只能是静态的。
非静态的成员内部类中,是不能存在静态方法的

如何直接访问成员内部类的成员方法呢?

        将外部类的成员内部类---当做是外部类的成员

        直接访问的方式:前提条件:当前的成员内部类是非静态的!

        外部类名.内部类名 对象名 = new 外部类对象.new 内部类对象;

局部内部类特点:局部内部类也依然访问外部类的成员变量

 面试题:
      局部内部类访问局部变量的时候,能访问码?局部变量有什么要求?
        jdk7或者jdk7以前,局部变量必须显示加入final修饰,否则访问报错
         而jdk8已经jvm优化了,此时这个num2就是常量!---使用反编译工具查看内部类的结构--->发现其实已经加入了final,为什么?

         局部变量的生命周期是随着的方法的调用而存在,随着方法的调用结束而消失;而当前这个方法结束之后,num2局部变量也应该就不存在了,但是我们还在使用内部类对象访问它里面这个成员方法,而对象不会立即被GC立即回收,等待空闲的时候回收没有更多引用的对象,所以此时这些变量应该都是常驻内存,使用final定义----->常量!

class Outer4{
    private int num = 100 ;
    public void method(){
        //局部内部类
        class Inner4{
            public void show(){
                //局部变量
                int num2 = 20 ;
                System.out.println(num2) ;
                System.out.println(num) ;
            }
        }
        //在method方法中,访问show
        //创建局部内部类对象.show()
        Inner4  inner4 = new Inner4() ;
        inner4.show() ;
    }
}

//测试类
public class InnerClassDemo4 {
    public static void main(String[] args) {
        //创建外部类对象
        Outer4 outer4 = new Outer4() ;
        outer4.method() ;
    }
}

权限修饰符 

权限修饰在同一个包下的当前类中同一个包下的子类中/无关类中 在不同包下子类中  不同包下的无关类中
private    √
默认修饰符 √ √
 protected:受保护的 √ √ √
public  √ √ √ √

 其他的修饰符:
      static:结合自定义去使用
         定义自定义常量结合final
                  public static final 数据类型 变量名 = 初始化数据;
           static还可以在工具类中---->工具类中的构造方法私有化,里面的方法都加入static,类名访问
      abstract--->修饰类-->抽象类
               还可以在成员方法中定义:抽象类中 =--->public abstract 返回值类型 方法名(参数列表) ;
               abstract在接口中定义的抽象方法---abstract可以省略
      final结合static一块使用的:
      public static final 数据类型 变量名 = 初始化数据;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值