




免费预览已结束,剩余5页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
内部类l 在一个类中定义另外一个类,这个类就叫做内部类或内置类(inner class)。l 内部类可以让我们将逻辑上相关的一组类组织起来,并由外部类(outer class)来控制内部的可见性。l 当我们建立一个inner class时,其对象就拥有了与外部类对象之间的一种关系,这是通过一个特殊的this reference形成的,使得内部类对象可以随意的访问外部类中所有的成员。class Outerprivate int index=100; class Inner void print()System.out.println(index);void print()Inner inner=new Inner();inner.print();class Testpublic static void main(String args)Outer outer=new Outer();outer.print();运行结果为: 100内存分为堆内存和栈内存两个区,能过new产生的类对象都置于椎内存,对象的引用即new产生类对象赋给某个变量即或实例化的对象被置于栈内存。在Inner类对象中有Outer.this引用,因此可以访问外部类的所有成员。class Outerprivate int index=100;class Inner private int index=50;void print()int index=30;System.out.println(index);System.out.println(this.index);System.out.println(Outer.this.index);void print()Inner inner=new Inner();inner.print();class Testpublic static void main(String args)Outer outer=new Outer();outer.print();运行结果为: 30 50 100在main()方法中直接访问内部类class Outerprivate int index=100;class Inner private int index=50;void print()int index=30;System.out.println(index);System.out.println(this.index);System.out.println(Outer.this.index);void print()Inner inner=new Inner();inner.print();Inner getInner()return new Inner(); class Testpublic static void main(String args)Outer outer=new Outer();Outer.Inner inner=outer.getInner();inner.print();运行结果为: 30 50 100void print()int index=30;System.out.println(index);System.out.println(this.index);System.out.println(Outer.this.index);void print()Inner inner=new Inner();inner.print();Inner getInner()return new Inner(); public static void main(String args)Outer outer=new Outer();Inner inner=outer.getInner();inner.print();class Test与前面的结果一致。class Outerprivate int index=100;class Inner private int index=50;void print()int index=30;System.out.println(index);System.out.println(this.index);System.out.println(Outer.this.index);void print()Inner inner=new Inner();inner.print();Inner getInner()return new Inner(); public static void main(String args)Outer outer=new Outer();Inner inner=new Inner(); /这一行报错inner.print();class Test编译报错,内部类Inner在外部内Outer类中,可视为一个整体,即为Outer类的非静态的成员变量,而main()方法是静态的方法,非静态的变量不能出现在静态环境中。从另一个角度看,内部内对象不能直接用new来产生的。class Inner private int index=50;void print()int index=30;System.out.println(index);System.out.println(this.index);System.out.println(Outer.this.index);void print()Inner inner=new Inner();inner.print();Inner getInner()return new Inner(); class Test public static void main(String args)Outer outer=new Outer();Outer.Inner inner=outer.new Inner(); /*想想为何要有outer.这是因为,inner对象要访问Outer类的成员,则只有先产生Outer类对象的引用outer才会给index等成员分配内存,这样index等才可被内部类对象访问。*/inner.print();l 在方法中定义的内部类,如果要访问方法中已定义的本地变量或方法的参数,则变量必须被声明为final。class Outerprivate int index=100;void fn(final int a)final int b=0;if(true) class Middle private int index=60;class Inner private int index=50; void print() int index=30; System.out.println(index); System.out.println(this.index); System.out.println(Middle.this.index); System.out.println(Outer.this.index); System.out.println(a); System.out.println(b); void print()class Test/编译后无错误。l 内部类可以声明为static 的,但此时就不能再使用外部类的非static的成员变量和非静态的成员方法。l 非static 的内部类中的成员不能声明为static 的,只有在顶层类或static 的内部类中才可声明static成员。l 内部类可以声明为private或protected;还可以声明为abstract或final。class Carclass Wheelclass PlaneWheel extends Car.Wheelpublic static void main(String args) eWheel pw=new PlaneWheel();编译报错:这是因为当我们产生一个派生类的对象的时候会调用基类的构造函数,产生一个基类的对象,然而我们的这个基类是内部类。要产生内部类的对象先要产生外部类的对象,修改见下:class Carclass Wheelclass PlaneWheel extends Car.WheelPlaneWheel(Car car)car.super();public static void main(String args)Car car=new Car();PlaneWheel pw=new PlaneWheel(car);内部类实现接口interface Animalvoid eat();void sleep();class Zooclass Tiger implements Animalpublic void eat()System.out.println(tiger eat);public void sleep()System.out.println(tiger sleep); Animal getAnimal() return new Tiger(); class Testpublic static void main(String args)Zoo z=new Zoo();Animal an=z.getAnimal();an.eat();an.sleep();运行结果为: tger eat tger sleep- - - - -interface Animalvoid eat();void sleep();class Zooclass Tiger implements Animalpublic void eat()System.out.println(tiger eat);public void sleep()System.out.println(tiger sleep); /*Animal getAnimal() return new Tiger(); */ Animal getAnimal() return new Animal() /这是匿名的内部类 public void eat() System.out.println(animal eat); public void sleep() System.out.println(animal sleep); ; class Testpublic static void main(String args)Zoo z=new Zoo();Animal an=z.getAnimal();an.eat();an.sleep();运行结果为: animal eat aimal sleepl 我们为什么使用内部类1、 在内部类(inner class)中,可以随意的访问外部类的成员,这可以让我们更好 地组织管理我们的代码,增强代码的可读性。2、 内部类可以用于创建适配器类,适配器类是用于实现接口的类。使用内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。-/使用内部类解决不能多重继承的问题。class Avoid fn1()ab
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《2025合同终止通知》
- 2025澳大利亚留学租房合同签订注意事项
- 2025年智能手表销售合同范文
- 详细离婚协议书6篇
- 2025标准合同范本:版企业员工劳动合同样例
- 2025新款合同范本:机器采购协议汇编
- 2025年深远海风电场建设与运维关键技术实施效果评估报告
- 2025国际贸易合同模板格式
- 2025年智慧公交系统实施方案创新成果评估报告
- 2025年国内技术咨询合同书
- 北京市律师协会律师办理法律尽职调查业务操作指引
- (2025年标准)会员销售协议书
- 2025至2030中国专业图片存档和通信系统(PACS)行业项目调研及市场前景预测评估报告
- 妇产科临床路径培训课件
- 2025一级造价工程师《案例分析(土建、安装)》学霸笔记
- 2025人教版八年级英语上册课文原文及翻译
- 2025年广东省茂名市《公共基础知识》事业单位招聘考试国考真题(含答案)
- 2025年网络等级保护考核题库及答案
- 生产提成管理办法
- 2025年宁波市黄湖监狱招聘警务辅助人员考试笔试试题(含答案)
- 教育测量与评价 课件全套 朱德全 第1-15章 教育测量与评价概述- 教育测评结果的统计处理
评论
0/150
提交评论