内部类

一个类定义在另一个类的里面,对立面那个类就叫做内部类,或者嵌套类。

特点,内部类可以直接访问外部类中的成员。包括私有成员。而外部类要访问内部类中的成员必须要建立内部类对象。

代码

package demo3;
/*** 内部类* @author Angus**/
public class InnerTest {public static void main(String[] args) {Outer o = new Outer();o.method();Outer.Inner oi = new Outer().new Inner();oi.show();}}
class Outer {private int num = 10;class Inner{public void show(){System.out.println(num);}}public void method(){Inner i = new Inner();i.show();}
}

inner内部类。

访问规则:1.内部类可以直接访问外部类中的成员,包括私有。是因为内部类中持有了一个外部类的引用。格式:外部类名.this
         2.外部类要访问内部类,必须要建立内部类的对象。
         3.内部类作为外部类的成员 可以被私有化
如何直接访问内部类中的成员 function()
   outer.inner  in=new outer().inner();
   in.function();

访问格式:
1.当内部类定义在外部类的位置上的时候,而且非私有,可以在外部其他类中,可以直接建立内部类对象
  格式 外部类名.内部类名  变量名=外部类对象.内部类对象
       outer.inner  in=new outer().inner();

2.当内部类在成员的位置上,就可以被成员修饰符所修饰。
  比如:private  static,
  当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限
  在外部其他类中,如何直接访问static内部类的非静态成员?
  new Outer.Inner().sunction();
  在外部其他类中,如何直接访问staic内部类的静态成员?
  outer.inner.function();
注意:当内部类中定义了静态成员,该内部类必须是static 的。
     当外部类中的静态方法访问内部类是,该内部类必须是静态的

内部类定义原则:

当描述事物中,事物的内部还有事物,该事物用内部类来描述。
因为内部事务在使用外部事物中的内容。

局部内部类

class outer{int x=3;void  method(){int y=4;class inner{void function(){}}}}

内部类定义在局部的时候:
1.不可以被成员修饰符修饰
2.可以直接访问外部类中的成员,因为还持有外部类中的引用
  但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。

方法中的内部类能不能访问方法中的局部变量,为什么?

