美文网首页
内部类分类

内部类分类

作者: 张轻舟 | 来源:发表于2018-08-28 22:20 被阅读19次

内部类可以是静态(static)的,可以使用 public、protected 和 private 访问控制符,而外部类只能使用 public,或者默认。

成员式内部类

在外部类内部直接定义(不在方法内部或代码块内部)的类就是成员式内部类,它可以直接使用外部类的所有变量和方法,即使是 private 的。外部类要想访问内部类的成员变量和方法,则需要通过内部类的对象来获取。

请看下面的代码:

public class Outer{ private int size; public class Inner { public void dostuff() { size++; } } 
public void testTheInner() { Inner in = new Inner(); in.dostuff(); } }

成员式内部类如同外部类的一个普通成员。

成员式内部类可以使用各种修饰符,包括 public、protected、private、static、final 和 abstract,也可以不写。

若有 static 修饰符,就为类级,否则为对象级。类级可以通过外部类直接访问,对象级需要先生成外部的对象后才能访问。

非静态内部类中不能声明任何 static 成员。

内部类可以相互调用,例如:

class A { // B、C 间可以互相调用 class B {} class C {} }

成员式内部类的访问

内部类的对象以成员变量的方式记录其所依赖的外层类对象的引用,因而可以找到该外层类对象并访问其成员。该成员变量是系统自动为非 static 的内部类添加的,名称约定为“outClassName.this”。

  1. 使用内部类中定义的非静态变量和方法时,要先创建外部类的对象,再由“outObjectName.new”操作符创建内部类的对象,再调用内部类的方法,如下所示:
public class Demo{ public static void main(String[] args)
 { Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); inner.dostuff(); } }
 class Outer{ private int size; class Inner{ public void dostuff() { size++; } } }
  1. static 内部类相当于其外部类的 static 成员,它的对象与外部类对象间不存在依赖关系,因此可直接创建。示例如下:
public class Demo{ public static void main(String[] args)
 { Outer.Inner inner = new Outer.Inner(); inner.dostuff(); } } 
class Outer{ private static int size; static class Inner {
 public void dostuff() { size++; System.out.println("size=" + size); } } 
}
运行结果:
size=1
  1. 由于内部类可以直接访问其外部类的成分,因此当内部类与其外部类中存在同名属性或方法时,也将导致命名冲突。所以在多层调用时要指明,如下所示:
public class Outer{ private int size; public class Inner{ private int size; 
public void dostuff(int size){ size++; // 局部变量 size; this.size; // 内部类的 size Outer.this.size++; // 外部类的 size } } }
局部内部类

局部内部类(Local class)是定义在代码块中的类。它们只在定义它们的代码块中是可见的。

局部类有几个重要特性:

仅在定义了它们的代码块中是可见的;

可以使用定义它们的代码块中的任何局部 final 变量;

局部类不可以是 static 的,里边也不能定义 static 成员;

局部类不可以用 public、private、protected 修饰,只能使用缺省的;

局部类可以是 abstract 的。

请看下面的代码:

public class Outer
 { public static final int TOTAL_NUMBER = 5; public int id = 123; public void func()
 { final int age = 15; String str = "http://www.weixueyuan.net"; class Inner { public void innerTest()
 { System.out.println(TOTAL_NUMBER); System.out.println(id);
 // System.out.println(str);不合法,只能访问本地方法的final变量
 System.out.println(age); } } new Inner().innerTest(); } 
public static void main(String[] args) { Outer outer = new Outer(); outer.func(); } }

运行结果:
5
123
15

相关文章

  • 2019-02-01——内部类

    1.静态内部类和成员内部类的用法?2.内部类的修饰符有什么用? 一.关于内部类的分类内部类广义上可分为四种:成员内...

  • java se 成员内部类

    一个类内部包含另一个类身体与心脏分类:1、成员内部类2、局部内部类(匿名内部类) 1、成员内部类 注:内用外可直接...

  • 2020-09-12 Java内部类、匿名内部类(重要)

    内部类 一个类包含另一个类。被包含的类叫内部类。(身体和心脏的关系)分类:1.成员内部类2.局部内部类(包含匿名内...

  • javaSE_day10_内部类和Lambda

    内部类分类: 成员内部类:实例内部类、 静态内部类(类内部类) 局部内部类 匿名内部类 ----------...

  • java内部类

    一、内部类为什么存在 为什么要使用内部类 二、内部类的分类 java内部类的分类 三、为什么内部类中访问局部变量,...

  • java内部类

    内部类的概念与分类 概念:一个类内部包含另一个类分类: 成员内部类 局部内部类(包含匿名内部类) 成员内部类的定义...

  • Java面试 - 嵌套类整理总结

    目录 总结 嵌套类分类 静态内部类重要的结论。静态内部类中能声明哪些类,变量和方法?继承方面 内部类细分类内部类中...

  • Java内部类

    Java内部类 大纲: java内部类有什么特点?为什么需要内部类? 非静态内部类持有外部类的引用 内部类的分类。...

  • java之内部类

    一、分类: 1、静态内部类 2、成员内部类 3、局部内部类 4、匿名内部类 二、静态内部类 1、静态内部类可以等同...

  • 内部类

    成员内部类 局部内部类(定义在方法内和定义在作用域内的类) 匿名内部类

网友评论

      本文标题:内部类分类

      本文链接:https://www.haomeiwen.com/subject/fvdcwftx.html