前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【14】JAVASE-面向对象-内部类【从零开始学JAVA】

【14】JAVASE-面向对象-内部类【从零开始学JAVA】

作者头像
用户4919348
发布2024-05-25 14:04:55
470
发布2024-05-25 14:04:55
举报
文章被收录于专栏:波波烤鸭波波烤鸭

Java零基础系列课程-JavaSE基础篇

Lecture:波哥

Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。

八、 内部类

1.内部类的相关概念

​ 将类定义在类的内部,那么该类就称为内部类

注意:内部类是一个相对的概念,如果Outter类中有一个类Inner类,那么Otter类相对于Inner类来说就外部类,而Inner相对于Outter来说就是内部类

Java中不能被实例化的类型有哪些?

  1. 抽象类
  2. 接口
  3. 所有的构造方法都被private修饰的类型
  4. 内部类不能被外界直接实例化

为什么要使用内部类?

提高类的安全性

2. 内部类的特点

  1. 内部类可以直接访问外部类的所有的成员(变量和方法)
  2. 外部类如果要访问内部类成员,必须创建内部类对象来实现
  3. 内部类编译后的class文件命名有别于普通类:外部类
内部类.class Outter

Inner.class

  1. 要访问内部类的成员是非常麻烦的,而且造成程序耦合性增强,可读性降低,所以内部类慎用

3.内部类的分类

3.1 成员内部类

我们在外部类中定义一个成员内部类,这个内部类和成员变量成员方法是同级的

3.1.1 如何在外部获取内部类对象

内部类非私有

​ 因为内部类非私有,所以我们可以通过如下的格式直接获取内部类的对象

代码语言:javascript
复制
外部类.内部类 变量名称 = 外部类对象.内部类对象;

内部类私有

​ 内部类作为外部类的成员,那么是可以用 private 来修饰的,既然用 private修饰那也就意味着外界是没办法直接获取该对象的,同时我们也没法通过相关的类型来接收,但是我们可以在外部类中提供相关的getter/setter方法来处理。

代码语言:javascript
复制
package com.bobo.oop12;

public class OOPDemo01 {

	public static void main(String[] args) {
		// 我们在外部如何获取内部类的对象
		/*Outter.Inner in = new Outter().new Inner();
		in.show();*/
		
		Outter out = new Outter();
		System.out.println(out.getName());
		
		out.setInner();
		System.out.println(out.getInner());
		// 可以获取内部类对象  但是没法用变量来接收,没法访问相关的属性和方法
		out.getInner();
	}

}

class Outter{
	
	private String name = "张三";
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	/**
	 * 这个内部类是外部类的一个成员
	 * @author dpb
	 *
	 */
	private class Inner{
		
		public void show(){
			System.out.println("show ... " + name);
		}
	}
	
	public void setInner(){
		Inner in = new Inner();
		in.show();
	}
	
	public Inner getInner(){
		Inner in = new Inner();
		return in;
	}
	
	void info(){
		
	}
	
	
}
3.1.2 变量名相同的情况

当外部类成员变量和内部类成员变量及内部类方法中的局部变量同名的情况下怎么处理

在这种情况下获取外部类中的成员变量的方式

代码语言:javascript
复制
外部类名.this.变量名
3.2 局部内部类

成员内部类我可以理解为和成员变量同级,那么局部内部类我们也可以理解为和局部变量同级的内部类

代码语言:javascript
复制
package com.bobo.oop13;

public class OOPDemo02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Outter02 out = new Outter02();
		out.show();
	}

}

class Outter02{
	
	int num1 = 20;
	
	/**
	 * 在JDK1.8之后 把局部内部类中使用的外部方法的局部变量默认的提升为 final
	 * 在JDK1.8之前 这里会强制要求我们将 局部变量声明为final类型
	 */
	public void show(){
		 int num  = 30;
		
		// 定义一个局部内部类
		class Inner{
			public void info(){
				System.out.println("inner info ..." + num);
			}
		}
		// 我们要使用内部类对象 调用其中的方法才会执行
		Inner in = new Inner();
		// num = 50;
		in.info();
		System.out.println(num);
	}
}
3.3 静态内部类

​ 被static修饰的成员内部类我们称为静态内部类。

获取内部类实例的语法格式:

代码语言:javascript
复制
外部类.内部类 变量名称 = new 外部类.内部类();
代码语言:javascript
复制
package com.bobo.oop14;

public class OOPDemo01 {

	public static void main(String[] args) {
		// 1.获取外部内对象
		Outter out = new Outter();
		//out.show();
		// 2.获取静态内部类对象
		// Outter.Inner in = new Outter().new Inner();
		// Outter.Inner in = Outter.(new Inner());
		Outter.Inner in = new Outter.Inner();
		Outter.name = "";
		Outter.show();

	}

}

class Outter{
	
	public static String name = "张三";
	
	public static void show(){
		System.out.println(name);
	}
	
	/**
	 * 定义的一个静态内部类
	 * @author dpb
	 *
	 */
	static class Inner{
		public static String name="李四";
		
		public int age = 20;
		
		public void info1(){
			System.out.println(age);
		}
		
		public static void info2(){
			System.out.println("内部类:" + name);
		}
	}
	
}

静态内部类相比于成员内部类来说简化了方法方式,好处同样的提高了类型的安全性。

静态内部类的特点:

  1. 本身还是一个class,所以内部成员和普通类没区别
  2. 静态内部类不能获取外部类中的非静态的属性和方法
  3. 在外部内中要获取内部类对象直接实例化即可

如果要获取静态内部类中的静态方法或者属性的话可以通过如下方式获取

代码语言:javascript
复制
外部类名称.内部类名称.静态方法();
外部类名称.内部类名称.静态变量;
3.4 匿名内部类

没有名称的内部类我们称为匿名内部类。如果一个内部类在整个操作中只使用了一次的话,那就可以定义为匿名内部类。

没有使用匿名内部类的情况

代码语言:javascript
复制
package com.bobo.oop15;

public class OOPDemo01 {

	public static void main(String[] args) {
		new X().fun2();

	}

}

interface Person{
	void sleep();
}

class User implements Person{

	@Override
	public void sleep() {
		System.out.println("睡觉真舒服啊....");
		
	}
	
}

class X {
	void fun1(Person p){
		p.sleep();
	}
	
	void fun2(){
		this.fun1(new User());
	}
}

使用匿名内部类的情况

代码语言:javascript
复制
package com.bobo.oop16;

public class OOPDemo01 {

	public static void main(String[] args) {
		new X().fun2();

	}

}

interface Person{
	void sleep();
}

/*class User implements Person{

	@Override
	public void sleep() {
		System.out.println("睡觉真舒服啊....");
		
	}
	
}*/

class X {
	void fun1(Person p){
		p.sleep();
	}
	
	void fun2(){
		this.fun1(new Person(){

			@Override
			public void sleep() {
				System.out.println("AAAAAA....");
			}
			
		});
	}
}

匿名内部是Java为了方便我们编写程序而设计的一种机制,因为有时候有的内部类之需要创建一个对象就可以了,这时候匿名内部类就比较合适好,匿名内部类一般都是和接口及抽象类关联的

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java零基础系列课程-JavaSE基础篇
  • 八、 内部类
    • 1.内部类的相关概念
      • 2. 内部类的特点
        • 3.内部类的分类
          • 3.1 成员内部类
          • 3.2 局部内部类
          • 3.3 静态内部类
          • 3.4 匿名内部类
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档