第十章:内部类
来源:互联网 发布:java变量名命名规则 编辑:程序博客网 时间:2024/06/05 01:55
可以将一个类的定义放在另一个类的定义内部,这就是内部类。
1.创建内部类
package com.myboy.innerclass;public class TestA {class B{private String g;public B(String arg){this.g=arg;}public String getG(){return g;}}public static void main(String[] args) {TestA tA=new TestA();System.out.println(tA.ship("zhuluzhenshuai"));}private String ship(String g) {B b=new B(g);//内部类的对象引用return b.getG();}}
2.链接到外部类
当生成一个内部类对象的时候,此对象就与他创建外部类对象有关系。内部类可以访问外部类所有成员而不需要条件。内部类对象还有外部类对象所有的访问权限。(注:容器中的相关类中的迭代器)
package com.myboy.innerclass;//有点参照ArrayList的写法,迭代器设计模式interface Selector {boolean end();Object Current();// Obeject 真的没有优势了void next();}public class Sequence {private Object[] items;private int next = 0;public Sequence(int size) {items = new Object[size];}public void add(Object x) {if (next < items.length)items[next++] = x;}private class SequenceSelector implements Selector {private int i = 0;public boolean end() {return i == items.length;}public Object Current() {return items[i];}public void next() {if (i < items.length)i++;}}public Selector selector() {return new SequenceSelector();}public static void main(String[] args) {Sequence sequence = new Sequence(10);for (int i = 0; i < 10; i++)sequence.add(Integer.toString(i));Selector selector = sequence.selector();while (!selector.end()) {//内部对象引用,能调用所有的基类的成员System.out.println(selector.Current());//都能引用selector.next();}}}
内部类对象只能与外部类对象相关联的情况下才能被创建(内部类非static时),在创建内部类是,需要可以引用到外部类对象,如果编译器访问不到这个引用,就会报错。
3. 使用.this和new
当需要对生成的外部类对象的引用,可以使用外部类的名字后面紧跟圆点和this。这样产生的引用自动的具有正确的类型。
当要告知某些其他对象,去创建某某个内部类的对象,要实现这个,必须在new表示式中提供对其他外部类对象的引用(除非是静态内部类,让其自动初始化),这是需要使用.new语法
package com.myboy.innerclass;public class DotThis {public void f(){System.out.println("DotThis.f()");}public class Inner{public DotThis outer(){return DotThis.this;// .this的用法,直接引用到外部}}public Inner inner(){return new Inner();}public static void main(String[] args){DotThis dt=new DotThis();DotThis.Inner dti=dt.inner();DotThis.Inner dtii=dt.new Inner();//创建了内部类对象,同时也创建了内部类和外部类之间的引用dti.outer().f();//out: DotThis.f()}}
4. 内部类和向上转型(感觉错的,没意义)
当内部类向上转型为其基类,尤其是转型为一个接口的时候,内部类就有用武之地了。(从实现了某个接口的对象,得到了对此接口的引用,与向上转型为这个对象的基类,实际上效果是一样的。)
内部类中有访问权限,这个因为此内部类--某个接口的实现---能够完全不可见,并且不可用,只能通过基类的或接口的引用才能访问到。(内部类的实现完全被隐藏(解耦))
中
5. 方法和作用域之间的内部类
在方法域和其他域直接的创建的内部类,大众编程风格,根本不会这么写
6.匿名内部类(内部类的特殊写法)(后续学习设计模式的时候在追踪)
package com.myboy.innerclass;
abstract class Person{
abstract void eat();//此处的研究,内部类的作用。提供一个抽象方法
}
public class Test5 {
public static void main(String[] args) {
Person p=new Person(){
public void eat(){
System.out.println("zhulueat");
}
};
}
}
注:在学习设计模式的时候,工厂模式如何用匿名内部类去写。
内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外层类是否已经继承了某个(接口的)实
现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角
度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
阅读全文
0 0
- 第十章:内部类
- 第十章 内部类
- 第十章 内部类
- 第十章 内部类
- 第十章 内部类
- 第十章 内部类
- 第十章 内部类
- 第十章 内部类
- 第十章 内部类
- 第十章:内部类
- 第十章:内部类
- 第十章 多态 & 内部类
- 第十章 内部类 内部类和嵌套类
- 《Java 编程思想》--第十章:内部类
- JAVA编程思想-第十章 内部类
- 第十章 内部类(上)
- 第十章 内部类(下)
- 《Java编程思想》第十章 内部类
- 我的Kotlin学习之旅 ( 三 )
- Caused by: java.lang.IllegalArgumentException: Mapped Statements collection already contains value f
- linux 正确安装opencv解决无法读取视频的问题
- 关于AlterDialog的一点理解
- 第三章链表
- 第十章:内部类
- openmp并行的计时问题
- KMP算法(作业六)
- JQuery学习总结
- 各网游的外挂是如何做出来的?
- Chrome DevTools之Network
- HDU I Think I Need a Houseboat
- Simplex 单纯形算法的python实现
- 【java基础】08.GUI:Swing