内部类

Java内部类详解

六月ゝ 毕业季﹏ 提交于 2020-03-25 09:16:54
在一个类的里面再定义的类,叫做内部类,也可以叫做寄生类,在平时的编程中很少用到内部类,而且显的特别乱。 但是内部类也是有很大作用的: 提供了更好的封装,把类隐藏在外部类中,这样其他的类不能调到。 内部类可以使用外部类的所有数据,包括private修饰的。 在jdk中哟哟很多地方都用到了内部类,在集合的源码中,比如在ArrayList中为了实现Iterator接口,就利用了内部类实现了Iterator接口。 包含内部类的类叫做顶层类,顶层类只能用public和默认修饰,内部类可以用四种权限修饰符的任意一个。我们要访问内部类的时候,要通过外部类访问内部类,不能直接访问内部类。 package demo_Inner; public class Test { public static void main(String[] args) { Outer outer = new Outer(); outer.print();//外部类 Outer.Inner inner = new Outer().new Inner(); inner.print();//内部类 } } class Outer{ public class Inner{ public void print() { System.out.println("内部类"); } } public void print() {

关于Scala的路徑依赖类型(Path-dependent type)

巧了我就是萌 提交于 2020-03-20 21:21:53
3 月,跳不动了?>>> 咋看这个术语,有点吓倒。其实不是什么新东西,也是讲关于内部类和外部类的事,不过两者有点区别。在Scala中,内部类和外部类的一些行为特性和Java差不多。 请看如下的Scala代码: class Outer { private val x = 10 class Inner { private val y = x + 10 } } val outer = new Outer val inner = new outer.Inner // inner变量可以显式声明类型 val inner: outer.Inner = new outer.Inner 内部类Inner可以存取外部类成员(包括private成员),但外部类不能存取内部类的private成员. 内部类之所以能存取外部类的成员,是因为内部类隐含地持有外部类的实例。这点和Java是一样的,上述的代码可以用Java语言来表达: public class Op { public void test1(){ Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); System.out.println(inner); } public static void main(String[] args) { Op op = new Op();

Java中final与static的使用

一世执手 提交于 2020-03-02 06:52:16
Final关键字 根据使用环境不同,final的含义会有细微的区别,但通常是指无法改变的内容。final关键字可以修饰变量、方法和类。 Final变量 final数据是用来向编译器告知变量是恒定不变的。对使用基本类型数据的常量,在定义时必须对其赋值。一个既是static又是final的域只会占据一段不能改变的存储空间。当对象使用引用而不是基本类型时使用final修饰,final使引用恒定不变,但其引用的内容可变。 空白的final允许的,但在使用前必须初始化,一旦初始化,将不能再更改。一般应用于类中,在定义处或构造方法中初始化。方法的参数也可以被final修饰,final参数不能更改参数引用指定的对象,主要用来向匿名内部类传递数据。 接口中定义的域不能是空白final的,因为接口中的域都是static final,所以必须在定义时进行初始化。其他位置的static final也一样。 Final方法 final方法的使用原因有两个: 锁定方法,防止继承类修改和覆盖方法。 加强效率,将调用转换为内嵌,该条仅限于小方法使用。 类中所有私有方法都隐式的指定为final的,虽然可以给私有方法加final修饰,但不会有任何意义。 Final类 final类表示该类无法被继承。final类中的域可根据选择是否成为final域,但类中的方法都将隐式的指定为final的

经典Java面试题-内部类

偶尔善良 提交于 2020-03-02 04:30:14
[ 面试原题] 以下代码运行结果是什么? public class BwfOuterClass { private int x = 1; private int y = 2; private class BwfInnerClass{ private int x = 3; public void print(){ System.out.println("博为峰:x+y="+(x+y) ); } } public static void main(String[] args) { new BwfOuterClass().new BwfInnerClass().print(); } } [ 正确答案] 博为峰:x+y=5 [ 面试技术点] Java中内部类的使用。 [ 解读] 在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为 内部类 。广泛意义上的内部类一般来说包括这三种:成员内部类、局部内部类、匿名内部类,如下图所示: 本题考的是成员内部类。成员内部类是最普通的内部类,它的定义为位于另一个类的内部,类似于一个成员属性。可以使用修饰符private、default、protected、public。 本题中BwfInnerClass是BwfOuterClass的成员内部类,成员内部类可以无条件访问外部类的所有成员属性和成员方法

向大师学习怎样使用嵌套类

爷,独闯天下 提交于 2020-02-28 11:46:09
图1 嵌套类 如上图一所示是嵌套类的分类和一些使用策略,主要需要注意的就是,嵌套类主要是为外部类服务的,最好是仅仅在外部类中使用,如在其他类中需要使用另外一个类的嵌套类,那么该嵌套类就应该做为顶级类,而不是嵌套类。 如果需要使用嵌套类,那么优秀考虑静态成员类,可以参考 effictive java 2版 22节 优先考虑静态成员类 。因为每一个非静态成员类的实例会维护一个外部类的实例,所以有空间和时间的开销。如果确实需要外部类的实例引用,例如要直接访问外部类的飞静态成员变量等,那么就可以考虑非静态成员类。 如果只需要类的一个实例,并且有预置类型,例如很多继承Thread的类,或者实现Runnable的类就可以做成匿名类。如果没有预置类型就可以考虑局部类。 上面讲了一些原因和策略,下面来看一下具体的应用,我们以LinkedList的源码为例,LinkedList也是Josh Block写的,代码里面对于嵌套类使用应该是对嵌套类使用的最佳实践了。 package java.util; /** * * List 和 Deque双向链表的实现 * */ public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io

黑马程序员 内部类 Java

最后都变了- 提交于 2020-02-11 11:56:24
 ------- android培训 、 java培训 、期待与您交流! ---------- 内部类:将一个类定义在另一个类里面,对里面那个类就叫做内部类(内置类,嵌套类)。 访问特点:内部类可以直接访问外部类中的成员,包括私有成员。而外部类要访问内部类中的成员必须要建立内部类的对象。 class Outer{ private int x=3; class Inner{ void function(){ function1(); System.out.println("内部类"+x); } } void function1(){ System.out.println("外部类"+x); } } public class innerclass { public static void main (String [] args ){ Outer outer =new Outer(); //outer.function();// 禁止直接访问内部类 outer.function1();// 外部类只能访问自己的成员方法 Outer.Inner inner =new Outer().new Inner ();// 需要指定内部类到底是谁的内部类才能建立内部类的对象 inner.function(); } } 之所以可以直接访问外部类中的成员,都是因为内部类中持有了一个外部类的引用,格式

ViewHolder 为什么加上static修饰

老子叫甜甜 提交于 2019-12-15 17:38:32
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 静态内部类主要作用就是,内部类是否需要隔离“外部类的this对象(指针)”。内部类是有 this 指针的,可以“直接”访问外部类的 成员变量和成员函数(包括私有的成员)。而静态内部类,没有这个this指针,所以无法“直接”调用。 ViewHolder的构造和复用,与静不静态没关。核心是ListView(AdapterView),通过getView(int position, View convertView, ViewGroup parent) 的convertView会为开发者传入一个可以复用的对象。开发者需要利用该对象,减少应用内存的消耗。 而用static的真正目的其实是 从减少内存消耗的角度来看。ViewHolder还是应该修饰成static比较好。这样ViewHolder中可以减少Activity的this指针,由于减少了一个this指针的引用,也会对Activity的引用计数大大减少。Activity的this指针继承于android的Context上下文,对于Context的回收遗漏,是Android内存管理中很大的问题。我们减少了对Context的引用,可以更容易减少Context引用计数出现问题。 而这个解释来自于 《Effective Java》第22条 优先考虑静态成员类 其中有条建议:

内部类与外部类

放肆的年华 提交于 2019-12-15 05:32:41
内部类与外部类 在一个类体之内在定义一个类 该情况下外面的类称为“外部类”,里面类称为“内部类” 内部类 内部类可以很方便访问外部类的私有成员属性, 外部类可以通过内部类对象来访问内部类的私有成员属性。 内部类对象实例化语法格式: 外部类.内部类 对象名=new 外部类对象.new内部类构造方法; 分为静态内部类和非静态内部类 静态使用static关键字 无法访问外部类的实例变量。 非静态内部类又分为成员内部类和局部内部类 成员内部类 在外部类的内部定义一个类 在成员内部类中,可以访问外部类的所有成员 在外部类中,同样可以访问成员内部类的变量和方法 局部内部类 在方法中定义的内部类 不能用public或private访问修饰符进行声明 作用:作用域小,只能在当前方法中使用。 匿名内部类 1.不能有构造方法 2.不能定义静态成员,方法和类 3.一个匿名类一定跟在new后,创建其实现的接口或父类的对象 4.只能创建匿名内部类的一个实例 来源: CSDN 作者: 孙悦晟 链接: https://blog.csdn.net/weixin_45805177/article/details/103464752

知识点4

爱⌒轻易说出口 提交于 2019-12-10 01:11:05
知识点4 1.public 类可以在任意的地方被访问。 2.default类只可被同一个包内部的类访问。 3.多态性:方法的重载overload和重写overwrite。 可以直接应用在抽象类和接口上。 注:继承 、方法重写,父类对象指向子类。 4.父类数据类型不能强制转换子类。 5.兄弟类之间数据类型不能转换。 6.final 类关键字表示"不可改变的,最终的"的意思,用于修饰变量,内部类:在一个类之内在定义一个类,该情况外面的类称为“外部类”,里面的类称为“内部类”。 7.局部内部类:在方法中定义内部类称为局部内部类。 匿名内部类:适合只需要用一次的类,不能重复的使用。注:不能有构造方法,不能定义任何静态成员、方法和类,只能创建实现接口或父类的对象。 8.一个实例,一个匿名内部类一定跟在new后面,创建实现接口或父类的对象。 9.构造方法私有,用一个私有的静态变量引用实例;提供一个公有的静态方法获取实例。 注:抽象类的抽象方法必须使用“abtract”关键字修饰。 10.Java只支持单一继承。 11.访问符可以是public或缺省,如果缺省访问符,则默认采用。 12.实现接口:[访问符]class类名imploments接口1[接口2…]{ } 13.内部类:分为静态内部类和非静态内部类,其中静态内部类中有成员内部类是外部类成员,外部类使用内部类成员需要创建类的对象。 注

new和反射产生java内部类的实例化详解

自作多情 提交于 2019-12-07 15:48:37
前两天看到一道口试题,是关于内部类的知识,觉得很有意思。 这道题是这样的: 根据注释填写(1),(2),(3)处的代码 public class Test{ ?????? public static void main(String[] args){ ????????????? // 初始化Bean1 ????????????? (1) ????????????? bean1.I++; ????????????? // 初始化Bean2 ????????????? (2) ????????????? bean2.J++; ????????????? //初始化Bean3 ????????????? (3) ????????????? bean3.k++; ?????? } ? ?????? class Bean1{ ????????????? public int I = 0; ?????? } ? ?????? static class Bean2{ ????????????? public int?J = 0; ?????? } } public class Bean{ ?????? public class Bean3{ ????????????? public int k = 0; ?????? } } ? 这实在就是实例化内部类对象的题。 从上面的题可以看出