Definition:定义在一个类里的类被称作内部类
为什么要使用内部类?
内部类是共享数据最最简单的方式之一
还能描述类与类的专属关系
//内部类同样是类 编译之后同样会形成.class文件
只是其命名规则 为 外部类名字$内部类名字.class
内部类按照能使用外部类的哪些属性或方法分为四类:局部内部类,静态内部类,匿名内部类,成员内部类
成员内部类: 外部类的所有[静态+非静态]成员[属性+方法]
如何创建其对象:
Outer.Inner in = new Outer().new Inner();
public class TestMemberInner{
public static void main(String[] args){
//我想创建那个内部类对象
Outer.Inner in1 = new Outer().new Inner();
Outer.Inner in2 = new Outer().new Inner();
Outer out = new Outer();
Outer.Inner in3 = out.new Inner();
Outer.Inner in4 = out.new Inner();
}
}
class Outer{
int a = 3; //成员变量 = 实例变量 = 属性
static int b = 5; //静态变量
class Inner{
int x = 7;
public void test(){
System.out.println(a);//true
System.out.println(b);//true
System.out.println(x);//true
}
}
}
静态内部类: 外部类的静态成员[属性+方法]
如何创建其对象:
Outer.Inner in = new Outer.Inner();
*: 使用静态内部类 我们能够共享到的只有外部类的静态成员
静态成员我即便不是内部类也能直接共享访问
所以静态内部类的存在 并不是为了共享数据的
静态内部类是为了描述类与类的专属关系
public class TestStaticInner{
public static void main(String[] args){
//如何创建静态内部类对象~
Outer.Inner in = new Outer.Inner();
in.test();
}
}
class Outer{
int a = 3;
static int b = 5;
static class Inner{
int x = 7;
static int y = 9;
public void test(){
//System.out.println(a);//false
System.out.println(b);//true
System.out.println(x);//true
System.out.println(y);//true
}
}
}
局部内部类:
定义在静态方法:只能共享外部类的静态成员
定义在非静态方法:能够共享外部类的所有成员
另外还有其所在的外部类方法体当中的局部变量
只是JDK8.0之前必须加final修饰它们
从JDK8.0开始不需要加final 默认就是final
如何创建其对象:
Inner in = new Inner();
*: 有位置限定 定义完成之后 所在方法结束之前
public class TestLocalInner{
public static void main(String[] args){
}
}
class Outer{
int a = 3;
static int b = 5;
public void gogo(int c){
int d = 7;
class Inner{ //局部内部类
int x = 9;
public void test(){
System.out.println(a);//true (取决于所在gogo是否是非静态)
System.out.println(b);//true
System.out.println(c);//true (取决于JDK版本 8.0及之后可以)
System.out.println(d);//true (取决于JDK版本 8.0及之后可以)
System.out.println(x);//true
}
}
Inner in = new Inner();
in.test();
}
}
匿名内部类:
new 父类/接口(给父类构造方法传参){
完成抽象方法的具体实现 或者 方法覆盖;
}
*: 匿名内部类没有名字 但是依然是个类 有.class文件
以外部类名字$序列编号 命名
*: 匿名内部类能够共享外部类的哪些成员?
取决于定义它的位置
ta可能等价于上述三种的任意一种
public class TestAnonyInner2{
public static void main(String[] args){
//使用标准语法完成一个学生类 并且创建对象调用方法
Student stu = new Student();
stu.eat();
//使用匿名内部类语法创建一个老师对象 调用其方法
Person tea = new Person("孔子"){
@Override
public void eat(){
System.out.println("老师吃薯条");
}
};
tea.eat();
//我想用匿名内部类语法创建一个医生对象 并且调用方法
Person bq = new Person("扁鹊"){
@Override
public void eat(){
System.out.println("医生吃火腿");
}
};
bq.eat();
}
}
abstract class Person{
String name;
public Person(String name){
this.name = name;
}
public abstract void eat();
}
class Student extends Person{
public Student(){
super("子贡");
}
@Override
public void eat(){
System.out.println("学生吃汉堡");
}
}
//Java当中常用的共享数据的方式:
1.使用静态变量完成共享~
2.使用参数传递完成共享~
3.使用内部类完成共享~