面向对象内部类

news2024/12/23 3:48:14

概念

将一个类 A 定义在另一个类 B 里面,里面的那个类 A 就称为内部类
(InnerClass),类 B 则称为外部类(OuterClass)

在这里插入图片描述

根据内部类声明的位置(如同变量的分类),我们可以分为

请添加图片描述

特点

  1. 内部类可以直接访问外部类中的成员,包括私有成员
  2. 外部类要访问内部类的成员,必须要建立内部类的对象
  3. 在成员位置的内部类是成员内部类
  4. 在局部位置的内部类是局部内部类

3 练习 : 内部类入门案例
创建包: cn.tedu.innerclass
创建类: TestInner1.java


package cn.tedu.innerclass;
/*本类用作测试内部类的入门案例*/
public class TestInner1 {
    public static void main(String[] args) {
        //3.创建内部类对象,使用内部类的资源
        /*外部类名.内部类名 对象名 = 外部类对象.内部类对象*/
        Outer.Inner oi = new Outer().new Inner();
        oi.delete();
        System.out.println(oi.sum);
        //4.调用外部类的方法--这样是创建了一个外部类的匿名对象,只使用一次
        new Outer().find();
    }
}

//1.创建外部类 Outer
class Outer{
    //1.1创建外部类的成员变量
    String name;
    private int age;
    //1.2创建外部类的成员方法
    public void find(){
        System.out.println("Outer...find()");
        //6.测试外部类如何使用内部类的资源
        //System.out.println(sum);--不能直接使用内部类的属性
        //delete();--不能直接调用内部类的方法
        /*外部类如果想要使用内部类的资源,必须先创建内部类对象
        * 通过内部类对象来调用内部类的资源*/
        Inner in = new Inner();
        System.out.println(in.sum);
        in.delete();
    }
    //2.创建内部类Inner--类的特殊成员
    /*根据内部类位置的不同,分为:成员内部类(类里方法外)、局部内部类(方法里)*/
    class Inner{
        //2.1定义内部类的成员变量
        int sum = 10;
        //2.2定义内部类的成员方法
        public void delete(){
            System.out.println("Inner...delete()");
            //5.测试内部类是否可以使用外部类的资源
            /*结论:内部类可以直接使用外部类的资源,私有成员也可以!*/
            System.out.println(name);
            System.out.println(age);
            /*注意:此处测试完毕需要注释掉,否则来回调用
            * 会抛出异常StackOverFlowException栈溢出异常*/
            //find();
        }
    }
}

4 成员内部类
4.1 练习 : 被private修饰
创建包: cn.tedu.innerclass
创建类: TestInner2.java

package cn.tedu.innerclass;
/**本类用来测试成员内部类被private修饰*/
public class TestInner2 {
	public static void main(String[] args) {
		/**怎么使用内部类Inner2的资源?*/
		//4.创建内部类Inner2对象进行访问
		//Outer2.Inner2 oi = new Outer2().new Inner2();
		//oi.eat();
		
		/**如果Inner2被private修饰,无法直接创建对象该怎么办?*/
		//7.创建外部类对象,间接访问私有内部类资源
		new Outer2().getInner2Eat();
	}
}
//1.创建外部类Outer2
class Outer2{
	//6.提供外部类公共的方法,在方法内部创建Inner2内部类对象,调用内部类方法
	public void getInner2Eat() {
		Inner2 in = new Inner2();//外部类可以访问内部类的私有成员
		in.eat();
	}
	//2.1创建成员内部类Inner2
	/**成员内部类的位置:类里方法外*/
	//5.成员内部类,被private修饰私有化,无法被外界访问
	private class Inner2{
		//3.创建内部类的普通成员方法
		public void eat() {
			System.out.println("我是Inner2的eat()");
		}
	}
}

4.2 练习 : 被static修饰
创建包: cn.tedu.innerclass
创建类: TestInner3.java

