java内部类
内部类
类的内部再定义一个类
内部类用外部类随便访问,外部类用内部类要new对象
一个Java文件中只能有一个public修饰的类
-
成员内部类:
package oop.demo08; //如果出现重名现象,那么调用格式为 外部类名称.this.外部类成员变量名 public class Person { int a = 10;//外部类成员变量 public class V{ int a =20;//内部类成员变量 public void x(){ int a = 30;//内部类局部变量 System.out.println(a);//就近原则 System.out.println(this.a);//内部类成员变量 System.out.println(Person.this.a);//外部类成员变量 } } public void v(){//间接调用 V v = new V(); v.x(); } } class B{//内部类使用 public static void main(String[] args) { // 1.间接方式:在外部类的方法中,使用内部类,然后mian只是调用外部类的方法 Person person = new Person();//外部类对象 person.v();//间接使用 // 2.直接方式:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称(); Person.V b= new Person().new V(); b.x(); } } -
静态内部类:
内部类可以访问static,但是static的内部类不能访问非static属性
-
局部内部类:方法里面写类!
package oop.demo08; //局部内部类:如果希望访问所在方法的局部变量,那么这个局部变量必须是[有效final的] public class MyOuter { public void method(){ final int num = 10;//所在方法局部变量 //只要局部变量事实不变,那么关键字可以省略 class MyInner{ public void myInner(){ System.out.println(num); } } } } package oop.demo08; //如果一个类定义在一个方法内部,那么这就是一个局部内部类 //"局部":只有当前所属的方法才能调用它,离开这个方法就不能调用 public class Outer { public void meth(){ class Inner{//局部的什么修饰符都不能有 int num = 10; public void metdh(){ System.out.println(num); } } Inner inner = new Inner(); inner.metdh(); } } class DemoMain{//局部使用 public static void main(String[] args) { Outer outer = new Outer(); outer.meth(); } } -
匿名内部类:
package oop.demo08; /** * @author * 解析 * 1.new 代表创建对象 * 2.接口名称就是匿名内部类需要实现哪个接口 * 3.{}里面的才是匿名内部类的内容 * * 注意 * 1.在创建对象时,只能使用唯一一次.如果要多次使用,那么只能创建实现类 * 2.匿名对象在调用方法时,只能调用唯一一次,如果希望调用多次,那么必须给对象名 * 3.匿名内部类和匿名对象不是一回事 * */ public interface Student { public abstract void method();//抽象方法 } class MyInter implements Student{ @Override public void method() { System.out.println("重写"); } } class Demo{ // 如果接口的实现类(或者是的父类的子类)只需要使用唯一一次,那么这种情况下就可以省略改类的定义,改为使用匿名内部类 public static void main(String[] args) { MyInter i = new MyInter(); i.method(); Student i1 = new MyInter();//多态:左边也可以是接口 // 匿名内部类格式:接口名 对象名 = new 接口名称(){ // 里面覆盖重写接口所有方法}; // 匿名内部类:可以省略了中间的实现类 Student student = new Student() { @Override public void method() { System.out.println("重写"); } }; student.method(); // 这是使用了匿名内部类,而且省略了对象名,也就是匿名对象 new Student() { @Override public void method() { System.out.println("重写"); } }.method(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具