目录
在一个外部类中定义的类称为内部类,内部类可以分为静态和非静态
一.静态内部类
由static修饰的内部类就是静态内部类,以下的叙述均默认内部类直接定义在外部类中时
1.在静态方法中
当在静态方法中创建静态内部类对象时,不需要创建外部类对象,可直接创建内部类对象:
public class Body{
static class Heart{
public void work() {
System.out.println("working");
}
}
public static void main(String[] args) {
Heart heart = new Heart();
}
}
2.在非静态方法中
在非静态方法中如果要创建静态内部类对象,因为内部类是静态的,所以可以通过外部类的类名来创建,当然也可以将Body.省略。
但是由于方法是非静态的,所以在main方法中只能通过创建外部类对象来调用该方法创建内部类对象:
public class Body{
static class Heart{
public void work() {
System.out.println("working");
}
}
public void shrink() {
Heart heart = new Body.Heart();
}
public static void main(String[] args) {
Body body = new Body();
body.shrink();
}
}
Heart heart = new Heart();
二.非静态内部类
1.在静态方法中
当内部类是非静态时,在静态方法中创建对象必须先创建一个外部类的对象,然后用外部类的对象调用内部类来创建对象:
public class Body{
class Heart{
public void work() {
System.out.println("working");
}
}
public static void main(String[] args) {
Body body = new Body();
Heart heart = body.new Heart();
}
}
2.在非静态方法中
当非静态内部类在非静态方法中创建对象时,看似和静态内部类一样:
public class Body{
class Heart{
public void work() {
System.out.println("working");
}
}
public void shake() {
Heart heart = new Heart();
}
public static void main(String[] args) {
Body body = new Body();
body.shake();
}
}
但实际上是在new前面省略了一个默认的this:
Heart heart = this.new Heart();
三.使用中的注意事项
1.静态内部类只能直接定义在外部类中
不只是静态内部类,static修饰符都只能直接定义在类中,假如将静态内部类定义在main方法中,则会报错:
public class Body{
public static void main(String[] args) {
static class Heart{
public void work() {
System.out.println("working");
}
}
}
}
2.静态内部类访问成员变量
静态内部类想要访问外部类中的成员变量和方法时,如果成员变量和方法是静态的,则直接访问即可;如果成员变量和方法是非静态的,则必须创建外部类的对象来访问:
public class Body{
int age=12;
static class Heart{
public void work() {
System.out.println(new Body().age);
}
}
}
3.使用范围
在非外部类中直接定义的内部类和局部变量一样,其使用范围从定义的位置开始到其所在直接语句块结束,像如下的代码,除了if语句,内部类便失效了:
public class Body{
public static void main(String[] args) {
if(true) {
class Heart{
public void work() {
System.out.println("working");
}
}
}
}
}
4.内部类中使用static
只有有名、静态的内部类中才允许有静态成员变量、方法、代码块。
public class Body{
static class Heart{
static int age=12;
static {
System.out.println("静态");
}
static public void work() {
System.out.println("working");
}
}
public static void main(String[] args) {
Body body = new Body();
}
}