/*
成员内部类:定义在成员位置(类中方法外)上的类
可以用权限修饰符
成员内部类编译好后的形式: 外部类名$内部类名.class
*/
public class Person {
// private int i = 3;
class Heart {//成员内部类
public void jump() {
System.out.println("心脏在跳动");
}
}
/*public void method() {
}*/
}
/*
内部类中的成员调用格式
外部类名.内部类名 引用变量名=new 外部类(参数).new内部类(参数);
引用变量名调用内部类成员
*/
public class Demo01 {
public static void main(String[] args) {
Person.Heart ph = new Person().new Heart();
ph.jump();
}
}
/*
局部内部类:定义在局部位置
局部内部类编译好的形式: 外部类$编号内部类名.class
*/
public class Demo04 {
public void method() {
class Inner{
}
new Inner();
}
}
c.匿名内部类
匿名对象: new 类名(参数)
匿名内部类:
格式:
new 父类或 父接口(){
//重写父类或父接口方法
}
匿名内部类的原理:
1.自动生成一个内部类 Demo06$1.class
class Demo06$1 implements Smoke{
public void smoking() {
System.out.println("饭后一根烟,赛过活神仙");
}
}
2.会创建Demo06$1的对象
new Demo06$1();
//其实相当于 Smoke s=new Demo06$1();
Smoke s= new Smoke() {
public void smoking() {
System.out.println("饭后一根烟,赛过活神仙");
}
};
匿名内部类为了简化创建实现类
public interface Smoke {
void smoking();
}
public class Student implements Smoke {
@Override
public void smoking() {
System.out.println("吸烟有害健康");
}
}
public class Demo05 {
public static void main(String[] args) {
/*Student student = new Student();
student.smoking();*/
Smoke s = new Student();//父接口指向实现类对象//多态的形式
s.smoking();
}
}
public class Demo06 {
public static void main(String[] args) {
/* Smoke s= new Smoke() {//父接口指向实现类对象 Smoke s=new Demo06$1();
//遵循多态
public void smoking() {
System.out.println("c");
}
};
s.smoking();*/
new Smoke() {//new Demo06¥1.smoking();
@Override
public void smoking() {
System.out.println("饭后一根烟,赛过活神仙");
}
}.smoking();
}
}