内部类

什么是内部类

一个类可以放在另一个类的内部,称之为内部类,相对而言,包含它的类称之为外部类。
内部类可以实现对外部完全隐藏(声明为private),可以有更好的封装性
内部类只是JAVA编译器的概念,对于JAVA虚拟机而言,它是不知道内部类这回事的,每个内部类最后都会被编译为一个独立的类

都哪几种

  • 静态内部类
  • 成员内部类
  • 方法内部类
  • 匿名内部类
    成员和静态如果不被声明为private是可以被外部使用的。
    方法和匿名不可以

静态内部类

可以访问外部类的静态变量和方法。也可以被外部直接访问,具体看访问控制符

public class Outer {
   public static String a;

   public class Sta0 {
   }
   public static void Say() {
       System.out.println("insist");
   }

   public static class Inner {
       public static String b;

       public  void HAHA() {
           Say();
           a = "A";
       }
       public static void HEHE() {
           Say();
           a = "A";
       }
   }

   public static void main(String[] args) {
       Outer A = new Outer();
       Outer.Inner.b = "A";  //通过这种方式访问静态内部类的静态变量和静态方法
       Outer.Inner s=new Outer.Inner();//如果要访问静态内部类的普通方法需要先new一个静态内部类
       s.HAHA();
       Outer.Inner.HEHE();

   }
}

成员内部类

他除了静态方法和变量还可以直接访问外部的实例变量和方法。如果方法重名,则可以通过外部类.this.方法名来调用

只有静态内部类可以定义静态变量和静态方法。其他三种都不行

public class Outer {
  public String a;
  public int b;
  public void Say(){
      System.out.println("insist and experience pain");
  }
public class Inner{
        public void HAHA(){
            System.out.println("stay focus,be present"+b);
            Say();
        }
  }
public static void main(String[] args) {

      Inner b=new Outer().new Inner(); //定义成员内部类需要先定义一个外部类
		b.HAHA();
    }
}

方法内部类

​ 方法内部类只能在定义的方法内被使用。

​ 如果方法是实例方法,则除了静态变量和方法,也可以访问外部类的实例变量和方法。

​ 如果方法是静态方法,则方法内部类只能访问外部类的静态变量和方法。

方法内部类还可以直接访问方法的参数和方法中的局部变量。不过,这些变量必须被声明为final。因为方法内部类引用外部变量的本质是:

将外部变量通过构造方法传参的形式传进了内部类中。所以方法内部类操作的并不是外部的变量,而是它自己的实例变量。所以操作这些值并不会改变外部的值。同时**方法内部类并不会随着方法的执行完毕而跟随着一起被销毁。**所以为了保证外部的引用变量不会丢失所以需要定义为final。

所以究其根源变量被声明为final是为了解决:局部变量的生命周期和方法内部类的对象的生命周期的冲突问题

匿名内部类

匿名内部类只能被使用一次,它没有名字和构造方法,并且不能接收参数

匿名内部类能做的,方法内部类都能做。但如果对象只会创建一次,且不需要构造哦方法来接受参数,则可以使用匿名内部类,这样代码书写上更为简洁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值