第十章:内部类

来源:互联网 发布: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");
}
};
}
}
注:在学习设计模式的时候,工厂模式如何用匿名内部类去写。
内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外层类是否已经继承了某个(接口的)实
现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角
度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 内眼线容易晕妆怎么办 手抖不会画眼线怎么办 画眼线眼睛总眨怎么办 画眼线总是晕妆怎么办 眼线笔没用完干了怎么办 新的眼线笔干了怎么办 不涂口红没气色怎么办 眼线笔容易晕妆怎么办 眼线笔老是晕妆怎么办 眼线液老是晕妆怎么办 旋转眼线笔断了怎么办 眼睛去皮以后眉眼距窄怎么办 速写型总是画不准怎么办 速写人物不会打形怎么办 鼻头又圆又大怎么办 耳鸣嘴溃疡眼流泪上火怎么办 孩子看电视总挤眼睛怎么办 小孩老是咳嗽有痰怎么办 长时间看手机眼睛模糊怎么办 长时间看电脑眼睛模糊怎么办 手机玩多了眼睛模糊怎么办 手机看多了眼睛模糊怎么办 孩子玩手机眼睛红怎么办 手机玩多了眼睛红怎么办 手机看久了眼花怎么办 玩手机眼睛近视了怎么办 近视了怎么办30个字 吃了长牙的土豆怎么办 鸡蛋和土豆吃了怎么办 狗狗眼睛流血水怎么办 石粉粘土干了怎么办 樱花针管笔干了怎么办 想学linux不会c语言怎么办 被摩托车排气管烫伤了怎么办 泡泡糖粘在衣服上怎么办 皮卡书屋办卡怎么办 照证件照齐刘海怎么办 哈挺机床卡刀了怎么办 绝地求生卡在登陆页面怎么办 白鞋子长霉了怎么办 幸福树树干烂了怎么办