package cn.tedu.innerclass;
/**本类用来测试成员内部类被static修饰*/
public class TestInner3 {
	public static void main(String[] args) {
		/**如何访问内部类的show()?*/
		//4.创建内部类对象访问show()
		//方式一:按照之前的方式,创建内部类对象调用show()
		//Outer3.Inner3 oi = new Outer3().new Inner3();
		//oi.show();
		//方式二:创建匿名内部类对象访问show()
		//new Outer3().new Inner3().show();
		
		/**现象:当内部类被static修饰以后,new Outer3()报错*/
		//6.用static修饰内部类以后,上面的创建语句报错,注释掉
		//通过外部类的类名创建内部类对象
		Outer3.Inner3 oi = new Outer3.Inner3();
		oi.show();
		
		//7.匿名的内部类对象调用show()
		new Outer3.Inner3().show();
		
		//9.访问静态内部类中的静态资源--链式加载
		Outer3.Inner3.show2();
	}
}

//1.创建外部类Outer3
class Outer3{
	//2.创建成员内部类Inner3
	//5.内部类被static修饰—并不常用!浪费内存!
	static class Inner3{
		//3.定义成员内部类中普通的成员方法
		public void show() {
			System.out.println("我是Inner3类的show()");
		}
		//8.定义成员内部类的静态成员方法
		static public void show2() {
			System.out.println("我是Inner3的show2()");
		}
	}
}

5 局部内部类
创建包: cn.tedu.innerclass
创建类: TestInner4.java

package cn.tedu.innerclass;
/**本类用来测试局部内部类*/
public class TestInner4 {
	public static void main(String[] args) {
		/**如何使用内部类的资源呢?
		 * 注意:直接调用外部类的show()是无法触发内部类功能的
		 * 需要再外部类中创建内部类对象并且进行调用,才能触发内部类的功能
		 * */
		//5.创建外部类对象调用show()
		//7.当在外部类show()中创建局部内部类对象并且进行功能调用后,内部类的功能才能被调用
		new Outer4().show();
	}
}
//1.创建外部类Outer4
class Outer4{
	//2.创建外部类的成员方法
	public void show() {
		//3.创建局部内部类Inner4—不太常用!!!
		/**位置:局部内部类的位置在方法里*/
		class Inner4{
			//4.创建局部内部类的普通属性与方法
			String name;
			int age;
			public void eat() {
				System.out.println("我是Inner4的eat()");
			}
		}
		/**如何使用局部内部类的资源?*/
		//6.在show()里创建内部类对象
		Inner4 in = new Inner4();
		in.eat();
		System.out.println(in.name);
		System.out.println(in.age);
	}
}


6 匿名内部类
创建包: cn.tedu.innerclass
创建类: TestInner5.java

package cn.tedu.innerclass;
/*本类用于测试匿名内部类
* 匿名内部类没有名字,通常与匿名对象结合在一起使用*/
public class TestInner5 {
    public static void main(String[] args) {
        //传统方式:创建接口的实现类+实现类实现接口中的抽象方法+创建实现类对象+通过对象调用方法
        //3.创建接口一对应的匿名对象与匿名内部类,并调用实现了的方法save()
        new Inter1(){
            @Override
            public void save() {
                System.out.println("save()...");
            }
            @Override
            public void get() { }
        }.save();

        //5.创建抽象类对应的匿名对象与匿名内部类
        new Inter2(){
            @Override
            public void drink() {
                System.out.println("一人饮酒醉");
            }
        }.drink();
        //7.调用普通类的功能怎么调用?创建匿名对象直接调用
        new Inter3().powerUp();
        new Inter3().powerUp();//new了2次,所以是两个匿名对象
        /*如果想要多次使用实现后的功能,还是要创建普通的对象
        * 匿名对象只能使用一次,一次只能调用一个功能
        * 匿名内部类其实就充当了实现类的角色,去实现未实现的抽象方法,只是没有名字而已*/
        Inter3 in = new Inter3();
        in.study();
        in.study();
        in.study();
        in.study();
        in.study();
        in.study();

    }
}

