JAVA基础(面向对象进阶) —— 内部类

 通过之前对 JAVA基础 —— 面向对象 以及 JAVA基础 —— 面向对象内存图 的学习。

接下来我们将会进一步学习面向对象进阶的相关知识点。

staticJAVA基础 (面向对象进阶)—— Static
继承JAVA基础 (面向对象进阶)—— 继承
多态JAVA基础 (面向对象进阶)—— 多态
包、final、权限修饰符、代码块、抽象类和抽象方法方法JAVA基础(面向对象进阶) —— 包、final、权限修饰符、代码块、抽象类和抽象方法方法
接口JAVA基础 (面向对象进阶)—— 接口
内部类JAVA基础 (面向对象进阶)—— 内部类

 目录

一、内容概述

1.  什么是内部类?

2. 为什么要学习内部类?

 3. 内部类的访问特点

 二、 内部类的分类

1. 成员内部类

 1.1  获取成员内部类对象

1.2   成员内部类如何获取外部类的成员变量

2. 静态内部类

3.  局部内部类

4. 匿名内部类


一、内容概述

1.  什么是内部类?

  类的五大成员:属性、方法、构造方法、代码块、内部类

内部类:就是在一个类的里面,再定义一个类。

举例:在A类的内部定义B类,B类就被称为内部类。

2. 为什么要学习内部类?

需求:写一个Javabean类描述汽车。
属性:汽车的品牌,车龄,颜色,发动机的品牌,使用年限。

发动机相关属性不应该直接和车定义在一起。

总结:

  • 内部类表示的事物是外部类的一部分
  • 内部类单独出现没有任何意义

 3. 内部类的访问特点

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象
//Car.java

public class Car {
	String carName;
	int carAge;
	String carColor;

	public void show() {
		// public void show(Car this){隐藏this
		// 打印车名字是打印调用者的车名字
		System.out.println(carName);
		// 报错!
		// ??? 在代码中没有发动机对象
		// System.out.println(engineName);
		// 所有要创建对象
		Engine e = new Engine();
		System.out.println(e.engineName);
	}

	class Engine {
		String engineName;
		int engineAge;

		public void show() {
			// 内部类可以直接访问外部类成员,包括私有
			System.out.println(engineName);
			System.out.println(carName);
		}
	}
}
//Test.java

public class Test {
	public static void main(String[] args) {
		Car c = new Car();
		c.carName = "宾利";
		c.carAge = 1;
		c.carColor = "粉色";

		c.show();
	}
}

 二、 内部类的分类

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

注意:成员内部类、静态内部类、局部内部类了解即可,一般在看源代码才会看到;但是匿名内部类需要重点掌握。

1. 成员内部类

  • 写在成员位置的,属于外部类的成员。
  • 成员内部类可以被一些修饰符所修饰,比如:private、默认、protected、public、static等。
  • 在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量。

 1.1  获取成员内部类对象

  • 方法一: 在外部类中编写方法,对外提供内部类的对象
  • 方法二:直接创建格式: 外部类名.内部类名 对象名 = 外部类对象.内部类对象;                           范例: Outer.Inter oi = new Outer().new Inter();

1.2   成员内部类如何获取外部类的成员变量

通过面试题了解:

2. 静态内部类

  • 静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。

创建静态内部类对象的格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();


  • 调用非静态方法的格式:先创建对象,用对象调用
  • 调用静态方法的格式:外部类名.内部类名.方法名();
//Outer.java
public class Outer {
	// int a=10;
	// static int b = 20;

	// 静态内部类
	static class Inter {
		public void show1() {
			System.out.println("非静态方法被调用了");
		}

		public static void show2() {
			System.out.println("静态类方法被调用了");
		}
	}
}
public class Test {
	public static void main(String[] args) {
		
		//创建静态内部类的对象
		//只要是静态的东西,都可以用类名直接获取
		Outer.Inter oi = new Outer.Inter();
		//非静态方法调用
		oi.show1();
		
		//静态方法调用
		Outer.Inter.show2();
	}
}

3.  局部内部类

  1. 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部内部类。
  2. 外界是无法直接使用,需要在方法内部创建对象并使用。
  3. 该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
public class Outer {
	// 外部类成员变量
	int b = 20;

	public void show() {

		// 局部变量
		int a = 10;

		// 局部内部类
		class Inter {
			String name;
			int age;

			public void method1() {
				System.out.println(a);
				// 访问外部类成员
				System.out.println(b);
				System.out.println("局部内部类中的method1方法");
			}
			public static void method2() {
				System.out.println("局部内部类中的method2静态方法");
			}
		}

		// 创建内部类对象
		Inter i = new Inter();
		System.out.println(i.name);
		System.out.println(i.age);
		i.method1();
		Inter.method2();
	}
}
public class Test {
	public static void main(String[] args) {
		
	//无法直接使用show方法中的局部变量a
	Outer o = new Outer();
	//报错: 此时a为成员变量a 不是局部变量a
	//需要在方法内部创建对象
	//o.a;
	
	//调用show方法
	Outer o1 = new Outer();
	o1.show();
	}
}

4. 匿名内部类

匿名内部类本质上就是隐藏了名字的内部类,可以写在成员为止,也可以写在局部位置。

  • 格式的细节:

                  包含了继承或实现,方法重写,创建对象

                   整体就是一个类的子类对象或者接口的实现类对象

  • 使用场景:

                   当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象

                   如果实现类只要使用一次,就可以用匿名类简化代码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hgngy.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值