/***说明下此程序在内存中的执行过程,就可以了解 为什么方法中的内部类不能访问方法中的局部变量。*首先JVM找到主函数的入口, 在栈中就开辟了一个main方法的空间 同时 创建了一个 变量o,同时在堆内存中*new Outer()分配了一块内存空间,然后将变量O的引用就指向了该内存空间。Outer o=new Outer();*这就话就执行完毕,在调用function的方法时,就会将方法区中的funtion()方法进入栈中,同时将x=4*加载进栈内存中。如果不将x设置为final ,执行完, o.function();就会将function方法弹栈,此时局部x也就不存在,*内部了也是一个类,在创建一个改局部类的对象之后,只有没有其他变量引用它,它才会变成垃圾,并且在不定时消失*。所以可能发生的情况是 :在局部变量消失之后,内部类的对象还存活。也就是说在执行 内部类add()方法的时候x已经*不存在了。所以,方法中的内部类不能访问方法中的局部变量。**解决办法 就是将x 前加final 变成该内部类inner对象中的一个数据成员。这样,即使栈中局部变量x已消失,*但由于它是final,其值永不变,因而局部内部类对象在变量x死亡后,照样可以访问final型局部变量。*/class Outer{void function(){final int x=4;//方法的局部变量 //内部类class Inner{//内部类的方法void add(){System.out.print(x+4); //调用外部类方法中的局部变量}}new Inner().add();//创建个内部类的对象}}
public class Test2 {public static void main(String[] args) {Outer o=new Outer();//创建外部类对象并将 o的引用指向该变量的地址o.function();//}
}

重点为匿名内部类

没有名字的局部内部

 前提:
  必须存在一个类,抽象类,或者接口。
 格式:
new  类名或者接口名{
重写类或者接口的方法
也可以自己定义新的方法
}
package demo3;
/*** 匿名内部类* @author Angus* 没有名字的局部内部类* 前提:*      必须存在一个类,抽象类,或者接口。*   格式:*     new  类名或者接口名{*          重写类或者接口的方法*         也可以自己定义新的方法*        }*/
public class InnerTest {public static void main(String[] args) {Outer o = new Outer();o.method();}}
class Outer {private int num = 10;public void method(){new inner(){@Overridepublic void show() {System.out.println("show");}}.show();  //怎么用?}
}
interface inner{public abstract void show();
}

什么时候用?

当看到一个方法接受的形式参数是一个抽象类或者接口的时候。就可以考虑。
package demo3;
/*** 匿名内部类使用* @author Angus**/
public class AnimalTest {public static void main(String[] args){//方式一Test t  = new Test();
//      Dog d = new Dog();
//      t.show(d);//    方式二t.show( new Animal() {@Overridepublic void eat() {System.out.println("eat2");}});}
}
interface Animal{public abstract void eat();
}
class Dog implements Animal{@Overridepublic void eat() {System.out.println("eat");}}
class Test{public void show (Animal a){a.eat();}
}

最后附上JDK使用文档API 下载


java基础学习面向对象之匿名内部类 五-13相关推荐

  1. JAVA基础学习--面向对象

    JAVA基础学习–面向对象 1.面向对象与面向过程: 面向过程:就代表从头到位,每一步都需要我们来完成,例如洗衣服,首先收拾脏衣服.接上水.到洗衣液.搓.倒水.拧干.晾晒.每一步都需要我们来完成. 面 ...

  2. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  3. java基础学习-4

    Java基础学习-4 static 注意事项 重新认识main方法 继承 小练习 子类到底能继承父类中的哪些内容(第126集)*** 继承过程中成员变量和成员方法的访问特点 小练习 小总结 构造方法的 ...

  4. Java基础-初识面向对象编程(Object-Oriented-Programming)

    Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...

  5. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  6. java基础学习_IO流03_字符流、IO流小结、案例_day21总结

    java基础学习_IO流03_字符流.IO流小结.案例_day21总结 ================================================================ ...

  7. Java 基础学习-Java语言概述

    Java 基础学习 第一章 Java语言概述 回顾java基础知识,进行整理记录. 文章目录 Java 基础学习 前言 一. Java语言发展史(了解) 二.Java语言跨平台原理(理解) 三.JRE ...

  8. Java基础学习(12)

    Java基础学习 一.不可变集合 二.Stream流 2.1 Stream流数据添加 2.2 Stream流的中间方法 2.3 Stream终结方法 三. 方法引用 3.1 方法引用的基本概念 3.2 ...

  9. java基础学习-6

    Java基础学习-6 双列集合 Map的常见API Map的遍历方式 HashMap 小练习 LinkedHashMap TreeMap TreeMap--小练习1 TreeMap--小练习2 Tre ...

最新文章

  1. 综合计算机考试题库,2017年职称计算机考试综合试题模拟题库5
  2. Eclipse一直building workspace问题解决
  3. android代码记录日期,Android日期和时间选择器实现代码
  4. c语言如何发现错误在哪里,二个C语言例子,编译没通过.不知道错在哪里[求助]
  5. python里orient_OrientDB Python连接操作
  6. FastMM FastCode FastMove的使用
  7. OCR——PaddleOCR之文字识别的学习笔记
  8. 语言编程思维陈萌_这本书告诉你,计算机为何能读懂人类语言,编程思维让你更聪明...
  9. 2016HUAS暑假集训训练题 F - 简单计算器
  10. NUC1776 Tiling Up Blocks【二维最长上升子序列+DP】
  11. C1083: 无法打开包括文件: “stdafx.h”: No such file or directory
  12. 小红帽Linux系统命令重启,Linux系统常用命令之一
  13. PS魔棒工具提示不能完成请求,因为程序错误和不能完成请求,因为没有足够内存以及内存不能为read的处理
  14. 塔勒布《反脆弱》读后感
  15. 导出IE浏览器配置的注册表信息 IE设置的注册表相关信息以及修改方法
  16. (考试大整理~)Xxy 的车厢调度
  17. python中r 4.2f%r,006 Python中的 字符串String
  18. 计算机领域顶级期刊是什么,喜报 | 我所一篇论文被计算机领域顶级期刊TKDE录用...
  19. 个人看过较好的电影推荐
  20. 1. HTML5+CSS3

热门文章

  1. 《跨界杂谈》华为印象之混搭儿(七)泳装
  2. c语言学生成绩管理实验报告,学生成绩管理系统c语言实验报告
  3. 云供电的GPS芯片,大大降低智能手机功耗
  4. desktop entry不显示原因分析
  5. VMware安装注册表问题
  6. idae 格式化代码 设置eslint_VSCode中使用vue项目ESlint验证配置
  7. 黑魂3服务器维护时间,黑暗之魂3 1.04版本更新内容 三平台更新维护时间
  8. centos7 安装gcc boost 、cmake
  9. 查看rbd journal的配置
  10. 前台请求不带cookie的问题解决方案大汇总