Java核心语法——内部类

含义:定义在内部的一个类

分类:

根据位置不同:

Ⅰ.成员内部类

1.普通成员内部类

位置:类中方法外
格式:
        【定义】:class 名字{……}
        【调用】:外部类名.内部类名 命名 = new 外部类名().new 内部类名()
【注意】:
    ①内部类可以直接使用外部类的成员
    ②外部类使用内部类成员(包括私有成员)时,需要先实例化(外部类可以使用内部类私有成员,所以内部类成员没必要私有化)

在这里插入图片描述在这里插入图片描述

2.私有成员内部类

【注意】:
     私有化内部类时,不可直接访问该内部类,但是可以通过调用外部类的共有方法,间接访问

public class 私有的成员内部类 {
	public static void main(String[] args) {
		Body b = new Body();
		b.show();
	}
}
class Body {
	private int height = 149;
	
	private class Wo {
		int age = 40;
	
		public void speak() {
			System.out.println(height + "\t" + age );
		}
	}	
	public void show() {
		System.out.println(height);
		//其他的类中,无法访问Wo类,所以只能在当前外部类Body中,创建Wo类对象
		Wo w = new Wo();
		w.speak();
	}
}
3.静态成员内部类

格式:
    定义:static class 命名{……}
  【调用】:
     外部成员名.内部成员名 命名 = new 外部成员名.内部成员名()
     因为静态成员内部类加载时就创建,所以使用时,不需要实例化静态成员内部类

【注意】:
①静态成员内部类不可使用外部类中的非静态变量、方法。但是,外部类可以使用静态内部类的变量、方法
②由于是静态的所以随着加载而创建至静态区,所以不用创建静态内部类对象

public class 静态的成员内部类 {
	public static void main(String[] args) {
		Body.Gan bg = new Body.Gan();
		bg.speak();
	}
}

class Body {
	private int height = 149;
	
	static class Gan {
		String color = "black";
		public void speak() {
//			System.out.println(height);//静态环境下不能直接访问非静态的变量
			System.out.println(color);
		}
	}
	public void show() {
		System.out.println(height);
	}
}

Ⅱ.局部内部类

位置:方法中
定义:定义在方法中的类
在这里插入图片描述

调用:通过调用含内部类的方法,间接调用局部内部类。
步骤:【先在含局部内部类的方法中实例化,然后通过调用该方法,从而间接访问局部内部类】
在这里插入图片描述
【注意】:
①外部不可直接访问局部内部类(内部类是不可见的);
②即使外部获取局部内部类对象,也不可访问类中变量、方法(如何让外界获取局部内部类:比如,该方法return 这个局部内部类)。
③局部内部类中可直接使用,包含该局部内部类的方法中的变量、方法。

根据表达形式:

1.普通局部内部类

public class demo_普通局部内部类 {

	public static void main(String[] args) {
		//普通局部内部类
		class Wo implements Person1{
			@Override
			public void eat() {
				System.out.println("普通局部内部类,吃饭了");
			}
		}
		new Wo().eat();
}

interface Person1{
	public abstract void eat(); 
}


2.【匿名内部类】

格式:

	new 父类或者接口名(){
	
			对父类或者接口中的方法的重写;
	};

【注意】:
1)必须存在继承或者是接口的实现的关系
2)只能调用父类或者接口中定义的方法,不能调用自己特有的方法
3)不能向下转型,类名都没有
4)可以将匿名对象赋值给父类或者接口的引用
初版:

public class demo_匿名内部类 {

	public static void main(String[] args) {
		//匿名内部类
		new Person() {
			@Override
			public void eat() {
				System.out.println("吃饭了");
			}
		}.eat();
	}

}

interface Person{
	public abstract void eat(); 
}

3.【精简版匿名内部类】

使用lambda表达式

public class demo_精简匿名内部类 {

	public static void main(String[] args) {
		//精简版。lambda表达式
		Person per = () -> System.out.println("lambda表达式,吃饭了");
		per.eat();
		
		//方法引用
		Person1 per2 = System.out :: println;
		per2.eat();//只是换行,因为没有打印任何内容
	}

}

interface Person{
	public abstract void eat(); 
}



>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<



PS:
【】表示重要,删除线表示已解决
学习记录所用,有问题望指出哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈年_H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值