定义
在java中可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类
为什么要将一个类定义在另一个类里面呢?
内部类隐藏在外部类之内,更好的实现了信息的隐藏。内部类信息的获取需要借助外部类。
内部类的分类
1成员内部类
2.静态内部类
3.方法内部类
4.匿名内部类
1.成员内部类
成员内部类是最常见的内部类,又称为普通内部类
package cn.hpu.people;
//外部类
public class Person {
public int age;
public Heart getHeart() {
return new Heart();
}
//成员内部类
/*
*
* 1.内部类在外部使用时,无法直接实例化,需要借助外部信息
* 2.内部类的访问修饰符何以任意,但是访问范围会受到影响。
* 3.内部类可以直接访问外部类成员,如果出现同名属性,优先访问内部类定义的。
* 4.可以使用外部类.this.成员名,来调用外部类中的同名属性。
* 5.外部类访问内部类信息,需要通过内部类实例,不能直接访问。
*/
public class Heart{
public String beat() {
return "心脏跳动";
}
}
}
package cn.hpu.people;
public class PeopleTest {
public static void main(String[] args) {
Person lily=new Person();
lily.age=20;
//获取内部类对象实例 方式一:new 外部类().new 内部类()
Person.Heart myHeart=new Person().new Heart();
System.out.println(myHeart.beat());
//获取内部类对象实例 方式二:外部类对象.new 内部类();
Person.Heart myHeart1=lily.new Heart();
System.out.println(myHeart1.beat());
//获取内部类对象实例 方式三:外部类对象.获取方法
Person.Heart myHeart2=lily.getHeart();
System.out.println(myHeart2.beat());
}
}
三种获取内部类对象实例的方法
方式一:new 外部类().new 内部类()
方式二:外部类对象.new 内部类()
方式三:外部类对象.获取方法
成员内部类知识点:
1.内部类在外部使用时不能直接实例化,需要借助外部信息。获取外部类实例对象的三种方式
2.内部类的访问修饰符任意,但是访问范围会受到影响
3.内部类可以直接访问外部类成员,当外部类成员与内部类成员重名时,优先调用内部类成员。
静态内部类
package cn.hpu.people;
//外部类
public class Person {
public static int age;
public Heart getHeart() {
return new Heart();
}
public void eat() {
System.out.println("人会吃东西");
}
//静态内部类
/*
* 1.静态内部类只能调用外部类的静态成员,非静态成员可以通过对象实例来调用
* 2.静态内部类的实例对象的创建不依赖于外部类对象
* 3.静态内部类的静态方法可以通过外部类.内部类.方法名来调用
* 外部类的静态成员通过类名调用,非静态成员通过外部类实例对象.来调用
*
*/
public static class Heart{
public static int age=22;
public static void say() {
System.out.println("hello");
}
public String beat() {
new Person().eat();
return Person.age+"的心脏跳动";
}
}
}
package cn.hpu.test;
import cn.hpu.people.Person;
public class PeopleTest{
public static void main(String[] args) {
Person lily=new Person();
//获取静态内部类的实例对象
Person.Heart myHeart=new Person.Heart();
System.out.println(myHeart.beat());
Person.Heart.say();
}
}
静态内部类的知识点:
1.静态内部类的对象的实例化可以不依赖外部类的对象.通过外部类.内部类()来实例化内部类对象。
2.静态内部类只能调用外部类的静态成员,非静态成员需要通过对象实例来调用
3.静态内部类的方法可以通过外部类.内部类.方法名来调用