类的内部成员之五:内部类
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。I
1.Java中允许讲一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
2.内部类的分类:成员内部类(静态、非静态)VS局部内部类(方法内、代码块内、构造器内)
3.成员内部类:
一方面,作为外部类的成员:
调用外部类的结构
可以用static修饰
可以被4种不同的权限修饰
另一方面,作为一个类
类内可以定义属性、方法、构造器等
可以被final修饰,表示此类不能被继承。言外之意,不使用final,就可以被继承
可以被abstract修饰
4.关注如下的3个问题
4.1如何实例化成员内部类的对象
4.2如何在成员内部类中区分调用外部类的结构
4.3开发中局部内部类的使用 见 《InnerClassTest1.java》
5.补充
在局部内部类的方法中(比如show)如果调用局部内部类所声明的方法(比 如method)中的局部变量(比如num)的话, 要求此局部变量声明为final的。
jdk 7及之前版本:要求此局部变量显示的声明为final的
jdk 8及之后版本:可以省略final的声明
在B站学习java写的代码
代码如下
/* * 类的内部成员之五:内部类 * 1.Java中允许讲一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类 * * 2.内部类的分类:成员内部类(静态、非静态)VS局部内部类(方法内、代码块内、构造器内) * * 3.成员内部类: * 一方面,作为外部类的成员: * 》调用外部类的结构 * 》可以用static修饰 * 》可以被4种不同的权限修饰 * * 另一方面,作为一个类 * 》类内可以定义属性、方法、构造器等 * 》可以被final修饰,表示此类不能被继承。言外之意,不使用final,就可以被继承 * 》可以被abstract修饰 * * 4.关注如下的3个问题 * 4.1如何实例化成员内部类的对象 * 4.2如何在成员内部类中区分调用外部类的结构 * 4.3开发中局部内部类的使用 见 《InnerClassTest1.java》 * * 5.补充 * 在局部内部类的方法中(比如show)如果调用局部内部类所声明的方法(比 如method)中的局部变量(比如num)的话, 要求此局部变量声明为final的。 * * jdk 7及之前版本:要求此局部变量显示的声明为final的 * jdk 8及之后版本:可以省略final的声明 * * */
InnerClassTest类
package com.day0201_1; public class InnerClassTest { public static void main(String[] args) { //创建Dog实例(静态的成员内部类): Person.Dog dog=new Person.Dog(); dog.show(); //创建Bird实例(非静态的成员内部类): // Person.Bird bird=new Person.Bird();//错误的 Person p =new Person(); Person.Bird bird=p.new Bird(); bird.sing(); System.out.println(); bird.display("黄鹂"); } } class Person{ String name="小明"; int age; public void eat() { System.out.println("人吃饭"); } //静态成员内部类 static class Dog{ String name; int age; public void show() { System.out.println("卡拉是条狗"); // eat(); } } //非静态成员内部类 class Bird{ String name="杜鹃"; public Bird() { } public void sing() { System.out.println("我是一只小小鸟"); eat();//调用外部类的非静态属性Person.this.eat(); System.out.println(age); } public void display(String name) { System.out.println(name);//方法的形参 System.out.println(this.name);//内部类的属性 System.out.println(Person.this.name);//外部类的属性 } } public void method() { //局部内部类 class AA{ } } { //局部内部类 class BB{ } } public Person(){ int num=10; //局部内部类 class CC{ // num=20;//Syntax error on token "num", VariableDeclaratorId expected after this token public void show() { System.out.println(num); } } } }
InnerClassTest1类
package com.day0201_1; /* * 开发中局部内部类的使用 * */ public class InnerClassTest1 { //开发中很少见 public void method() { //局部内部类 class AA{ } } //返回一个实现了Comparable接口的类的对象 public Comparable getComparable(){ //创建一个实现类Comparable接口的类:局部内部类 //方式一: // class MyComparable implements Comparable{ // // @Override // public int compareTo(Object o) { // return 0; // } // // } // return new MyComparable(); //方式二: return new Comparable() { @Override public int compareTo(Object o) { return 0; } }; } }