java内部类总结

嵌套类分为静态嵌套类和内部类(即非静态嵌套类)
1:内部类和外部类同时被编译,内部类编译后的class文件名为外部类$内部类名.class

 

 

2: 内部类分为成员内部类,方法内部类,匿名内部类,静态嵌套类


public   class OutClass{
  private int a;
  class InnerClass{
     public void say(){
     System.out.println(a); 
   }
  }


 public static void main(String[] args){
      OutClass.InnerClass inner = new OutClass().new InnerClass();
      inner.say();
  }
}


以上这个就是成员内部类,在生成内部类的时候,其实内部类已经拥有外部类的一个引用了,所有内部类可以访问外部类的任何的变量和方法
内部类的this的引用,如果在成员内部类引用this的话就是指当前内部类实例如下:
如果内部类想引用外部类当前的对象呢:应该这杨写外部类名.this
public   class OutClass{
  private int a;
  public  class InnerClass{
     public void say(){
     System.out.println(a);
      System.out.println(OutClass.this);
  }
}
public static void main(String[] args){

      OutClass.InnerClass inner = new OutClass().new InnerClass();
      inner.say();
}
}

从以上这个内部类上来看可知,内部类的修饰符跟普通的类没有啥区别,可以用public ,private ,final,static 等,但是用static修饰的话,它内部不能都访问外部类的所有属性和方法了,因为
静态static没有this引用,它就仅仅能访问外部类的静态属性和方法了


内部类也可以被别的类进行访问,最好的一种方法就是在当前的外部类生成一个产生内部类引用的方法类似这杨:
public   class OutClass{
  public InnerClass  getInnerClass{
   return new InnerClass();
}
  private int a;
  class InnerClass{
     public void say(){
     System.out.println(a);
}
}
}
当然内部类也可以继承别的类或者是实现别的 了!

如果一个继承一个内部类那么必须提供一个外部类的对象作为构造方法的参数例如

class  OutClass{
   class InnerClass{
}
}

class  A extends InnerClass{
   public A(OutClass   outClass){
      outClass.super(); 
   }

}

方法内部类:

故名思意:方法内部类就是定义在方法内部的类类似如下

public   class OutClass{

   public void ask(){
     class  InnerClass{
          void good(){
         System.out.println("good");
          }
  }
  InnerClass inner = new InnerClass();
  inner.good();
}
}
}
方法内部类里面如果要方法外部类的方法内的局部参数的话局部参数必须是final类型的,因为
方法内的参数是存在的java栈当中的,也就是方法结束的时候他就消失了,而类是放在堆中的,这杨就不能
同时控制堆和栈中的变量同时消失,因此必须是final类行的!当然方法内部类只能在方法内部进行实例话不能在方法外面
进行实例化不然就报错了!

匿名内部类:


继承式的内部类:
class  A{
   public void say(){
     System.out.println("hello");
  }
}

public class B{
    public static void main(String[] args){
       A a = new A(){
         public void say(){
      System.out.println("hello----------");
}
};
      a.say();

}

}
这样得出的结果是hello------------------因为a已经继承A类的一个子类的引用了,这杨的话就调用子类的say方法,记住了这里必须是重写父类的方法,而不是造新的方法
不然没有意义的!详解请看多态的相关知识点


接口式的匿名内部类:

public interface A{
    void add();
  
}


public  class B{
   public static void main(String[] args){
      A a = new A(){
      public void add(){
        System.out.println("add");
}
};
a.add();
}
  

}
这个时候a就是实现A接口的类的一个引用了!

参数式的匿名内部类:
class  A{
   public void say(B b){
}
}

public C{
    public static void main(String[] args){
     A a = new A();
    a.say(new B(){
      public void add(){
   
}
});
     }
}


静态嵌套类:
public  class A{
   static class B{
}
}

这就是所谓的静态嵌套类,静态嵌套类里面的所有属性和方法都是静态的,因此外部类要访问内部类的静态方法和属性的话,必须是静态的,
因此静态嵌套类和少被使用!同时静态内部类访问外部类的属性和方法必须是静态的!

 

 

使用内部类的好处:
1:java是不支持多重继承的,因为可以每个内部类继承一个类,因为外部类是可以访问内部类的,因此这杨实现的效果多实现多继承是一样的!
2:内部类可以隐藏你不想让别人访问的方法和属性!




使用内部类的好处:
1:java是不支持多重继承的,因为可以每个内部类继承一个类,因为外部类是可以访问内部类的,因此这杨实现的效果多实现多继承是一样的!
2:内部类可以隐藏你不想让别人访问的方法和属性!

关于 阿里云盘CLI。仿 Linux shell 文件处理命令的阿里云盘命令行客户端,支持JavaScript插件,支持同步备份功能,支持相册批量下载。 特色 多平台支持, 支持 Windows, macOS, linux(x86/x64/arm), android, iOS 等 阿里云盘多用户支持 支持备份盘,资源库无缝切换 下载网盘内文件, 支持多个文件或目录下载, 支持断点续传和单文件并行下载。支持软链接(符号链接)文件。 上传本地文件, 支持多个文件或目录上传,支持排除指定文件夹/文件(正则表达式)功能。支持软链接(符号链接)文件。 同步备份功能支持备份本地文件到云盘,备份云盘文件到本地,双向同步备份保持本地文件和网盘文件同步。常用于嵌入式或者NAS等设备,支持docker镜像部署。 命令和文件路径输入支持Tab键自动补全,路径支持通配符匹配模式 支持JavaScript插件,你可以按照自己的需要定制上传/下载中关键步骤的行为,最大程度满足自己的个性化需求 支持共享相册的相关操作,支持批量下载相册所有普通照片、实况照片文件到本地 支持多用户联合下载功能,对下载速度有极致追求的用户可以尝试使用该选项。详情请查看文档多用户联合下载 如果大家有打算开通阿里云盘VIP会员,可以使用阿里云盘APP扫描下面的优惠推荐码进行开通。 注意:您需要开通【三方应用权益包】,这样使用本程序下载才能加速,否则下载无法提速。 Windows不第二步打开aliyunpan命令行程序,任何云盘命令都有类似如下日志输出 如何登出和下线客户端 阿里云盘单账户最多只允许同时登录 10 台设备 当出现这个提示:你账号已超出最大登录设备数量,请先下线一台设备,然后重启本应用,才可以继续使用 说明你的账号登录客户端已经超过数量,你需要先登出其他客户端才能继续使用,如下所示
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值