所谓内部类就是在类的内部声明类 ,这样内部类可以分为 成员内部类 和局部内部类。
下面是学习笔记:
package oop.inner_class;
import oop.inner_class.Person.Legs;
/*
* 类的内部成员之五:内部类
* 1.Java中允许将一个类A声明在类B中,类A为内部类,类B为外部类
* 2.内部类的分类:
* 成员内部类 vs 局部内部类(方法内、代码块内、构造器内)
* 3.成员内部类:
* 一方面,作为外部类的成员:
* > 调用外部类的结构
* > 可以被static修饰
* > 可以被四种不同权限修饰
* 另一方面作为一个类:
* > 类内可以定义属性方法构造器
* > 可以被final修饰,表示此类不可以被继承,不被final修饰就可以被继承
* > 可以被abstract修饰,不能实例化对象
* 4.关注如下三个问题:
* 4.1如何实例化成员内部类对象
* 4.2如何在成员内部类中区分调用外部类的结构
* 4.3开发中局部内部类的使用
* 成员内部类和局部内部类都会生成字节码文件
* 格式:成员内部类:外部类$内部类名.class 局部内部类:外部类$数字 内部类名.class
*/
public class InnerClassTest {
public static void main(String[] args) {
//创建Legs实例(静态成员内部类):
Person.Legs legs = new Person.Legs();
legs.say();
//创建Brain实例(非静态成员内部类):
// Person.Brain brain=new Person.Brain(); 错误的
Person p=new Person();
Person.Brain brain =p.new Brain();
brain.show();
}
}
class Person{
String name;
public void say() {
System.out.println("人可以说话");
}
//非静态成员内部类
class Brain{
String name;
public void show() {
say();//可以调用外部类的方法
}
public void method(String name) {
System.out.println(name);//形参
System.out.println(this.name);//Brain的name(内部类的属性)
System.out.println(Person.this.name);//Person的name(外部类的属性)
}
//静态成员内部类
static class Legs{
String name;
double width;
public void say()
{
System.out.println("这是大腿");
}
public Legs() {
}
}
public void method() {
say();
//局部内部类
class AA{
}
}
{ //局部内部类
class BB{
}
}
public Person() {
class CC{
}
}
}
}
package oop.inner_class;
public class InnerClassTest1 {
//开发中很少见
public void method() {
//局部内部类
class AA{
}
}
//返回一个实现了Comparable接口的类的对象
public Comparable getComparable() {
class MyComparable implements Comparable{
//创建一个实现了Comparable接口的类:局部内部类
//方法一:
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
}
return new MyComparable();
//方式二
return new Comparable() {
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
};
}
}
package oop.inner_class;
/*
* 在局部内部类的方法中(show方法)如果调用局部内部类所声明的方法(method方法)中的局部变量的话,
* 要求此局部变量声明为final的(如num)
*/
public class InnerClassTest2 {
}
class Person{
public void method() {
final int num=10;
class AA{
public void show(){
System.out.println(num);
// num=20; The final local variable num cannot be assigned, since it is defined in an enclosing type
//此时的num必须为final类型的
}
}
}
}