13.Java面向对象----嵌套类

news2024/10/6 20:28:43

Java面向对象—嵌套类、内部类、匿名类

一、static静态

在《Java编程思想》有这样一段话:
  “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”
  这段话说明了static方法的特殊之处,也看出static关键字的基本作用,简而言之,一句话来描述就是:
  方便在没有创建对象的情况下来进行调用(方法/变量)。
很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。

  1. static修饰的变量:在我们平时的使用当中,static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,我们通常将用static修饰的成员称为类成员或者静态成员。注意,static只能修饰成员变量,不可以修饰局部变量。
	public String name;
	
	public static int age;

		Student s=new Student();
		s.name="张三";
		s.age=12;
		
		Student s1=new Student();
		s1.name="李四";
		s1.age=15;
		
		System.out.println(s.name+"今年"+s.age+"岁了");
		System.out.println(s1.name+"今年"+s1.age+"岁了");

在这里插入图片描述

量为静态变量时,那么它的值是存储在内存的静态区中,所以赋值时会变成一个值。

  1. static修饰的方法:static的另一个作用,就是修饰成员方法。static修饰成员方法最大的作用,就是可以使用"类名.方法名"的方式操作方法,避免了先要new出对象的繁琐和资源消耗,我们可能会经常在帮助类或工具类中看到它的使用。
	public static void say() {
		System.out.println("我是一名学生");
	}

	Student.say();

在这里插入图片描述
静态方法时,那么它可以直接使用类名获取方法,main方法是我们常见的静态方法。

二、嵌套类

在 Java 语言中允许在另外一个类中定义一个类,这样的类被称为嵌套类。包含嵌套类的类称为外部类,也可以叫做封闭类,在本文中统一叫做外部类。

//学生类
public class Student {
	
	//优等生类
	class kind{
		
	}

}

嵌套类分为两类:

  • 静态嵌套类:使用static声明,一般称为嵌套类。
  • 非静态嵌套类:非static声明,一般称为内部类。
//学生类
public class Student {
	
	public String name;
	public static int age;
	//优等生类
	static class kind{
		String techang;
	}
	//普通生类
	class weak{
		String youdian;
	}

}

		Student.kind k=new Student.kind();
		k.techang="唱歌";
		System.out.println(k.techang);

嵌套类是它的外部类的成员,非静态嵌套类(内部类)可以访问外部类的其他成员,即使该成员是私有的。而静态嵌套类只能访问外部类的静态成员。

嵌套类作为外部类的一个成员,可以被声明为:private,public,protected或者包范围(注意:外部类只能被声明为public或者包范围)。

嵌套类特点:

  • 嵌套类可以访问外部类的所有数据成员和方法,即使它是私有的。
  • 提高可读性和可维护性:因为如果一个类只对另外一个类可用,那么将它们放在一起,这更便于理解和维护。
  • 提高封装性:给定两个类A和B,如果需要访问A类中的私有成员,则可以将B类封装在A类中,这样不仅可以使得B类可以访问A类中的私有成员,并且可以在外部隐藏B类本身。
  • 减少代码的编写量。

1、静态嵌套类
静态嵌套类其实就是在顶级类中封装的一个顶级类,它的行为和顶级类一样,它被封装在顶级类中其实就是为了方便打包。

  • 静态嵌套类是外部类的静态成员,它可以直接使用外部类名.静态嵌套类名访问自身。
  • 它可以访问外部类的静态成员和静态私有成员。
  • 与其他类一样,静态嵌套类不能访问非静态成员。
//学生类
public class Student {
	
	public String name;
	public static int age=12;
	//优等生类
	static class kind{
		String techang;
		static void say() {
			System.out.println(age);
		}
	}
	//普通生类
	class weak{
		String youdian;
	}

}

Student.kind.say();

2、非静态嵌套类
非静态嵌套类也就是内部类,它有以下几个特点:

  • 实例化内部类必须先实例化一个外部类。
  • 内部类实例与外部类实例相关联,所有不能在内部类中定义任何静态成员。
  • 内部类是非静态的。
  • 非静态嵌套类包括:成员内部类、局部内部类、匿名内部类

