1.成员内部类格式: 修饰符 class 类名称{
修饰符 class 类名称{}
}
内用外:随便用 外用内:一定要借助内部类对象
2.内部类使用方法:
:间接调用 通过外部类的方法间接调用内部类
:直接调用 公式 类名称 对象名=new 类名称();
外部类名称.内部类名称 对象名=new 外部类名称().new内部类名称();
*/
3: 成员变量的理解:
/*当外部成员变量与内部成员变量以及内部方法成员变量同名时,
名字调用的是方法成员变量
this.名字调用的是内部成员变量
要在内部类中调用外部成员变量-> 外部类名称.this.成员变量;
*/
public class Demo1 {
public static void main(String args[]) {
//间接调用
Body body =new Body();
body.setName("qwe");
body.insideClass();//通过调用外部类的方法间接调用方法中包含的内部类方法
System.out.println("==============");
//内部类直接调用
Body.Heart heart=new Body().new Heart();
heart.setName("zxc");
heart.heartWork();
heart.Workoutside();
//两种方法相同
Body body1=new Body();
Body.Heart heart1=body1.new Heart();
heart1.setName("zxc");
heart1.heartWork();
heart.Workoutside();
}
}
public class Body {
//外部类成员和方法
private String name; //外部类的成员变量
public void insideClass() {
Heart heart=new Heart();
heart.setName("asd");
heart.heartWork();
new Heart().heartWork(); //**匿名对象**
heart.Workoutside();
new Heart().Workoutside();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public class Heart{ //内部类
private String name; //内部类的成员变量
public void heartWork() {
System.out.println("内部类工作!");
}
public void Workoutside() {
String name="rty"; //内部类方法的局部变量
System.out.println("name调用的是内部类中方法成员name:"+name); //成员变量同名时,由于就近原则,优先调用内部类方法成员变量
System.out.println("this.name调用的是内部类成员name:"+this.name); //调用的是内部类成员
System.out.println("Body.this.name调用的是外部成员变量name:"+Body.this.name);//调用的是外部成员变量
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
**匿名内部类**
使用在:如果接口的实现类(或者是父类或子类)只需要使用一次,那么这种情况下就可以使用匿名内部类。
匿名内部类的定义格式:
接口名称 对象名 = new 接口名称(){
覆盖重写所有抽象方法;
};
注意事项:
1:匿名内部类在创建对象的时候只能使用唯一一次
2:匿名对象在调用方法的时候只能调用一次
3:匿名内部类省略的是(实现类/子类) 匿名对象省略的是对象名称
public class Demo1 {
public static void main(String args[]) {
Body body=new Body() {
@Override
public void method() {
System.out.println("匿名类方法实现!");
}
};
body.method();
//相同输出
new Body(){
public void method(){
System.out.println("匿名类方法实现!");
}
}.methed();
}
public interface Body {
void method();
}