经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
java核心技术-内部类
来源:cnblogs  作者:我是派大星  时间:2018/11/6 22:38:36  对本文有异议

高级类特性-(类的成员之一:内部类)

内的成员之一:内部类(属性、方法、构造器、代码块) 可以有四种权限访问修饰符

注意:外部类 只有两种 public 和 default

定义 : 可以将一个类的定义放在另一个类定义的内部,这就是内部类 -thinking in Java

用法:如果一个类 仅跟本类关系密切的话 对于其他类希望隐藏 就可以使用内部类 例ArrayList中的 Itr

一.成员内部类

成员内部类也是最普通的内部类,它是外围类的一个成员。

在成员内部类中要注意两点,第一:成员内部类中不能存在任何static的变量和方法;第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。

  1. public class TestInnerClass {
  2. public static void main(String[] args) {
  3. //创建非静态内部类的对象
  4. Person p = new Person();
  5. Person.Computer pc = p.new Computer();
  6. pc.setName("IBM");
  7. //System.out.println(pc.getName());
  8. }
  9. }
  10. class Person {
  11. private String name = "张三";
  12. private int age;
  13. public Person() {
  14. super();
  15. }
  16. public Person(String name, int age) {
  17. super();
  18. this.name = name;
  19. this.age = age;
  20. }
  21. public class Computer{
  22. private String name = "lenovo";
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. System.out.println("setName 方法局部变量name: " + name);
  28. System.out.println("Computer 的属性name:" + this.name);
  29. System.out.println("外部内Person 属性的name:" + Person.this.name);
  30. this.name = name;
  31. }
  32. }
  33. }

二.局部内部类

有这样一种内部类,它是嵌套在方法和作用于内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。(做Java后端 用法极少见 本人三年开发 从没见过有人用过)

  1. public class TestInnerClass2 {
  2. //局部内部类:如下方式使用非常的少
  3. private void show(){
  4. class Inner{
  5. }
  6. }
  7. //如果一个类仅适用于当前方法时,可以声明如下方式
  8. public static Comparator getComparator(){
  9. class MyComparator implements Comparator{
  10. @Override
  11. public int compare(Object o1, Object o2) {
  12. return 0;
  13. }
  14. }
  15. return new MyComparator();
  16. }
  17. public static void main(String[] args) {
  18. Comparator comparator = TestInnerClass2.getComparator();
  19. }
  20. }

三.匿名内部类

注意:

  • 1.匿名内部类是没有访问修饰符的
  • 2.想使用外部的一个变量 该变量要用final修饰 -java8开始不需要
  1. public class TestInnerClass2 {
  2. public static Comparator getComparator1(){
  3. Comparator com = new Comparator(){ //匿名内部类实现的Comparator接口,new的是匿名内部类的构造器
  4. @Override
  5. public int compare(Object o1, Object o2) {
  6. // TODO Auto-generated method stub
  7. return 0;
  8. }
  9. };
  10. return com;
  11. }
  12. public static void main(String[] args) {
  13. Comparator comparator = TestInnerClass2.getComparator1();
  14. /* comparator.compare(o1, o2);*/
  15. }
  16. }

四.静态内部类

在java提高篇-----关键字static中提到Static可以修饰成员变量、方法、代码块,其他它还可以修饰内部类,使用static修饰的内部类我们称之为静态内部类,不过我们更喜欢称之为嵌套内部类。静态内部类与非静态内部类之间存在一个最大的区别,它是属于类本身,而不是某个对象。

  1. public class TestInnerClass {
  2. public static void main(String[] args) {
  3. //创建静态内部类的实例
  4. Person.Mobile pm = new Person.Mobile();
  5. pm.show();
  6. }
  7. }
  8. class Person {
  9. //静态内部类
  10. static class Mobile{
  11. public void show(){
  12. System.out.println("这是静态内部类的方法");
  13. }
  14. }
  15. }

五.内部类标识符

由于每个类都会产生一个.class文件,其中包含了如何创建该类型的对象的全部信息。您可能猜到了,内部类也必须生成一个.class文件以包含它们的Class对象信息。这些类文件的命名有严格的规则:外围类的名字,加上$,再加上内部类的名字。
如果内部类是匿名的,编译器会简单地产生一个数字作为其标识符。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号