今天我们分析内部类和静态内部类的区别,首先我们写一个InnerClassTest类,其中有一个内部类InnerClass和静态内部类StaticInnerClass。...倒数5行,StaticInnerClass的innerMethod()报错,显示d() Q:什么是内部类?有什么作用?静态内部类和非静态内部类的区别? 总结 内部类就是定义在另外一个类里面的类。...它隐藏在外部类中,封装性更强,不允许除外部类外的其他类访问它;但它可直接访问外部类的成员。...静态内部类和非静态内部类的区别有: 静态内部类是指被声明为static的内部类,可不依赖外部类实例化;而非静态内部类需要通过生成外部类来间接生成。...静态内部类只能访问外部类的静态成员变量和静态方法,而非静态内部类由于持有对外部类的引用,可以访问外部类的所用成员 参考: 从一道面试题开始说起 枚举、动态代理的原理 java内部类有什么好处?
文章目录 一、报错信息 二、解决方案 一、报错信息 ---- 使用场景 : 需要 Hook 住 View 的 OnClickListener 点击方法 , 该监听器在 View 的内部类 ListenerInfo...(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main...:1816) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop...PID: 31301 SIG: 9 二、解决方案 ---- 在此记录下 , 这种低级错误以后少犯 , 内部类要使用 包名.外部类$内部类 的形式 , 进行表示 ; android.view.View$...ListenerInfo 是 ListenerInfo 的正确表示方式 , 外部类与内部类之间使用 $ 符号 ; 修改后 : // 反射获取 OnClickListener 成员 // ① 先根据全类名获取
在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。...从定义的位置上看: (1)定义在外部类的方法体内/代码块 局部内部类(有类名) 匿名内部类(没有类名) (2)定义在外部类的成员位置上 静态内部类(有static修饰符) 成员内部类(没有static修饰符...) 1.成员内部类 成员内部类是最普通的内部类,它的定义为位于另一个类的内部 成员内部类语法格式 /** * @author joshua317 */ public class Outer {//外部类...2.局部内部类 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。...(4)局部内部类访问外部类的成员属性或者方法时,直接访问; (5)外部类访问局部内部类的成员属性或者方法时,通过先创建对象,再访问,且必须要在作用域内。
会引用外部类实例 只能捕获外部作用域内的final变量 创建时只有单一方法的接口可以用Lambda转换 a.匿名内部类的名字 表面上是没有引用名的, 但其实是有用于定位的“名字”, ?...定义出来一个用于定位的“名字”, 这个“名字”可见上面代码的第二行, “com.bennyhuo.iiv.ch1.”即代码包名, “OuterClass$1”即外部内名$1, 1代表这个匿名内部类...**即使使用Java 10 的var关键字来定义, 只能继承一个父类或实现一个接口 >- 父类是非静态的类型,则需父类外部实例来初始化 >- 如果定义在非静态作用域内,会引用外部类实例 >-..., 所以OuterClass()的实例也会在这里(左上第四行)new出来; 而下方的Client$1就是上述所说的匿名内部类的类型了, Client$1的命名格式其实就是刚刚说的外部内名$匿名内部类序号...; 00 01 10 11 捕获 匿名内部类 所在方法内(外部作用域) 的 局部变量快照的情况 匿名内部类重写父类方法时,引用到的外部方法体内的局部final变量 通常,要求要被捕获的局部变量
而内部类分为成员内部类,局部内部类(Local Classes)和匿名内部类(Anonymous Classes)。...所以内部类的成员变量/方法名可以和外部类的相同。 内部类有什么作用?...外部类虽然不能直接访问内部类的成员, 但是可以通过内部类的实例访问内部类的私有成员。...: 指内部类定义在方法体内,只能在该方法或条件的作用域内才能使用,退出这写作用域就无法引用。...3)、匿名内部类: 为了免去给内部类命名,或者只想使用一次,就可以选择使用匿名内部类。
,并没有外部类的引用,也就无法调用外部类自己的方法,同时也就屏蔽了外部类的操作 但是如果在内部类中写上外部类的引用和get方法,就可以在这种定义方式的前提下获得外部类的引用了。...静态内部类被执行了! 静态内部类被执行了!...静态内部类的age为:30 静态内部类的age为:40 静态内部类的age为:40 image.png 发现: 定义的两个内部类的age是同一个age,任意一个改变了则全都改变...静态内部类和非静态内部类是有区别的: 内部类有外部类的this指针,但是静态内部类是没有外部类的this指针的,毕竟两者创建的时间也不用。...这就直接导致了静态内部类无法直接通过this指针访问外部类的变量。
内部类 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类 与之对应,包含内部类的类称为外部类 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类...;如果出现同名属性,优先访问内部类中定义的 4、可以使用外部类.this.成员的方式访问外部类中同名的成员信息 5、外部类访问内部类信息,需要通过内部类实例,无法直接访问 6、内部类编译后.class...外部类中可以通过“ 类名· 成员名" 的方式直接访问内部类中静态成员 定义在外部类方法中的内部类, 也称局部内部类。 方法内部类只在其定义所在的方法的内部可见, 即只在该方法内可以 使用。...方法内部类只在其定义所在的方法的内部可见, 即只在该方法内可以使用。 方法内部类不能使用访问控制符和static 修饰符, 但可以使用final和abstract 修饰。...public Object getHeart(){ //方法内部类 /** * 1、定义在方法内部,作用范围也在方法内 * 2
成员内部类 2. 静态成员内部类 3. 局部内部类 4....匿名内部类 内部类最吸引人的:每个内部类都能独自继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没影响。也就从侧面实现了除接口外的多重继承。...当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。 3....(); } // 成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。...是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
java内部类作用 为什么在Java中需要内部类?总结一下主要有以下四点: 1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。...当我们将内部类声明为private时,只有外部类可以访问内部类,很好地隐藏了内部类。 内部类可以继承(extends)或实现(implements)其他的类或接口,而不受外部类的影响。...四、 分类 ---- Java内部类可分为成员内部类、局部内部类、匿名内部类、静态内部类。...我们知道加载类时,会先初始化静态成员,如果成员内部类有静态成员,那么内部类就会在外部类之前生成,而内部类是为外部类服务的,内部类在外部类之前就生成可能会脱离掌控。...2) 局部内部类 局部内部类的使用和成员内部类的使用基本一致,只是局部内部类定义在外部类的方法中,就像局部变量一样,并不是外部类的成员。
只能让外部类直接访问,不允许同一个包中的其他类直接访问。 2. 内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。 但外部类不能访问内部类的内部属性。...内部类的使用场合: 由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性。所以,通常内部类在只为所在外部类提供服务的情况下优先使用。...类文件:外部类$内部类 .class) 1) 非静态内部类(外部类里使用非静态内部类和平时使用其他类没什么不同) 非静态内部类必须寄存在一个外部类对象里。...因此,如果有一个非静态内部类对象那么一定存在对应的外部类对象。 非静态内部类对象单独属于外部类的某个对象。 非静态内部类可以使用外部类的成员,但是外部类不能直接访问非静态内部类成员。...外部类属性:外部类名.this.变量名 内部类的访问: 外部类中定义内部类: new InnerClass() 外部类以外的地方使用非静态内部类: Outer.inner varname =
很多的源码中大量用到了内部类,对于这部分基础来做个回顾 分类 静态内部类 如:static class InnerClass{} 成员内部类 如:private class InstaceClass...{} 局部内部类:定义在方法或表达式内部 匿名内部类 (new Thread(){}).start() 无论什么类型的内部类,都会编译成一个独立的.class文件,外部类和内部类之间用$间隔,其中匿名内部类使用数字进行编号...匿名内部类和静态内部类是比较常用的方式,在jdk中,使用内部类封装某种属性和操作的方式比较常见,内部类中还可以嵌套内部类 例如:ThreadLocalMap中又定义了Entry类 好处 在JDK...源码中,在包内定义可见静态内部类的方式很常见,这样做的好处是: 作用域不会扩散到包外 可以通过" 外部类.内部类"的方式直接访问 内部类可以访问外部列中所有的静态属性和方法
1 package st; 2 //内部类 3 class RedCowForm 4 { 5 static String formName; 6 RedCow cow; 7...12 public void ShowCowMess() 13 { 14 cow.speak(); 15 } 16 class RedCow //内部类的声明
我们可以通过类名直接对静态的玩意儿直接进行引用,但这里的Node静态内部类却是私有的。...为了找到静态内部类和普通内部类的区别,我使用jad工具,自己重写一个类似的Node类,对其进行反编译后发现: 普通内部类版本: private class List$Node { List...,存在一个隐藏的外部类引用字段,在构造内部类时,用于指向外部类的引用。...每次生成一个非静态的内部类实例,都会有这样的操作。 恰巧Node类只是外部类的一个组件,他不需要引用外部类的任何字段,所以,把它声明成静态的能减小不必要的消耗。...所以,在定义一个内部类时,如果该内部类不需要引用外部类的非静态属性/方法,则应该将它声明为静态的。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。
若将内部类拿出,变为两个类,程序改动非常大,内部类的最大好处就是可以直接进行外部类的私有属性访问。...(3)目前可发现,实例化内部类的对象操作都是在外部类的fun()方法里面完成的,其他类是否可以直接操作内部类对象,在其他类中实例化内部类对象,语法如下: 外部类名称.内部类名称 对象名称 = new 外部类...利用static定义的 属性和方法是不受类的控制的,相当于一个局外结构,如果内部类使用了static定义,那么此内部类就相当于变成了外部类,只能访问外部类的static属性。...但是这时候的实例化格式为: 外部类名称.内部类名称 对象名称 = new 外部类.内部类(); Outer.Inner inner = new Outer.Inner();...3、方法中定义内部类 理论上内部类可以在任何位置中定义,包括:代码块、类中、方法中,实际开发中,有可能在方法中使用内部类。
内部类:在一个类的内部定义了另外的类,称为内部类。 匿名内部类指的是没有名字的内部类。 为了清楚内部类的主要作用,下面首先来观察如下的程序: ? ?
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变量 3 private int x=1; 4 //定义外部类函数 5...public void methodOut(){ 6 System.out.println("外部类"); 7 } 8 //定义内部类 9 class InterClass...{ 10 //定义内部类的变量 11 private int x=2; 12 //定义内部类的函数 13 public void methodInter...void main(String[] args) { 28 //创建外部类对象,并调用外部类方法 29 OutClass out=new OutClass(); 30...(); 33 //调用内部类方法 34 inter.methodInter(); 35 } 36 } 运行结果: 外部类 函数中的x=:3 内部类的x=:2 外部类的
修饰的属性的方法(使用static final 可以修饰属性,final修饰的常量在编译时已经确定); 实例化实例内部类: 外部类名.内部类名 变量名 = 外部类对象的引用.new 内部类名(); ...A.B b = new A().new B(); 当外部类与实例内部类某属性或方法相同时,在实例内部类中想使用外部类属性或方法: ...int a1; static class B{ } } 实例化静态内部类: 外部类名.内部类名 = new 外部类名.内部类名(); ...A.B b = new A.B(); 在静态内部类中,访问外部类非静态成员时,创建一个外部类对象,通过对象引用该成员; 访问外部类静态成员时...:局部内部类B只能在方法a中创建和使用。
一、内部类 1.1简介 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。 广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。...总结一下主要有以下四点: 1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。...3.方便编写事件驱动程序 4.方便编写线程代码 1.3种类 1.成员内部类 内部类像是外部类的一个成员,并且成员内部类可以访问外部类的所有成员变量和成员方法(包括private成员和静态成员) 当成员内部类拥有和外部类同名的成员变量或者方法时...局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。...静态内部类是不需要依赖于外部类的(可以直接new),这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。
内部类分为:静态内部类,成员内部类,方法内部类,匿名内部类 静态内部类 静态内部类是定义在另一个类里面用 static 修饰 class 的类,静态内部类不需要依赖于外部类(与类的静态成员属性类似)且无法使用其外部类的非...静态内部类和非静态内部类的区别 非静态内部类默认持有外部类的引用,静态内部类不存在该特性 非静态内部类中不能定义静态成员或者方法,静态内部类中可以随便定义 非静态内部类可以直接访问外部类的成员变量或者方法...,静态内部类只能直接访问外部类的静态成员或者方法(实质是持有外部类名) 非静态内部类可以定义在外部类的任何位置(方法里外均可,在方法外面定义的内部类的 class 访问类型可以是 public、protected...(局部内部类)是定义在一个方法里面的类,和成员内部类的区别在于方法内部类的访问仅限于方法内;方法内部类就像是方法里面的一个局部变量一样,所以其类 class 前面是不能有 public、protected...) 匿名内部类中是不能定义构造函数的,如需初始化可以通过构造代码块处理 匿名内部类中不能存在任何的静态成员变量和静态方法 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效 匿名内部类不能是抽象类
如果一个事物的内部包含另一个事物,那么这就是一个类的内部包含另一个类; 比如可以比作:"身体和心脏" "汽车和发动机"; 内部类又可以分为: 1、成员内部类 2、局部内部类(匿名内部类) 成员内部类:...成员内部类的定义格式: 修饰符 class 外部类名称{ 修饰符 class 内部类名称{ } } 注意:内用外可以随意使用,外用内,需要内部类的对象; 如下图: 如何使用成员内部类...,两种方式: 1、间接访问:在外部类的方法中,使用内部类,然后在main只调用外部类的方法; 2、直接访问:外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称(); Body.Heart...格式: 修饰符 class 外部类名称{ 修饰符 返回值类型 外部类成员方法名(参数列表){ class 局部内部类 (){ } } } 如下图: 可以用的权限修饰符...) / private 3、局部内部类:什么都不能写 匿名内部类: 如果接口的实现类(父类的子类)只需要使用一次, 那么这种情况下就可以省略该类的定义,用匿名内部类; 格式: 接口名称 对象名=new
领取专属 10元无门槛券
手把手带您无忧上云