javase内部类

  1. 定义:把一个类放入另一个类
  2. 内部类分类
    • 非静态内部类
    • 静态内部类
  3. 内部类的作用
    • 提供了良好的封装性
    • 内部类可以直接访问外部类的私有属性
    • “匿名内部类”适合一次性使用场景
  4. 与外部类的区别
    • 修饰词增加,可以用描述方法的访问符号修饰内部类(private、protected、static)
    • 非静态内部类不允许拥有静态成员
  5. 非静态内部类
    •   注意:方法中也可以定义内部类
  6.  1 //外部类调用内部类的使用和外部类相似
     2 public class out {
     3     private int out_private_int = 1;
     4     private int out_private = 1024;
     5     public out(){ }
     6     public class in{
     7         private int in_private_int = 2;
     8         private String out_private_int = "壹"; //结果:①与外部类同名的变量
     9         public in(){
    10             System.out.println("这是非静态内部类in的无参构造器");
    11             //访问与外部类同名的变量
    12             System.out.println(out_private_int); //由内向外寻找调用,此处接过为①
    13             System.out.println(out_private);//结果:1024非静态内部类可以访问外部类成员,反过来(如果被调用属性非static)则不可
    14         }
    15     }
    16 
    17     public in test(){
    18         in a = new in();
    19         return a;
    20     }
    21 
    22     public static void main(String[] args){
    23         out o = new out();
    24         in a = o.test();
    25         //in a = new in();静态方法不能直接对非静态内部类进行引用  静态成员不能访问非静态成员,but可以通过外部类引用对其进行操作out.in in = new out().new in();
    26 }
    27 }

     静态内部类

    • 静态内部类可以包含非静态成员
    • 不能访问非静态成员

    • public
      class StaticInClass { int t = 1; static class inClass{ static int i = 1; public inClass(){ } public void tets(){ System.out.println("这是一个静态内部类的普通方法"); //静态内部类不能直接访问内部类的非静态属性 System.out.println(new StaticInClass().t); } } public static void main(String[] args){ //静态方法可以直接访问静态内部类 inClass c = new inClass(); c.tets(); } }


  7.  局部内部类:
    • 定义:内部类为与方法内部
    • 居于内部类只作用与方法内部,so,没有static修饰词
  8. 匿名内部类(java8)
    • 匿名内部类必须继承一个父类或者实现一个接口
    • 匿名内部类不能是抽象类
    • 不能创建构造方法
    • interface in{
          void test(String s);
      }
      public class AnInClass {
          public void syso(in i,String s){
              i.test(s);
          }
          public static void main(String[] args){
              String a = "hell world";
              new AnInClass().syso(new in() {
                  @Override
                  public void test(String s) {
                      System.out.println(s);
                  }
              },a);
          }
      }



posted @ 2019-08-10 16:11  zlisang  阅读(64)  评论(0)    收藏  举报