JavaSE:11、内部类

学习 资源1

学习资源 2

1、成员内部类

java 复制代码
import com.test.*;

public class Main {
    public static  void main(String [] argv)
    {
       Person person=new Person();//Person构造函数
       Person.Woman woman=person.new Woman();//woman构造函数
        
    }
}
java 复制代码
package com.test;

public class Person {

     public Person(){
         System.out.println("Person构造函数");
     }
      public class Woman{
       public  Woman()
       {
           System.out.println("woman构造函数");
       }
    }
}
内部类能访问外部成员,外部类不能访问内部类成员
java 复制代码
package com.test;

public class Person {
     public int age;
     public Person(){
         System.out.println("Person构造函数");
         //name="aaa";ERROR   不能使用内部类的成员
     }
      public class Woman{
         public  String name;

       public  Woman()
       {
           System.out.println("woman构造函数");
           age=18;  //true  内部类能访问外部成员
       }
    }
}
同名的3种访问方式
java 复制代码
import com.test.*;

public class Main {
    public static  void main(String [] argv)
    {
       Person person=new Person();//Person构造函数
       Person.Woman woman=person.new Woman();//woman构造函数
      woman.test(20);
    //    方法参数age : 20
    //    内部类的age : 19
    //    外部类的age : 18
    }
}
java 复制代码
package com.test;

public class Person {
     public int age=18;

      public class Woman{
         public  int age=19;

         public void test(int age)
         {
             System.out.println("方法参数age : "+age);     //参数
             System.out.println("内部类的age : "+this.age);   //内部类成员
             System.out.println("外部类的age : "+Person.this.age); //外部成员
         }

    }
}

2、静态内部类

内部类为static,注意外部类不能为static
java 复制代码
import com.test.*;

public class Main {
    public static  void main(String [] argv)
    {
        Person.Woman.p();//我是静态内部类的静态方法
       Person.Woman woman=new Person.Woman();
      woman.test(20);
    //    方法参数age : 20
    //    内部类的age : 19
    //    外部类的age : 18
    }
}
java 复制代码
package com.test;

public class Person {
     public static int age=18;
     //静态内部类只能访问到外部静态内容
      public static class Woman{
         public  int age=19;
         public void test(int age)
         {
             System.out.println("方法参数age : "+age);     //参数
             System.out.println("内部类的age : "+this.age);   //内部类成员
             System.out.println("外部类的age : "+Person.age); //外部成员

         }
       public static  void p()
       {
           System.out.println("我是静态内部类的静态方法");
       }

    }
}

3、局部内部类

在方法中定义一个类
java 复制代码
package com.test;

public class Person {
     public int age;
     public void test()
     {
         class T
         {
             public void p(){
                 System.out.println("我是局部内部类");
         }
         }
      T t=new T();
         t.p();
     }
    //T t=new T();t.p();   只能在方法里面用,外部用不了
}
java 复制代码
import com.test.*;

public class Main {
    public static  void main(String [] argv)
    {
       Person person=new Person();
       person.test();
       //我是局部内部类
    }
}

4、匿名内部类

匿名内部类是唯一一种没有构造方法的类,它就像是直接通过 new 关键字创建出来的一个对象
一般我们可以在抽象类的对象实现中使用匿名内部类
java 复制代码
package com.test;

public abstract class Person {
     public int age;
    public void say(){}

}
java 复制代码
import com.test.*;

public class Main {
    public static  void main(String [] argv)
    {
       Person person=new Person(){
           @Override
           public void say() {
               System.out.println("匿名内部类");
           }
       };
        person.say();
    }
}
去掉Person的abstra关键字变为普通类依然可以使用匿名内部类
区别在于抽象类new时必须写匿名内部类,而普通类不强制。

5、lambda表达式

  • 标准格式为:([参数类型 参数名称,]...) ‐> { 代码语句,包括返回值 }
  • 和匿名内部类不同,Lambda仅支持接口,不支持抽象类
  • 接口内部必须有且仅有一个抽象方法(可以有多个方法,但是必须保证其他方法有默认实现,必须留一个抽象方法出来)
java 复制代码
import com.test.*;

public class Main {
    public static  void main(String [] argv)
    {
       Study study=()->System.out.println("我是study");
       //重写了接口里study抽象方法
       study.study();
    }
}
java 复制代码
package com.test;

public interface Study {
     void study();
     static void  a()
     {
     }
     default void b(){
     }
     public  static final int d=0;
}

6、方法引用

方法引用就是将一个已实现的方法,直接作为接口中抽象方法的实现
java 复制代码
import com.test.*;

public class Main {
    public static  void main(String [] argv)
    {
       Study study=Integer::sum;
       System.out.println(study.study(3,5));//8
    }
}
java 复制代码
package com.test;

public interface Study {
     int  study(int a,int b);

}
相关推荐
zhou185几秒前
MySQL保姆级安装教程(附资源包+5分钟极速配置+环境变量调试技巧)
java·python·mysql·php
双叶83632 分钟前
(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)
c语言·开发语言·数据结构·c++
小雅痞32 分钟前
[Java][Leetcode middle] 55. 跳跃游戏
java·leetcode
PXM的算法星球34 分钟前
使用CAS操作实现乐观锁的完整指南
开发语言
com未来38 分钟前
使用 NSSM 安装 Tomcat 11.0.6 为 Windows 服务
java·windows·tomcat
TDengine (老段)44 分钟前
基于 TSBS 标准数据集下 TimescaleDB、InfluxDB 与 TDengine 性能对比测试报告
java·大数据·开发语言·数据库·时序数据库·tdengine·iotdb
养军博客1 小时前
spring boot3.0自定义校验注解:文章状态校验示例
java·前端·spring boot
lgily-12251 小时前
常用的设计模式详解
java·后端·python·设计模式
IT成长史1 小时前
deepseek梳理java高级开发工程师微服务面试题
java·微服务
茶本无香1 小时前
Feign+Resilience4j实现微服务熔断机制:原理与实战
java·微服务·feignclient·熔断·resilience4j