1、内部类的定义:
将A类定义在B类的内部,前者A称为内部类,后者B称为外部类,根据定义的位置分为,成员内部类(定义在成员位置)和局部内部类(A定义或直接在方法里面使用---匿名内部类)
语法格式:
class B{
....
class A{
. ...
}
}
2、内部类分类:
1.可以调用B类的所有成员(变量和方法)
2.B类中的成员变量和A类中的成员同名则可以通过B.this同名变量进行调用。
3.B类中方法要使用A类中的成员需要先创建内部类对象才能使用。
B.A 变量名 =B.new A();
4.B$A.class内部类编译后产生的字节码文件。
5.内部类和外部类类名不能同名。
注意:B类想使用A类中的所有成员,但有不想自己成为一个主类文件,这时可以考虑将B放在A里面。好比:水和瓶子的关系。
注意:成员内部类具有成员的所有特征(可以被修饰符修饰public 缺省 protect private 性质修饰符static abstrat final)
3、匿名内部类
1、一般使用接口的直接匿名调用,可以省去写接口的实现子类,而匿名调用接口的子类对象。
2、在接口中方法不超过2到3个情形下可以使用,多的不建议使用匿名。
3、匿名对象只能使用一次,不能多次使用。
4、使用场景
在使用时只需要使用一次某个对象,可以考虑使用匿名对象,一般作为实参传入方法使用。
package lnsides;
class A{
int age=18;
static String name ="苏沐橙";
class B{
int age=19;
public void Man(){
System.out.println("我今年"+age);
System.out.println(name+"今年"+A.this.age);//A.this.age:A类的成员调用(A,B有相同的成员属性调用)
}
}
public void Show(){
System.out.println("外部内的成员方法被执行了");
System.out.println(age);
//A类要使用B类的成员方法需要先创建内部B对象才能使用
B b =new B();
b.Man();//内部类的方法
System.out.println("内部类我的年龄:"+b.age);//内部类的成员变量
}
}
class C{
String name="涂山红红";
char sex='女';
int age=18;
class D{
String name="东方月初";
char sex='男';
int age=19;
public void Like(){
System.out.println("喜欢你"+C.this.name);
}
}
public void Live(){
D d = new D();
System.out.println("我喜欢你"+d.name);
}
}
class A2 {
int age = 18;
String name = "东方月初";
class B2 {
String name = "涂山红红";
int age = 19;
public void xh() {
System.out.println("我想对你说" + A2.this.name + "喜欢你\n" + "你喜欢我吗?" + A2.this.name);
}
public void nh(){
System.out.println("君生我未生,我生君已老");
A2.this.hn();
}
}
public void hx(){
B2 b2 = new B2();
b2.xh();
System.out.println("我也喜欢你"+b2.name);
}
public void hn(){
System.out.println("君恨我生迟,我恨君生早");
}
}
public class CeShiLie {
public static void main(String[] args) {
A a =new A();
a.Show();
//直接使用成员内部类对象
A.B ab = a.new B();
System.out.println(ab.age);
ab.Man();
//外部类实例对象
C c = new C();
c.Live();
System.out.println("姓名:"+ c.name);
System.out.println("年龄:"+c.age);
System.out.println("性别:"+c.sex);
//内部类的成员调用,(必须要有一个外部类的实例对象)
C.D cd =c.new D();
System.out.println("姓名:" + cd.name);
System.out.println("年龄:"+cd.age);
System.out.println("性别:"+cd.sex);
cd.Like();
A2 a2=new A2();
a2.hx();
A2.B2 ab2 = a2.new B2();
ab2.nh();
}
}