java嵌套类(重点为静态成员类的说明和使用)

2023-11-05

嵌套类(nested class ['nestɪd] ):被定义在另一个类的内部的类;

外围类(enclosing class)

嵌套类(nested class)有四种

  • 静态成员类(static member class)、
  • 非静态成员类(nonstatic member class)、
  • 匿名类(anonymous class) 、
  • 局部类(local class)。

除了第一种之外,其他三种都被称为内部类


1、静态成员类

    静态成员类是最简单的一种嵌套类。最好把它看作是普通的类,只是碰巧被声明在另一个类的内部而已,它可以访问外围类的所有静态成员(包括声明为私有的成员)。
    静态成员类是外围类的一个静态成员,与其他的静态成员一样,也遵守同样的可访问规则。如果它被声明为私有的,就只能在外围类的内部才可以被访问。

public class Father {
    private static int cc = 0;
	static class Flower{	
		public Flower() {
			System.out.println("Flower:::构造方法执行" + cc);
		} 
	}
}

    静态成员类的一种常见应用是作为公有的辅助类,当且仅当与它的外部类一起使用时才有意义。


2、非静态成员类

非静态成员类和静态成员类之间的区别:

非静态成员类的每个实例都隐含着与外围类的一个外围实例相关联。在非静态成员类的实例方法内部(实例方法:对象的方法,只有对象创建后才起作用),可以调用外围实例上的方法,或者利用修饰过的this构造获得外围实例的引用。

public class OuterClass {
	public OuterClass() {
		System.out.println("OuterClass:::构造方法执行");
	}
	public void haha() {
		System.out.println("OuterClass:::haha方法执行");
	}
	class InnerClass{
		public InnerClass() {
			haha();  //在非静态成员类的实例方法内部调用外围实例上的方法
			System.out.println("InnerClass:::构造方法执行");
		}
	}
	static class InnerClassStatic{
		public InnerClassStatic() {
//			haha();   //当haha()是静态方法时才不会出错
			System.out.println("InnerClassStatic:::构造方法执行");
		}
	}
}

如果 嵌套类的实例 可以在 外围类的实例 之外独立存在,这个嵌套类就必须是静态成员类;在没有外围类的实例的情况下,要想创建非静态成员类的实例是不可能的。

/**
* 非静态内部类实例化
* 外部类对象名.new 内部类名()
*/
OuterClass oc = new OuterClass();
OuterClass.InnerClass ic = oc.new InnerClass(); //需要外围类的实例来创建非静态成员类

/**
* 静态内部类实例化
* new 外部类名.内部类名()
*/
StaticInnerClass sic = new OuterClass.StaticInnerClass();

当非静态成员类的实例被创建的时候,它和外围实例之间的关联关系也随之建立起来,而且这种关联关系以后也不能被修改。

如果声明成员类不要求访问外围实例,就要始终把static修饰符放在它的声明中,使他成为静态成员类,而不是非静态成员类。



3、匿名类

匿名类在使用的同时被声明和实例化。

匿名类的使用方法:

FatherClassName reference = new FatherClassName(){
    //方法
};

匿名类可以看作两种情况:

  • 匿名类继承一个父类

  • 匿名类实现一个接口

3.1、匿名类继承一个父类
/**
* 匿名类继承一个父类
*/
class Polygon {
   public void display() {
      System.out.println("在 Polygon 类内部");
   }
}

class AnonymousDemo {
   public void createClass() {

      // 创建的匿名类继承了 Polygon 类
      Polygon p1 = new Polygon() {
         public void display() {
            System.out.println("在匿名类内部。");
         }
      };
      p1.display();
   }
}

class Main {
   public static void main(String[] args) {
       AnonymousDemo an = new AnonymousDemo();
       an.createClass();
   }
}

输出结果为:

在匿名类内部。

需要注意的是,匿名类中自定义的方法只能在匿名类的内部使用:

public class DemoFather {
	public DemoFather() {
		System.out.println("DemoFather:::构造方法执行");
	}
	
	public static void main(String args[]) {
		OuterClass oc=new OuterClass() {
			//匿名类中自定义的方法只能在匿名类的内部使用
			public void anonymousInnerClassMethod() {
				System.out.println("DemoFather:::OuterClass的匿名内部类执行");
			}
			//OuterClass存在haha()
			public void haha() { 
				System.out.println("DemoFather:::OuterClass的haha()");
				anonymousInnerClassMethod();
			}
		};	
		oc.haha();
	//	oc.anonymousInnerClassMethod(); //错误
	}
}

输出结果为:

OuterClass:::构造方法执行
DemoFather:::OuterClass的haha()
DemoFather:::OuterClass的匿名内部类执行

所以,注意到,实例化抽象类时,是使用了匿名类的写法:

//抽象类
public abstract class Red {
    public abstract void draw();
}
 
//匿名类的使用
   Red red = new Red() {
         @Override
         public void draw() {
                Log.v("-->", "Draw");
         }
   };

代码等价于:

//抽象类
public abstract class Red {
    public abstract void draw();
}
 
//继承抽象类
public class RedChild extends Red {
    @Override
    public void draw() {
        Log.v("-->", "Draw");
    }
}
 
//实体类的使用
  RedChild redChild = new RedChild();
  redChild.draw();

–2021.9.17–我认为上述代码有个错误

//代码最后,“ 实体类的使用 ”,应该为
Red redChild = new RedChild();
redChild.draw();

==–2022.7.26 补充说明,匿名类的使用相当于Red redChile = new RedChild(); ==

3.2、匿名类实现一个接口
/*
*匿名类实现一个接口
*/
interface Polygon {
   public void display();
}

class AnonymousDemo {
   public void createClass() {

      // 匿名类实现一个接口
      Polygon p1 = new Polygon() {
         public void display() {
            System.out.println("在匿名类内部。");
         }
      };
      p1.display();
   }
}

class Main {
   public static void main(String[] args) {
      AnonymousDemo an = new AnonymousDemo();
      an.createClass();
   }
}

4、局部类

局部类是四种嵌套类中使用的最少的类。

package cn.zzx;
 
public class ClassA {
	private int a;
 
	public void test() {
		System.out.println("外部类...");
		
	}
/**
 * 局部内部类是嵌套在方法里面的
 */
	public void testB() {
		class ClassB {
			private int b;
 
			public void testB() {
				System.out.println("局部类...");
			}
		}
		ClassB b = new ClassB();   //局部类创建实例
		b.testB();					//实例调用testB()方法
	}
}
package cn.zzx;
 
public class TestA {
	public static void main(String[] args) {
		ClassA classA = new ClassA();
		classA.test();
		classA.testB();  //调用局部类	
	}
}

外部类…

局部类…


参考文章:
https://blog.csdn.net/jiankunking/article/details/54932462

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java嵌套类(重点为静态成员类的说明和使用) 的相关文章

随机推荐

  • Hive 中常用的查询语句解读及应用(分组、Join、排序语句)

    文章目录 Hive 中常用的查询语句 2 分组 2 1 Group By 语句 2 2 Having 语句 3 Join 语句 3 1 等值 Join 3 2 表的别名 3 3 内连接 3 4 左外连接 3 5 右外连接 3 6 满外连接
  • mysql数据库使用between and 的不包含右边界问题

    最近在公司经常支持业务部门数据提取 遇到了一个提取时间间隔的问题 想到了between and比较方便 之前经常用这个关键字 但是从来没思考过它的边界问题 所以趁这次研究了一下 废话不多说 直接上例子 select from user se
  • 【机器学习】支持向量机SVM及实例应用

    机器学习 支持向量机 1 分类超平面与最大间隔 2 对偶问题与拉格朗日乘子法 3 核函数 4 软间隔与正则化 5 实例应用 python使用支持向量机SVM 准备 数据集 导入SVM模块 步骤 1 读取数据集 2 划分训练样本与测试样本 3
  • cool使用es教程

    cool使用es教程 安装es8 1 0 将elasticsearch head文件运行至浏览器插件可以看到运行情况 安装ik分词器 将目录名称改名放置es安装目录plug目录 版本一定cool5 安装es8 1 0 官网 github下载
  • Flask03_路由传参

    encoding utf 8 1 app route 路由匹配 代表资源在服务器上的位置 1 路由 Flask根据http请求的url在路由表中和定义好的进行匹配 找到对应的函数处理这个请求 此过程保存一个url到函数的映射关系称之为路由r
  • (zxing.net)二维码Aztec的简介、实现与解码

    一 简介 Aztec Code是1995年 由Hand HeldProducts公司的Dr Andrew Longacre设计 它是一种高容量的二维条形码格式 它可以对ASCII和扩展ASCII码进行编码 当使用最高容量和25 的纠错级别的
  • pyqt多窗口设计(2步实现,嘴对嘴教学,源码复制可用)

    本文涉及 PyQt5 Qt Designer PyCharm 目录 先看下完成效果 步骤1 用Qt Designer创建2个窗体 步骤2 将子窗体和主窗体上的按钮控件进行关联 完整代码 先看下完成效果 视频里我只设计了1个主窗口和1个子窗口
  • MyBatis(2):MyBatis标签以及对应的属性用法讲解

    通过上一章的讲解 大家应该对MyByatis的基本用法有了一定的了解 这一章主要是讲一下MyBatis的各种标签以及对应的属性 它们的用法以及用的时候应该注意一些什么 下面的讲解时结合当前主流框架 Spring Spring MVC MyB
  • linux 给文件替换字符串/替换内容/替换某行 (shell,sed)

    本文是要讲linux 不打开文档 文件的情况下 替换文本内容 打开文档 在文档 文件内替换内容的 可以用vim 可参考这篇文章vim 替换文本 话题相关 linux 文件替换字符串 sed 字符串替换 shell 文件替换某行 linux
  • Blender-烘焙动画,解除约束父子级,导入UE4

    问题1 烘焙动画 解除约束父子级 导入UE4 注意 blender 里 走路动画1 32帧 第1和32帧重复姿势 如果播放选择1 32帧 会因为重复播放而卡最后一帧 所以要流畅播放 在blender里应该设置为1 31帧 来查看预览 但是导
  • hadoop无法启动 INFO ipc.Client: Retrying connect to server

    18 01 07 02 05 32 INFO ipc Client Retrying connect to server master 192 168 157 10 9000 Already tried 0 time s retry pol
  • QT入门Containers之QToolBox

    目录 一 QToolBox界面相关 1 布局介绍 2 界面测试 3 添加分组测试 4 添加图标 5 添加展开缩进不同效果图标 二 Demo展示 此文为作者原创 创作不易 转载请标明出处 一 QToolBox界面相关 1 布局介绍 先从界面拖
  • UNITY获取物体速度的方法

    unity中如果用navmesh 里面有内置的方法可以获取速度 其他目前发现好像只能自己算了 float Speed curpos gameObject transform position 当前点 float speed Vector3
  • JoyStick Shield连接Nokia 5110--Arduino

    SpaceTrash游戏是一个简单的射击游戏 您可以在其中控制宇宙飞船 并通过移动或爆破 使用激光 来避免漂浮在周围的小行星的碰撞 该游戏是u8g2图形库附带的示例 该图形库通常用于连接具有SPI或I2C协议的各种单色8位显示器 对于此游戏
  • 解释mysql中DDL_详解MySQL第一篇—MySQL简要介绍及DDL语句

    背景 近几年 开源数据库逐渐流行起来 由于具有免费使用 配置简单 稳定性好 性能优良等优点 开源数据库在中低端应用上占据了很大的市场份额 而 MySQL 正是开源数据库中的杰出代表 MySQL 数据库目前分为社区版 Community Se
  • Bean深拷贝忽略大小写

    import java lang reflect Field import java util HashMap import java util Map public class BeanMapUtils 忽略大小写且NULL值不会覆盖新值
  • UBUNTU 18.04 Wine容器环境配置及应用问题

    1 Wine5 0的安装及配置 Wine官方网址 安装教程 https wiki winehq org Ubuntu zhcn Ubuntu 18 04 Linux Mint 19 x 没有提供 FAudio 但最新版的 Wine 依赖该软
  • 202318读书笔记|《芭蕉·芜村·一茶:俳句三圣新译300》——樱花——让一整个春夜亮起来!

    202318读书笔记 芭蕉 芜村 一茶 俳句三圣新译300 樱花 让一整个春夜亮起来 芭蕉 芜村 一茶 俳句三圣新译300 诗歌 词 短歌 俳句我都喜欢 读起来轻松明快 松尾芭蕉 与谢芜村 小林一茶并称三圣 芭蕉为俳句之圣 芜村 一茶居 至
  • StringBuffer进阶以及常用方法

    StringBuffer 类 String类 是在所有项目开发之中一定会使用到的一个功能类 并且这个类拥有如下的特点 每一个字符串的常量都属于一个 String 类的匿名对象 并且不可更改 String 有两个常量池 静态常量池 运行时常量
  • java嵌套类(重点为静态成员类的说明和使用)

    嵌套类 nested class nest d 被定义在另一个类的内部的类 外围类 enclosing class 嵌套类 nested class 有四种 静态成员类 static member class 非静态成员类 nonstati