//1.创建接口
interface Inter1{
    //2.定义接口中的抽象方法
    void save();
    void get();
}
//4.创建抽象类
abstract class Inter2{
    public void play(){
        System.out.println("Inter2...play()");
    }
    abstract public void drink();
}
//6.创建普通类
class Inter3{
    public void study(){
        System.out.println("什么都阻挡不了我想学习赚钱的决心");
    }
    public void powerUp(){
        System.out.println("我们会越来越强的!");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

首次使用云服务器搭建网站(二)

书接上文,我们已经完成了服务器的租赁,宝塔面板的下载与安装。 接下来我们将正式开始网站搭建。 一、网站创建 点击网站、添加站点 输入网站域名、数据库选择MySQL数据库,选择utf8,数据库账号密码会自动生成。无论你要创建什么样…

【linux网络配置】多个网卡一起使用,一个网卡连内网,一个网卡连外网

一、问题背景 因为有一个工作站在内网中,但是没有办法联网(校园网账户有限)。 虽然工作站没有联网,但是我仍然可以通过局域网远程控制工作站,使其访问校园网验证页面实现上网。 当给工作站安装软件或依赖项时&#…

SpringBoot配置文件application.properties的理解

一、存放位置分类 1.当前项目根目录下的config目录下 2.当前项目的根目录下 3.resources目录下的config目录下 4.resources目录下 按照这上面的顺序,4个配置文件的优先级依次降低。 我们在项目里面4个位置分别设置了各种的application.properties文件。每个文件…

MySQL查看和修改最大连接数

标题:MySQL查看和修改最大连接数 MySQL 是一种广泛使用的开源关系型数据库管理系统,被许多应用程序用作其后端存储解决方案。在高并发的环境下,MySQL 的最大连接数变得尤为重要。本文将介绍如何查看当前的最大连接数,并详细说明每…

安卓实战开发之——使用 WIFI 进行设备搜索并获取相应信息

目录 一、前言 二、准备条件 三、功能要求 四、显示效果 五、关键代码 一、前言 此玩意是本人很早很早(记不清有多早了,反正很早)做过的一个课程任务了,无意之中翻到了,所以把它放上来。不愿再找以前写的代码了…

大数据环境搭建 Hadoop+Hive+Flume+Sqoop+Azkaban

目录 零:版本说明一、安装CentOS二、Hadoop单机配置三、Hive安装部署 零:版本说明 Hadoop:3.1.0 CentOS:7.6 JDK:1.8 一、安装CentOS 这里网上教程很多,就不贴图了 【内存可以尽量大一些,不然…

DeepBIO:一个自动化和可解释的深度学习平台,用于高通量生物序列预测,功能注释和可视化分析

DeepBIO: an automated and interpretable deep-learning platform for high-throughput biological sequence prediction, functional annotation and visualization analysis 期刊:Nucleic Acids Research 中科院分区:2区 影像因子:19.1…

面向对象抽象

抽象类 1 概念 Java中可以定义被abstract关键字修饰的方法,这种方法只有声明,没有方法体,叫做抽象方法. Java中可以定义被abstract关键字修饰的类,被abstract关键字修饰的类叫做抽象类 如果一个类含有抽象方法,那么它一定是抽象类 抽象类中的方法实现交给子类来完成 2 抽象…

redisTemplate海量数据批量存储

有个表的数据需初始化到redis, 目前18w, 后期会达到千万1. 使用redisTemplate批量存储数据 Autowiredprivate RedisTemplate redisTemplate;public void init(){List<WxPois> list SpringUtils.getBean(WxPoisMapper.class).selectWxPoisList(new WxPois());if (Collect…

华为OD机试之数组拼接(Java源码)

数组拼接 题目描述 现在有多组整数数组&#xff0c;需要将它们合并成一个新的数组。 合并规则&#xff0c;从每个数组里按顺序取出固定长度的内容合并到新的数组中&#xff0c;取完的内容会删除掉&#xff0c;如果该行不足固定长度或者已经为空&#xff0c;则直接取出剩余部…

APP、Web自动化测试面试题

App/Web自动化的面试题 备注&#xff1a;一般面试的时候是结合简历上的项目一步一步深入进行问的问题&#xff0c;只要你实际做过一个项目的&#xff0c;加上自己面试准备下&#xff0c;问题不会太大 【APP自动化问题&#xff1a;1.3.6.10.11.12.13.14.19】 【Web自动化问题&…

意向共享锁和意向排他锁

InnoDB表级锁 在绝大部分情况下都应该使用行锁&#xff0c;因为事务和行锁往往是选择InnoDB的理由&#xff0c;但个别情况下也使用表级锁&#xff1a; 1&#xff09;事务需要更新大部分或全部数据&#xff0c;表又比较大&#xff0c;如果使用默认的行锁&#xff0c;不仅这个事…

【Android开发基础】蓝牙信息的获取(Bluetooth)

文章目录 一、引言二、操作1、权限2、开启蓝牙3、可检测4、搜索蓝牙5、广播 三、附件1、UI界面设计2、总代码 一、引言 描述&#xff1a;蓝牙技术是一种无线数据和语音通信开放的全球规范&#xff0c;它是基于低成本的近距离无线连接&#xff0c;为固定和移动设备建立通信环境…

华为OD机试真题 JavaScript 实现【知识图谱新词挖掘1】【2023Q1 100分】

一、题目描述 小华负责公司知识图谱产品&#xff0c;现在要通过新词挖掘完善知识图谱。 新词挖掘: 给出一个待挖掘文本内容字符串Content和一个词的字符串word&#xff0c;找到content中所有word的新词。 新词&#xff1a;使用词word的字符排列形成的字符串。 请帮小华实现新词…

cesium学习(相机)

飞到一个地方 如果你知道位置的经纬度和高度&#xff0c;你可以使用相机的flyTo功能直接飞到CesiumJS中的那个位置。 viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0), });更改相机的方向 flyTo要在完成后更改相机的方向&#x…

一、网络协议和常用的网络工具

文章目录 1.计算机概论1.1 计算机网络是什么&#xff1f;1.2 计算机网络的层次结构 2.TCP/IP详解2.1 TCP/IP协议族2.2 网络传输中的数据2.3 网路通信中的地址和端口号2.4 TCP三次握手建立连接2.5 TCP四次挥手建立连接 3.网络工具Wireshark和tcpdump4.一次完整的Http请求过程 1.…

Live Demo精彩大放送,演绎openGauss技术创新

技术是开源社区的根基&#xff0c;创新是推动技术发展的源动力。openGauss开源三周年&#xff0c;携手开发者、社区伙伴、用户&#xff0c;持续聚焦内核竞争力、用户场景架构创新、完善周边生态工具。5月26日&#xff0c;openGauss Developer Day 2023 主论坛现场&#xff0c;1…

自定义包含天时分的时长选择器组件

场景&#xff1a;项目是reactantd 实现的。如果传感器超过3天4小时没有上报数据&#xff0c;则认为设备已经坏了&#xff0c;需要发出告警。 3天4小时这是由用户在前端页面输入的&#xff0c;因此需要有一个时长选择器。antd 原生的TimePicker 组件只能实现选择 时、分、秒&…

(Qt)day4

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QDebug> #include <QMainWindow> #include <QMessageBox> #include <QTimer> //定时器类头文件 #include <QTime> //时间类的头文件 #include <QTimerEvent> //定时器…

k8s的service资源类型有ClusterIP、Nodeport、ExternalName、LoadBalancer、Headless(None)

1. ClusterIP 是什么 ClusterIP 是在所有节点内生成一个虚拟IP&#xff0c;为一组pod提供统一的接入点&#xff0c;当service存在时&#xff0c;它的IP地址和端口不会发生改变&#xff0c;客户端通过service的ip和端口建立连接&#xff0c;由service将连接路由到该服务的任意一…