1.内部类
2.成员内部类
package com.liuermeng.person;
public class Person {
int age;
public void eat() {
System.out.println("人会吃东西");
}
public Heart getHeart() {
return new Heart();
}
// 成员内部类
/*
* 1.内部类在外部使用时,无法直接调用,需要借助外部类的信息才能实现
* 2.内部类前面的修饰符可以根据使用设定,但是访问权限会受到相应的改变
* 3.内部类可以直接访问外部类的成员;如果出现同名属性或方法,优先访问内部类中定义的
* 4.可以通过外部类.this.成员(方法)的方式来获取外部类中的同名属性(成员)信息
* 5.外部类访问内部类信息,需要通过内部类实例
* 6.内部类编译后.class文件命名:外部类&内部类.class
*/
class Heart{
public int age=10;
public void eat() {
System.out.println("心脏不会吃东西");
}
public String beat() {
Person.this.eat();
return Person.this.age+"岁的心脏在跳动";
}
}
}
package com.liuermeng.person;
public class personTest {
// 调用内部类的几种方法
public static void main(String[] args) {
Person xiaoming=new Person();
xiaoming.age=22;
// 方法一:通过 new 外部类.new 内部类 实现
Person.Heart heart=new Person().new Heart();
System.out.println(heart.beat());
// 方法二:通过外部类引用.new 内部类 实现
heart=xiaoming.new Heart();
System.out.println(heart.beat());
// 方法三:通过外部类引用.获取方法 实现
heart=xiaoming.getHeart();
System.out.println(heart.beat());
}
}
输出:
人会吃东西
0岁的心脏在跳动
人会吃东西
22岁的心脏在跳动
人会吃东西
22岁的心脏在跳动
3.静态内部类
package com.liuermeng.person;
public class Person {
public int age;
public void eat() {
System.out.println("人会吃东西");
}
public Heart getHeart() {
return new Heart();
}
// 静态内部类
/*
* 1.静态内部类中,只能直接访问外部类的静态成员,如需调用非静态成员,可以通过对象实例
* 2.静态内部类实例化时,可以不依赖外部类
* 3.可以通过外部类.内部类.静态成员的方式访问内部类的静态成员
* 4.当内部类成员与外部类成员重名时,默认直接调用内部类成员;
* 如果需要访问外部类中的静态成员,则可以通过 外部类.成员名 的方式(注意不能用this);
* 如果需要访问外部类中的非静态成员,则可以通过 new 外部类().成员名 的方式
*/
public static class Heart{
public int age=10;
public static void say() {
System.out.println("Hello");
}
public void eat() {
System.out.println("心脏不会吃东西");
}
public String beat() {
new Person().eat();
return new Person().age+"岁的心脏在跳动";
}
}
}
package com.liuermeng.person;
public class personTest {
public static void main(String[] args) {
Person xiaoming=new Person();
xiaoming.age=22;
// 获取内部类实例对象
Person.Heart myHeart=new Person.Heart();
System.out.println(myHeart.beat());
Person.Heart.say();
}
}
输出:
人会吃东西
0岁的心脏在跳动
Hello
4.方法内部类
定义在外部类方法中的内部类,也称局部内部类
package com.liuermeng.anoymous;
public abstract class Person {
private String name;
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void read();
}
package com.liuermeng.anoymous;
public class Man extends Person {
@Override
public void read() {
System.out.println("男生爱看武侠小说");
}
}
package com.liuermeng.anoymous;
public class Woman extends Person {
@Override
public void read() {
System.out.println("女生爱看言情小说");
}
}
package com.liuermeng.test;
import com.liuermeng.anoymous.Man;
import com.liuermeng.anoymous.Person;
import com.liuermeng.anoymous.Woman;
public class PersonTest {
// 根据传入的人的不同类型,调用对应的read方法
// 方案一:
/*public void getRead(Man man) {
man.read();
}
public void getRead(Woman woman) {
woman.read();
}
*/
// 方案二:
public void getRead(Person person) {
person.read();
}
public static void main(String[] args) {
PersonTest test=new PersonTest();
Man one =new Man();
Woman two=new Woman();
test.getRead(one);
test.getRead(two);
}
}
输出
男生爱看武侠小说
女生爱看言情小说
匿名内部类:
下面使用匿名内部类的方法:
package com.liuermeng.anoymous;
public abstract class Person {
private String name;
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void read();
}
package com.liuermeng.test;
import com.liuermeng.anoymous.Person;
public class PersonTest {
// 根据传入的人的不同类型,调用对应的read方法
// 方案三:
public void getRead(Person person) {
person.read();
}
public static void main(String[] args) {
PersonTest test=new PersonTest();
test.getRead(new Person() {
@Override
public void read() {
// TODO Auto-generated method stub
System.out.println("男生爱看武侠小说");
}
});
test.getRead(new Person() {
@Override
public void read() {
// TODO Auto-generated method stub
System.out.println("女生爱看言情小说");
}
});
}
}