`
beck5859509
  • 浏览: 110351 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

私有内部静态类的讨论及使用

    博客分类:
  • java
 
阅读更多
  内部类一直比较神秘,尤其是加上private、static修饰符以后,更加使人迷惑。但是看很多JDK源码里面都采用了此种设计。比如:ReferenceQueue中的lock、LinkedHashMap中的Entry。感兴趣的同学可以看一下这部份源码。
 
  首先看一个例子:
 
	public static void main(String[] args) {
		Inner inner1 = new Inner();
		Inner inner2 = new Inner();
		System.out.println(inner1);
		System.out.println(inner2);
	}

    private class Inner { };

   内部类前加private修饰只有主类可以访问,这好解释。但是这几行代码编译不过。提示必须使用x.new A()的形式才可以访问。因为Inner类是一个非静态类,不允许直接实例化,需要依赖于主类的实例。
   修改如下即可:
  
	public static void main(String[] args) {
		Test1 t = new Test1();
		Inner inner1 = t.new Inner();
		Inner inner2 = t.new Inner();
		System.out.println(inner1);
		System.out.println(inner2);
	}

    private class Inner { };

    这样写不好的地方就是内部类的实例严重依赖于主类的实例的引用对象,写出来的代码很别扭。其实解决办法有两个。
    第一种办法把Inner这个类提到主类的外部:
   
public class Test1 {
	public static void main(String[] args) {
		Test1 t = new Test1();
		Inner inner1 = new Inner();
		Inner inner2 = new Inner();
		System.out.println(inner1);
		System.out.println(inner2);
	}

}
class Inner { };

      这种写法不好的地方在于Inner类的可以被其它类调用,这是我们不希望看到的。类的访问权限被放大了。
      另一种写法是在Inner类的前加上static修饰符。这样可以就不依赖于主类实例化的引用对象了。
     
public class Test1 {
	public static void main(String[] args) {
		Test1 t = new Test1();
		Inner inner1 = new Inner();
		Inner inner2 = new Inner();
		System.out.println(inner1);
		System.out.println(inner2);
	}

	private static class Inner { };
}

      这种写法就是本文提倡的,LinkedHashMap巧妙的运用了这点,内部的每个Entry都是一个私有的静态内部类,该类继承了HashMap中的Entry。实际开发中我们也可以参照这种设计模式。
      最后再提一下使用私内部静态类的单例模式。
      该模式也使用到了上述提到的特点,只是直接使用内部类的属性而已。

        
public class Test1 {
	private Test1(){ }
	
	public static Test1 getInstance()
	{
		return Inner.instance;		
	}
	
	private static class Inner
	{
		private static Test1 instance = new Test1();
	}
}

  
0
0
分享到:
评论

相关推荐

    java内部类的使用

    本文主要讨论非静态内部类(也称为实例内部类)的使用及其特点。 首先,非静态内部类的一个关键特性是它拥有对外部类的隐式引用。这意味着当一个内部类实例被创建时,它会自动关联一个外部类的实例。这个引用使得...

    讲解Java中如何构造内部类对象以及访问对象

    内部类有四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。本篇将主要讨论如何构造内部类对象以及如何通过反射来访问它们。 首先,我们来看一个简单的内部类示例: ```java package javalang; public ...

    java中的内部类总结

    下面将详细讨论内部类的种类、访问规则以及使用场景。 1. **非静态内部类(成员内部类)** - 成员内部类就像是外部类的一个成员,它可以访问外部类的所有成员,包括私有成员和静态成员。 - 创建内部类对象时,...

    接口,内部类,抽象类概念和区别

    内部类主要有四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。内部类可以提供更好的封装性和代码组织,常用于实现事件监听器、回调机制等场景。使用内部类可以隐藏实现细节,提高代码的可读性和可维护性...

    Javascript 类与静态类的实现

    接下来,我们讨论静态类。在JavaScript中,静态类通常是指没有实例化,只提供静态方法和属性的类。我们可以通过在类定义外部创建一个对象来实现静态类,这个对象将包含所有的静态方法和属性: ```javascript var ...

    Java编程中静态内部类与同步类的写法示例

    静态内部类,也称为嵌套静态类,是一种定义在外部类内的类,但具有静态修饰符。这意味着它不依赖于外部类的实例,而是像普通的静态成员一样存在。以下是一些关于静态内部类的关键点: 1. 非静态内部类可以访问外部...

    Java静态内部类实现单例过程

    这里我们将重点讨论静态内部类和枚举实现单例的过程。 首先,让我们来看看静态内部类实现单例的方式: ```java public class SingletonFactory { private SingletonFactory() {} // 私有化构造函数,防止外部实例...

    java线程内部类练习.rar

    接下来,我们讨论如何在实践中结合使用Java线程和内部类。例如,我们可以创建一个包含业务逻辑的类,然后在该类中定义一个静态内部类,这个内部类实现Runnable接口。内部类的`run()`方法可以包含执行特定任务的代码...

    非常精简的匿名内部类详解.docx

    同样,在实现单例模式时,如果只需要一个实例,匿名内部类可以作为私有静态内部类,提供一个静态工厂方法来创建实例。 总的来说,匿名内部类是Java中一个强大的工具,它允许开发者在不增加过多复杂性的前提下,快速...

    从Java嵌套类中访问外部类成员.doc

    首先,嵌套类分为两种主要类型:静态嵌套类(也称为内部静态类)和非静态嵌套类(也称为实例内部类)。非静态嵌套类可以访问外部类的所有成员,包括私有成员,而静态嵌套类只能访问外部类的静态成员。这是因为非静态...

    java_innerclass_instance.rar_innerclass

    这里我们主要讨论成员内部类和静态内部类,因为这两个类型在实际开发中最为常见。 1. **成员内部类**: 成员内部类就像是外部类的一个普通成员,可以访问外部类的所有成员,包括私有成员。例如: ```java ...

    JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    在本文中,我们将深入探讨JavaScript中的一些关键面向对象的概念,包括`Object类`、`静态属性`、`闭包`、`私有属性`以及`call`和`apply`方法的使用,同时还会介绍三种实现继承的方法。 首先,`Object类`是...

    java使用匿名类直接new接口.docx

    通过上述讨论,我们可以看到使用匿名内部类直接new接口是一种简洁有效的编程方式。它不仅可以简化代码,还能提高程序的可读性和维护性。然而,需要注意的是,这种方式可能会增加编译后的类文件数量,因此在需要频繁...

    浅谈Java中单例设计模式之构造方法私有化.pdf

    在本文中,我们讨论了单例设计模式的核心思想和应用,包括构造方法私有化、访问控制修饰符和静态成员和静态方法的使用。我们还讨论了单例设计模式的优点和缺点,以及在 Java 中的应用场景。 单例设计模式是一种非常...

    如果我将构造函数声明为私有,可以在另一个类中调用此构造函数

    另外,如果我们确实需要在不同类中使用私有构造函数,可以使用工厂方法或者友元类(friend class,Java中没有直接支持这一概念,但可以通过内部类或者持有对方的引用来实现类似效果)。工厂方法是一种设计模式,它...

    06 类与对象31

    1. **内部类**(inner class):非静态嵌套类,它可以访问其外部类的所有成员,包括私有成员。内部类的一个例子是`RectangleR`,它在`RectDemo6`类中定义。这个内部类具有计算矩形面积的方法,并通过外部类的实例来...

    Java基础经典案例源码

    下面将详细讨论其中涉及的重要知识点——数据处理和内部类。 1. 数据处理: 在Java中,数据处理涵盖了许多方面,包括基本数据类型(如int、double等)、数据结构(如数组、链表、队列、栈)和集合框架(如...

    java程序设计——基于JDK6和NetBeans实现第4章课后作业答案.pdf

    第三个程序展示了私有内部类`Engine`的使用。内部类`Engine`的构造器调用了`drive()`方法,这在`Car`类中是不可见的。然而,由于`Engine`是`Car`的私有内部类,所以`Car`类可以访问`Engine`的所有成员。在`go()`方法...

Global site tag (gtag.js) - Google Analytics