成员内部类:
在外部类中并且在外部类的方法外创建的非静态嵌套类,称为成员内部类。说白了成员内部类就是外部类的一个非静态成员而已。
创建成员内部类的实例,你必须先实例化一个外部类,接着,通过外部类的实例来创建成员内部类的实例。因此成员内部类的实例必须存在于一个外部类的实例中。另外,由于内部类的实例与外部类的实例相关联,因此它不能定义任何静态成员。

局部内部类:
局部内部类(Local inner class)通常定义在一个块中。所以通常你会在一个方法块中找到局部内部类。正如局部变量那样,局部内部类的作用域受到方法的限制。它可以访问外部类的所有成员,和它所在的局部方法中所有局部变量。如果你想调用局部内部类中的方法,你必须先在局部方法中实例化局部内部类。

局部内部类限制:

  • 无法从方法外部调用局部内部类
  • 局部内部类不能被声明为private, public, protected
  • 在JDK1.7之前局部内部类不能访问非final的局部变量,但是在JDK1.8及之后是可以访问非final的局部变量的。

匿名内部类:
匿名内部类,可以理解为不需要声明类的对象,直接使用类的内容。
在使用匿名内部类的过程中,我们需要注意如下几点:

  • 使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
  • 匿名内部类中是不能定义构造函数的。
  • 匿名内部类中不能存在任何的静态成员变量和静态方法。
  • 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
  • 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

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

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

相关文章

计及需求侧响应日前、日内两阶段鲁棒备用优化【IEEE6节点】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

3.3 二维随机变量条件分布

学习目标: 要学习二维随机变量的条件分布,我可能会采取以下步骤: 复习边缘分布和联合分布:首先需要了解二维随机变量的边缘分布和联合分布的概念以及相应的公式。 复习条件概率:学习条件概率的定义和计算公式&#x…

Java使用elasticjob实现定时任务(v2.1.5)

elastic是一个定时任务库 https://shardingsphere.apache.org/elasticjob/index_zh.html 项目结构 ​依赖 <dependency><groupId>com.dangdang</groupId><artifactId>elastic-job-lite-core</artifactId><version>2.1.5</version>&…

【linux】——进程和计划任务管理

文章目录1.进程 VS 线程1.1 程序和进程的关系1.2 线程1.3 进程和线程的关系2.查看进程2.1 查看进程信息ps2.2 查看进程信息top2.3 查看进程信息pgrep2.4 查看进程树pstree3.控制进程3.1 进程的启动方式3.2 进程的前后台调度3.3 终止进程的运行kill3.4 终止进程的运行pkill4.计划…

【华为OD机试】1039 - 迷宫问题

文章目录一、题目&#x1f538;题目描述&#x1f538;输入输出&#x1f538;样例1&#x1f538;样例2二、代码参考作者&#xff1a;KJ.JK&#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &am…

CASA(Carnegie-Ames-Stanford Approach)模型应用

植被作为陆地生态系统的重要组成部分对于生态环境功能的维持具有关键作用。植被净初级生产力&#xff08;Net Primary Productivity, NPP&#xff09;是指单位面积上绿色植被在单位时间内由光合作用生产的有机质总量扣除自养呼吸的剩余部分。植被NPP是表征陆地生态系统功能及可…

全网最详细,Jmeter性能测试-性能基础详解,控制器不同选择(四)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 逻辑控制器 提前说…

机器学习实战:Python基于支持向量机SVM-RFE进行分类预测(三)

文章目录1 前言1.1 支持向量机的介绍1.2 支持向量机的应用2 demo数据集演示2.1 导入函数2.2 构建数据集拟合2.3 预测模型及可视化3 实例演示分类&#xff08;非SVM&#xff09;3.1 导入函数和数据3.2 简单线性分类3.3 最大间隔决定分类4 实例演示分类&#xff08;SVM&#xff0…

面试之Java的SPI机制详细讲解你会吗?

很多小伙伴对SPi不是很熟悉&#xff0c;今天我给大家详细讲解分享下&#xff1a; Java之SPI机制详细目录 1: SPI机制简介 2: SPI原理 3: 使用场景 4: 源码论证 5: 实战 6: 优缺点 6.1 优点 6.2 缺点 Java之SPI机制详解 1: SPI机制简介 SPI 全称是 Service Provider Interface…

Django整合mysqlclinet步骤

