●之前类中可以有变量和方法,今天开始在类中再添加一个元素类。
将一个类声明/定义在另一个类的里面,里面的这个类就是---内部类 类里面的类。
内部类---包含在类中的类就是内部类;
外部类---包含内部类的类就是外部类;
内部类编译后会形成一个新字节码文件【外部类名$内部类名.class】
1.成员内部类---相当于是java类中的成员变量
基本结构:
public class TestClass{
public class lnnerClass{
}
}
TestClass---外部类
lnnerClass---成员内部类
(1)成员内部类可以使用任意的访问限制修饰符;
(2)成员内部类可以有实例变量、实例方法、构造方法、有静态元素;
(3)内部类的构造方法和内部类的实例方法
可以访问当前内部类的其他构造方法【new】
可以访问当前内部类的实例元素【对象/this可以省略对象和this】
(4)内部类的构造方法和内部类的实例方法
可以访问外部类的构造方法【new】
可以访问外部类的实例元素【对象/外部类名.this 可以省略】
可以访问外部类的静态元素【类名/对象/外部类名.this可以省略】
(5)外部类构造方法和实例方法
可以访问内部类构造方法
可以访问内部类实例元素【只能对象】
可以访问内部类静态元素【类名/对象】
外部类静态方法
不能访问内部类构造方法
不能访问内部类实例元素
可以访问内部类静态元素【类名】
(6)其他类中构造方法和实例方法和静态方法
可以访问内部类的构造方法【外部类对象.new内部类的构造方法】
可以访问内部类的实例元素【只能对象】
可以访问内部类的静态元素【类名/对象】
2.方法内部类---定义在方法中的类,相当于局部变量
基本格式:
package com.wangxing.test2;
public class TestClass {
public TestClass(){
class InnerClass1{
}
}
public void testMethod(String canshu){
class InnerClass2{
}
}
public static void testStaticMethod(String canshu){
class InnerClass3{
}
}
(1) 方法内部类不能使用任何访问限制修饰 ;
(2)方法内部类可以有实例变量/方法,构造方法;
(3)方法内部类的构造方法和实例方法
可以访问当前方法内部类中的构造方法【new】
可以访问当前方法内部类中的实例元素【对象/this 可以省略】
可以访问当前方法内部类中的静态元素【类名/对象/this 可以省略】
(4)方法内部类中访问当前方法中的局部变量【变量名称】,注意该局部变量是final修饰符修饰
(5)方法内部类的构造方法和实例方法
可以访问外部类的构造方法【new】
可以访问外部类的实例元素【对象/外部类名.this 可以省略】
可以访问外部类的静态元素【类名/对象/外部类名.this 可以省略】
(6)外部类是不能访问到方法内部类中的元素。
3.静态嵌套类---相当于是java类中的静态变量
基本格式:package com.wangxing.test3;
public class TestClass {
public static class InnerClass{
}
}
(1)静态嵌套类可以使用任意的访问限制修饰符。
静态嵌套类中可以有构造方法,实例变量/方法,类变量/方法。
(2)静态嵌套类的构造方法和实例方法
可以访问当前内部类的其他构造方法【new】
可以访问当前内部类的实例元素【对象/this 可以省略对象和this】
可以访问当前内部类的静态元素【对象/this/类名 可以省略对象和this/类名】
静态嵌套类的静态方法
可以访问当前内部类的其他构造方法
this不能使用
可以访问当前内部类的实例元素【对象】
可以访问当前内部类的静态元素【类名/对象 可以省略类名/对象】
(3)静态嵌套类的构造方法和实例方法和静态方法
可以访问外部类的构造方法【new】
可以访问外部类的实例元素【对象】
可以访问外部类的静态元素【类名/对象 可以省略类名/对象】
(4)外部类构造方法和实例方法和静态方法
可以访问内部类构造方法
可以访问内部类实例元素【只能对象】
可以访问内部类静态元素【类名/对象】
(5)其他类中
可以访问静态嵌套类的构造方法【new 外部类类名.静态嵌套类的构造方法】
可以访问内部类的实例元素【只能对象】
可以访问内部类的静态元素【类名/对象】
4.匿名内部类---没有名字的java类,在不用创建出新类的情况下,构建出当前类/接口的子类,构建的子类没有名字,所以叫匿名内部类的基本格式:
package com.wangxing.test4;
public class Person {
public void personInfo(){
System.out.println("Person类的实例方法");
}
}