十分钟“手撕”内部类+static在内部类的使用

前言:

由于写内部类代码中运用了很多static的知识,所以在代码中书写了大量通俗易懂的关于static使用方法,以及为什么会报错,该怎么调整。耐心看完不仅能熟悉内部类,还会对static有不一样的收获。

一、什么是内部类

内部类 就是 写在外部类内的类。

比如:下列代码中,OutClass是外部类,InnerClass是内部类。

public class OutClass {
// 成员位置定义:未被static修饰 --->实例内部类public class InnerClass1{}
// 成员位置定义:被static修饰 ---> 静态内部类static class InnerClass2{}
public void method(){
// 方法中也可以定义内部类 ---> 局部内部类:几乎不用class InnerClass5{}
}
}

1. 成员内部类(普通内部类:未被static修饰的成员内部类 和 静态内部类:被static修饰的成员内部类)

2. 局部内部类(不谈修饰符)、匿名内部类 

二、实例内部类

 定义:未被static修饰的成员内部类。

package demo;class OutClass{public int data1=1;private int data2=2;public static int data3=3;class InnerClass{public int data1=100;public int data4=4;private int data5=5;public static int data6=6;public void test(){System.out.println("InnerClass.test()");/*同个类(OutClass)里面,static修饰的变量可以使用,同时private修饰的也可以使用。*//*若外部类与内部类有同名的,则优先访问内部(就近原则)如果非要访问外部类,则添加-》外部类名.this.*/System.out.println("外部类data1:"+OutClass.this.data1);System.out.println(data2);System.out.println(data3);System.out.println(data4);System.out.println(data5);System.out.println(data6);}}
}public class Test {public static void main(String[] args) {OutClass out=new OutClass();/* InnerClass可以理解为OutClass里面的一个成员属性,和data1同一个级别,需要通过外部类类型调用内部类类型这是实例内部类,所以需要通过外部类对象out来new一个内部类对象*/OutClass.InnerClass innerClass= out.new InnerClass();innerClass.test();/* Test和OutClass(InnerClass)是不同的类,而且main方法也是由static修饰的,所以非static和private类权限修饰的变量或方法不能访问。*/System.out.println(out.data1);System.out.println(out.data2);//报错System.out.println(out.data3);System.out.println(innerClass.data4);System.out.println(innerClass.data5);//报错System.out.println(innerClass.data6);}
}

 【注意事项】

1. 外部类中的任何成员都可以在实例内部类方法中直接访问

2. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束

3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员来访问

4. 实例内部类对象必须在先有外部类对象前提下才能创建

5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用

6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。

三、静态内部类

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

package demo2;class OutClass{public int data1=1;private int data2=2;public static int data3=3;static class InnerClass{public int data4=4;private int data5=5;public static int data6=6;public void test(){System.out.println("InnerClass.test()");/*由于InnerClass是static修饰的,所以data1不能被访问若要访问,在main方法里面访问*///System.out.println(data1);/* static修饰的类不能访问非static修饰的,因为内部类是静态的,外部类是非静态的,两者不能访问,所以不能访问data2 */System.out.println(data2);//报错System.out.println(data3);System.out.println(data4);System.out.println(data5);System.out.println(data6);}}
}
public class Test {public static void main(String[] args) {OutClass.InnerClass innerClass=new OutClass.InnerClass();innerClass.test();//在main方法访问data1,实例化外部类OutClassOutClass outClass=new OutClass();System.out.println(outClass.data1);}
}

 【注意事项】

1. 在静态内部类中只能访问外部类中的静态成员

如果确实想访问,我们该如何做?

答:在main方法书写,详细看上述代码,

2. 创建静态内部类对象时,不需要先创建外部类对象(所以用的比实例代码块多)

四、局部内部类

public class OutClass {int a = 10;
public void method(){int b = 10;
// 局部内部类:定义在方法体内部
// 不能被public、static等访问限定符修饰
class InnerClass{
public void methodInnerClass(){System.out.println(a);System.out.println(b);
}
}
// 只能在该方法体内部使用,其他位置都不能用InnerClass innerClass = new InnerClass();innerClass.methodInnerClass();
}
public static void main(String[] args) {// OutClass.InnerClass innerClass = null; 编译失败
}
}

 【注意事项】

1. 局部内部类只能在所定义的方法体内部使用

2. 不能被public、static等修饰符修饰

3. 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class

4. 几乎不会使用

五、 匿名内部类

不需要接收new出来的对象的内部类

package demo3;import java.util.Objects;class OutClass{public int data1=1;private int data2=2;public static int data3=3;public void test(){System.out.println("OutClass.test()");}}public class Test {public static void main(String[] args) {OutClass outClass=new OutClass();System.out.println(outClass.data1);outClass.test();/* 匿名内部类:没有对象来接收,只能只用一次,相当于一次性 */System.out.println(new OutClass().data1);new OutClass().test();}}

同时:局部内部类也可以运用在接口上面

package demo3;interface ITestable{void test();
}public class Test {public static void main(String[] args) {/*相当于一个类实现了这个接口,并重写了test方法这里没有对象接收,并不算实例化,接口不能实例化*/new ITestable() {@Overridepublic void test() {System.out.println("匿名内部类test()");}}.test();}
}

 又或者可以这样写:(test()运用了动态绑定)

package demo3;interface ITestable{void test();
}public class Test {public static void main(String[] args) {ITestable it=new ITestable() {@Overridepublic void test() {System.out.println("test()..");}};it.test();}
}

若想要根据原理也可以:(test()用到了动态绑定)

package demo3;interface ITestable{void test();
}class ITE implements ITestable{@Overridepublic void test() {System.out.println("test()..");}
}
public class Test2 {public static void main(String[] args) {ITestable it=new ITE();it.test();}
}

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

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

相关文章

CentOS 8.5 安装配置 Tinyproxy 轻量代理服务器 Windows10 系统设置http代理 详细教程

1 下载 下载地址 2 上传服务器并解压 tar zxvf tinyproxy-1.11.2.tar.gz 3 安装配置 #安装依赖软件 yum install automake cd tinyproxy-1.11.2/ #生成configure ./autogen.sh # ./configure --prefix/usr/local/tinyproxy make make install 4 配置环境 vim /etc/prof…

【LAMMPS学习】八、基础知识(6.4)Moltemplate​​​​​​​教程

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各种模拟。 …

Excel快速填充序号的方法

Excel快速填充序号常用的方法。 方法一:填充前面序号后拖拽 特点: 能有规律的填充,排序的行数由拖拽的行数决定。 此方法填充的序号等效于手打的序号,删除一行后下一行不会自动更新排序。 步骤:输入两个初始序号&…

Python | Leetcode Python题解之第83题删除排序链表中的重复元素

题目: 题解: class Solution:def deleteDuplicates(self, head: ListNode) -> ListNode:if not head:return headcur headwhile cur.next:if cur.val cur.next.val:cur.next cur.next.nextelse:cur cur.nextreturn head

matlab使用教程(69)—创建包含多个 x 轴和 y 轴的图

此示例说明如何创建这样一张图,通过坐标区底部和左侧的轴放置第一个绘图,并通过坐标区顶部和右侧的轴放置第二个绘图。 使用 line 函数绘制一个红色线条。将 x 轴和 y 轴的轴线颜色设置为红色。 注意:从 R2014b 开始,您可以使用圆…

判断某地址是否为合法的PCIE BAR空间地址

判断某地址是否为合法的PCIE BAR空间地址 一.生成BAR空间范围表二.判断脚本三.测试 以下脚本用来判断某地址是否为合法的PCIE BAR空间地址 一.生成BAR空间范围表 lspci -d:0100 -vv | grep "Region 0:" | gawk --non-decimal-data {A"0x"$5;B0x200000;pr…

基于Python+Django+MySQL实现Web版的增删改查

Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能,旨在快速入门Python Web。 开发环境 开发工具:Pycharm 2020.1开发语言:Python 3.8.0Web框架:Django 3.0.6数据库:…

讲讲C++四种类型转换

在C中,类型转换(或称为类型转换运算符)是用来将一个数据类型转换为另一个数据类型的机制。C提供了四种类型转换:静态类型转换(Static Cast)、动态类型转换(Dynamic Cast)、重新解释类…

auto->decltype

auto c11标准才有的,c14丰富了很多这个相关的用法 声明变量别用auto,auto是让编辑器来自己推断,很影响运行效率 #include<iostream> using namespace std;auto ave(int a, int b) {return a b; }int main() {cout << typeid(ave(1, 2)).name()<<endl;ret…

Colab/PyTorch - 003 Transfer Learning For Image Classification

Colab/PyTorch - 003 Transfer Learning For Image Classification 1. 源由2. 迁移学习(ResNet50)2.1 数据集准备2.2 数据增强2.3 数据加载2.4 迁移学习2.5 数据集训练&验证2.6 模型推理 3. 总结4. 参考资料 1. 源由 迁移学习已经彻底改变了 PyTorch 中处理图像分类的方式…

基于PSO粒子群优化的PV光伏发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 粒子群优化算法基础 4.2 PV系统及其最大功率点跟踪 4.3 PSO在PV MPPT中的应用 5.完整工程文件 1.课题概述 基于PSO粒子群优化的PV光伏发电系统simulink建模与仿真。通过PSO粒子群优化进行最大功率…

电影院购票管理系统

文章目录 电影院购票管理系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 电影院购票管理系统 一、项目演示 电影院售票管理系统 二、项目介绍 基于springbootvue的前后端分离电影院购票管理…

开发利器 - docker 安装运行 mysql

本文选择安装的mysql版本为5.7 &#xff0c;安装环境 mac 1、查看镜像是否存在 docker search mysql:5.7 2、拉取镜像 docker pull mysql:5.7 3、运行镜像 docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot1234 -d mysql:5.7 --name&#xff1a;指定容器…

淘宝买的知识付费系统,在线教育电销怎么做你知道吗?

在线教育行业的销售推销的产品其实就是课程&#xff0c;只不过变成了一种虚拟产品&#xff0c;在线教育的销售一般有课程销售、平台搭建销售&#xff0c;还有就是老师其实也是一种销售&#xff0c;这几个里面最容易上手的就是课程销售了&#xff0c;课程销售一般采用电话销售方…

【UniApp踩坑记录】在subNvue页面中使用Map,添加marker后不显示

一、背景 最近将一个小程序项目转化为 APP&#xff0c;想着正好体验一下 uniapp 宣称的一套代码&#xff0c;多端运行理念&#xff0c;于是运行到了真机环境。好消息是运行成功了&#xff0c;坏消息是部分样式不完善&#xff0c;部分功能失效。跨端成功了&#xff0c;但没完全…

00 深度学习 PyTorch框架介绍

PyTorch框架介绍 什么是PyTorch&#xff1f; PyTorch 是一个开源的深度学习框架&#xff0c;由 Facebook 的人工智能研究团队开发&#xff0c;提供了强大的 GPU 加速的张量计算库和基于 autograd 系统的深度神经网络&#xff08;DNN&#xff09;库。它的设计强调简单性和直观…

4---自动化构建代码(逻辑梳理,轻松理解)

一、需求引出&#xff1a; 在使用编译器编译代码时&#xff0c;无论我们在一个项目中写了多少个文件(包括头文件、源文件)&#xff0c;我们都可以一键完成编译&#xff0c;编译器会自动处理各个文件之间的包含&#xff0c;调用关系。但是在Linux中&#xff0c;我们在一个目录下…

CSS 定位

为什么需要浮动? 我们在访问一些网站的时候, 经常会遇到如下这种情况, 有一个组件, 一直固定在屏幕的固定位置, 无论你如何滑动这个网页, 就会固定在哪里, 如下, 下图是王者荣耀的一个官网: 要实现上面的效果, 标准流或者是浮动是无法快速实现的, 此时就需要使用定位来实现.…

复习用到知识(asp.net)

public partial class teacheDetails : System.Web.UI.Page { // 页面加载时触发的事件 protected void Page_Load(object sender, EventArgs e) { // 检查是否是首次加载页面&#xff08;非回发&#xff09; if (!IsPostBack) { // 检查URL查询字符串中是否包含"…

H3C DHCP快速配置指南

1 配置DHCP服务器动态分配IPv4地址 1.1 简介 本案例介绍配置接口工作在DHCP服务器模式&#xff0c;实现动态分配IPv4地址的方法。 1.2 组网需求 如1.2 图1所示&#xff0c;公司将交换机做为核心交换机&#xff0c;现在需要在核心交换机上划分3个VLAN网段&#xff0c;Ho…