Java--内部类

前言

        之前我们都只知道,类中有方法,并且类与类之间是独立分开定义的,所以初接触内部类,感觉好新奇,所以就总结了这篇博客。

内容

定义

        将一个类定义在另一个类里面,里面的类称为内部类,外面的类称为外部类。

使用位置

        一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用,比如:人身体里面有一颗心脏,离开心脏人无法独立存活,心脏离开人体也不能继续活力运动,又比如汽车内部有一个发动机,汽车离开发动机就跑步起来,发动机离开汽车就没有动力移动。

内部类种类

按照定义划分:

1. 成员内部类:定义在了成员为止(类中方法外称为成员位置)
定义格式:
class 外部类 {
    // 成员变量
    // 成员方法
    class 内部类 {
	 // 成员变量        
     // 成员方法    
    }
}

        在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构,比如汽车类Car中包含发动机Engine,这时,Engine就可以使用内部类来描述,定义在成员位置。
举例:

class Car { //外部类
    class Engine { //内部类    
    }
}
访问特点:

        内部类可以直接访问外部类的成员,包括私有成员。

外部类名.内部类名 对象名 = new 外部类型().new 内部类型();

        举例:

//定义类:
public class Body {
    public  boolean live = true;
 
    public void walk() {
        System.out.println("散步");
    }
 
    class Heart {
        public void jump() {
            // 直接访问外部类成员
            if (live) {
                System.out.println("心脏在跳动");
            } else {
                System.out.println("心脏不跳了");
            }
        }
    }
}

//定义测试类:
public class Demo04 {
    public static void main(String[] args) {
        // 外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
        // 创建的是内部类对象
        // Body.Heart heart = new Body().new Heart();
        // heart.jump();
        // 创建方式2:先创建外部类,再创建内部类
        // 创建外部类对象
        Body b  = new Body();
        // 创建内部类对象
        Body.Heart heart = b.new Heart();
        // 调用内部类方法
        heart.jump();
        // 调用外部类方法
        b.live = false;
        // 调用内部类方法
        heart.jump();
    }
}

//输出结果:
//心脏在跳动
//散步
//心脏不跳了

        内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名
和$符号 。
        比如:

Body$Heart.class
2. 局部内部类:定义在方法类
定义格式:
class 外部类名 {
	数据类型 变量名;    
	   
	修饰符 返回值类型 方法名(参数列表) {    
		// …        
		class 内部类 {        
		// 成员变量            
		// 成员方法            
		}        
	}    
}

        在定义好局部内部类后,直接就创建对象

访问特点:

        内部类可以直接访问外部类的成员,包括私有成员。

/*
局部内部类格式
class 外部类名 {
    数据类型 变量名;
    修饰符 返回值类型 方法名(参数列表) {
        // …
        class 内部类 {
            // 成员变量
            // 成员方法
        }
    }
}
 */
class Chinese {
    String name = "凤姐";
    public void walk() {
        System.out.println(name + "散步");
    }
    public void eat() {
        // 筷子
        class Chopsticks {
            int length = 30;
            public void use() {
                System.out.println("使用筷子" + length);
                // 局部内部类可以直接访问外部类的成员
                walk();
                System.out.println(name);
            }
        }
        // 在定义好局部内部类后,直接就创建对象
        Chopsticks c = new Chopsticks();
        c.use();
    }
}
// 测试类
public class Demo06 {
    public static void test() {
        // 放法中的变量,其他方法不能直接调用
        // public static int b = 10;
        int a = 10;
        System.out.println(a);
    }
    public static void main(String[] args) {
		// System.out.println(a);      
        Chinese c = new Chinese();
        c.eat();
    }
}

        局部内部类编译后仍然是一个独立的类,编译后有 还 有 一 个 数字。
Chinese1Chopsticks.class

总结

        内部类面向对象程序设计中,可以在一个类的内部定义另一个类。嵌套类分为两种,即静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。

end

谢谢您的阅读!
下一篇博客将为您介绍匿名内部类

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值