准备工作 要在 Django 中使用 MySQL 数据库&#xff0c;您需要完成以下步骤&#xff1a; 安装 MySQL 服务器和客户端。你可以从官方网站下载并安装&#xff1a;https://www.mysql.com/downloads/ 安装 mysqlclient。mysqlclient 是一个 Python 的第三方库&#xff0c;用于连接…

chapter-7数据库事务

以下课程来源于MOOC学习—原课程请见&#xff1a;数据库原理与应用 考研复习 DBMS保证系统中一切事务的原子性、一致性、隔离性和持续性 DBMS必须对事务故障、系统故障和介质故障进行恢复 恢复中最经常使用的技术&#xff1a;数据库转储和登记日志文件 恢复的基本原理&#…

十二、网络规划与设计

&#xff08;一&#xff09;网络设计基础 1、网络系统生命周期 &#xff08;1&#xff09;四阶段周期&#xff08;重叠&#xff09; 构思与规划阶段、分析与设计阶段、实施与构建阶段、运行与维护阶段 特点&#xff1a;能够快速适应新的需求变化&#xff0c;成本低&#xf…

【SQL 初阶教程】一文轻松玩转 SQL

目录 一、SQL 通用语法 二、SQL 语句的分类 三、DDL语句 DDL——数据库操作 查询所有数据库 语句&#xff1a; SHOW DATABASES;&#xff08;大小写均可&#xff0c;建议大写&#xff09; 创建数据库HSK 语句&#xff1a;CREATE DATABASE HSK; 删除数据库HSK 语句 &#…

关于本地git通过ssh链接github时 time out问题的解决方法

目录问题描述解决方法问题描述 我们如果想要用git ssh链接到远端github&#xff0c;进行repo的clone等操作时&#xff0c;会进行如下的操作&#xff1a; 首先在ssh端命令生成rsa秘钥&#xff0c;命令如下&#xff1a; ssh-keygen -t rsa -C “你的git绑定的邮箱名字”然后在g…

【HBase-读写流程】HBase的读写流程与内部执行机制

【HBase-读写流程】HBase的读写流程与内部执行机制1&#xff09;HBase 读取数据流程1.1.文字描述1.2.流程图2&#xff09;HBase 写入数据流程2.1.文字描述2.2.流程图3&#xff09;flush 机制与 compact 机制的原理3.1.文字描述3.2.流程图1&#xff09;HBase 读取数据流程 1.1.…

游戏开发之Unity2021URP项目场景的构建

地面的修改和编辑&#xff1a;地面插件的使用 打开包管理器&#xff0c;在左边的包那里选择“Unity注册表”&#xff0c;在右边进行搜索“Polybrush”&#xff0c;之后选择右下角的安装 安装完之后要选择样本中的URP进行导入&#xff0c;因为我们的项目是URP渲染管线的&#x…

IronOCR for .NET crack,IronOCR的独特功能

IronOCR for .NET crack,IronOCR的独特功能  在IronTesseract上添加了新的“ReadPdfAndOverlayText”方法&#xff0c;该方法允许您添加文本并保留原始PDF书签/注释。 添加了对存储在应用程序子文件夹中的.config和.json文件中的许可证密钥的支持。 将IronSoftware.System.Dra…

shell 函数和数组作业

1、编写函数&#xff0c;实现打印绿色OK和红色FAILED,判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED 2、编写函数&#xff0c;实现判断是否无位置参数&#xff0c;如无参数&#xff0c;提示错误 3、编写函数实现两个数字做为参数&#xff0c;返回最大值 4、…

Minecraft 1.12.2模组开发(五十六) 网络(Networking)

我们本次在模组中实现客户端向服务器发送数据的功能。 演示效果演示效果演示效果 1.新建packet包&#xff0c;包中新建PacketHandler类&#xff1a; PacketHandler.java package com.joy187.mcjoygun.packet;import com.joy187.mcjoygun.Main; import com.joy187.mcjoygun.u…

Huggingface微调BART的代码示例:WMT16数据集训练新的标记进行翻译

BART模型是用来预训练seq-to-seq模型的降噪自动编码器&#xff08;autoencoder&#xff09;。它是一个序列到序列的模型&#xff0c;具有对损坏文本的双向编码器和一个从左到右的自回归解码器&#xff0c;所以它可以完美的执行翻译任务。 如果你想在翻译任务上测试一个新的体系…