`
luhantu
  • 浏览: 203479 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 内部类 - 隐藏特性 & 无条件访问外部类属性

    博客分类:
  • Java
阅读更多

对于隐藏性来说,平时我们对类的访问权限,都是通过类前面的访问修饰符来限制的,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以,所以我们能通过内部类来隐藏我们的信息。可以看下面的例子 

InterfaceTest:

package com.mode.infa;

public interface InterfaceTest {
	  public void test();
}

 Example:

package com.mode;

import com.mode.infa.InterfaceTest;

public class Example {
	private String name = "Example";
	private static String staticName = "Static Name";
	/*成员内部类: 
	 * 需要等外部类创建了对象以后才会被加载到JVM中,
	 * 它属于外部类的某个实例,因此它可以访问外部类的静态和非静态成员。
	*对于构造方法来说,系统会为它们自动加上一个外部类的参数以及一个外部类的成员变量,
	*这是因为要遵循先有外部类实例才能有内部类实例的原则。
	*/
	private class InsideClass implements InterfaceTest
    {
    	private String innerName = "Example";
    	private String name = "Example";
        public void test()
         {
             System.out.println("This is insideClass's name = " + name);
             System.out.println("This is insideClass's innerName = " + innerName);
             System.out.println("This is the out class's name = " + Example.this.name);
         }
    }
    /*静态内部类:
     * 在外部类加载的时候,静态内部类也随之加载,它的完整类名是,编译后的class的文件名为。
     * 由于静态内部类是静态的,所以它无法访问外部类的非静态成员。
     * 其实,静态内部类相对外部类来说,几乎是独立的,它可以在没有外部类对象的情况下,单独创造一个内部类的对象。
     * 从某种程度来说,公开的静态内部类就相当于一个普通的类。
     * 其相对于外部类来说,仅仅是包含关系,缩小了命名空间,完整类名中多了一个外部类的名称。
     * 本质上是两个独立的类,JVM也不知道它们两个有包含关系。
     */
    public static class StaticClass
    {
    	public void testStaticClass()
    	{
    		 System.out.println("This is StaticClass's static name = " + staticName);
    	}
    }
    
    public InterfaceTest getIn()
    {
        return new InsideClass();
    }
}

 测试类TestExample:

import com.mode.Example;
import com.mode.infa.InterfaceTest;
public class TestExample {
	public static void main(String[] args) {
		//InterfaceTest 如果为非public的话,对外是不可见的。
		Example a=new Example();  
	    InterfaceTest a1=a.getIn();  
	    a1.test();
	    //StaticClass 如果为public的话,可以通过以下方法访问
	    Example.StaticClass st = new Example.StaticClass();
	    st.testStaticClass();
	    //InterfaceTest 如果为public的话,可以通过以下方法访问
	    //Example.InsideClass ei = new Example().new InsideClass();
	    //ei.test();
	}
}

 

 从这段代码里面我只知道Example的getIn()方法能返回一个InterfaceTest 实例但我并不知道这个实例是这么实现的。而且由于InsideClass 是private的,所以我们如果不看代码的话根本看不到这个具体类的名字,所以说它可以很好的实现隐藏。 

 

分享到:
评论

相关推荐

    V20-Java笔记整理-重要概念和常见陷阱梳理.docx

    - 封装是指隐藏对象的内部状态和实现细节,只提供有限的公共接口供外部访问。 - 有助于提高代码的安全性和可维护性。 **4.8 与封装有关的访问权限修饰符** - **public**:公共访问级别,任何地方都可以访问。 - **...

    java初级概念-完整版

    - 无条件调用本类成员 - 使用"对象.成员"的形式调用其他类的成员 成员方法执行步骤: 1. 形参分配内存 2. 值传递 3. 执行方法体 4. 释放局部变量内存 `return` 关键字: - 返回方法结果 - 结束方法执行 匿名...

    JAVA封装类练习题

    在Java编程语言中,封装是面向对象编程的三大特性之一,它主要涉及到类的设计和数据的隐藏。封装的目的是为了保护数据的安全性,避免外部代码直接访问和修改对象的内部状态,同时也使得代码更加模块化,易于维护。...

    java全集.pdf JAVA全集

    - 使用访问控制符来限制外部直接访问类的内部细节。 **6.9 方法的重载** - 方法名相同,参数列表不同。 - 可以有相同的返回类型。 #### 七、高级语言特性 **7.1 封装(Encapsulation)** - 通过私有变量和公有...

    java名词速查表 java名词速查表

    - **特点**:可以访问外部类的所有成员。 #### Members (成员) - 成员指类中的所有组成部分,包括变量、方法、内部类等。 - **分类**:实例成员、静态成员。 #### Method (方法) - 方法是执行特定任务的过程或...

    Java软件开发实战 Java基础与案例开发详解 9-8 练习题 共4页.pdf

    - **程序结构**:一个完整的Java程序由类组成,每个类包含属性和方法。 - **执行流程**:编写源代码 -> 编译成字节码(.class文件)-> 通过Java虚拟机(JVM)解释执行。 #### 2-2 计算机中的程序 - **编译型语言**:...

    Java面试2024-7.5基础必备详情包含解答.docx

    例如,在设计一个“汽车”类时,我们可以忽略其具体的制造过程或内部机械结构,而重点关注其品牌、颜色、速度等关键属性。 - **继承**:允许子类继承父类的属性和行为,提高代码的复用性和扩展性。例如,“轿车”...

    Java面试题 -.docx

    1. **封装**:封装是指将数据和操作这些数据的方法组合在一起,形成一个整体,同时隐藏内部实现细节。这种机制可以保护数据不被外部非法访问,提高系统的安全性和稳定性。 2. **继承**:继承是一种让一个类(子类)...

    java-jsp试题--带答案.pdf

    10. 内部类:内部类可以直接访问外部类的私有属性和方法,而无需任何特殊权限。它可以用于封装和隐藏实现细节。 11. 方法覆盖:覆盖方法需要保持与被覆盖方法的签名一致,即方法名和参数列表必须相同。选项B提供了...

    Java入门学习笔记

    - **静态类**:Java中不存在静态类的概念,但可以通过内部类模拟类似的功能。 **7.5 Singleton模式** - Singleton模式确保一个类只有一个实例,并提供一个全局访问点。 **7.6 final关键字** - **7.6.1 final变量...

    JAVA面试题集

    - **封装**:封装是将数据和操作数据的方法包装在一起,限制外部直接访问内部状态。JAVA通过访问修饰符(public, private, protected)实现封装,保护数据的安全性和完整性。 - **多态性**:多态性是面向对象编程的...

    java面试资料大全(非常全面)

    - 内部类可以直接访问外部类的成员,包括私有成员。 - 限制:如果外部类成员是`static`的,则内部类不能直接访问。 28. **匿名内部类**: - 匿名内部类可以继承其他类或实现接口。 - 匿名内部类主要用于实现...

    java 面试题集

    - **封装**:封装是将对象的状态(属性)和行为(方法)包裹在一起,对外部隐藏内部实现细节的过程。封装可以提高代码的安全性和可维护性。在Java中,通过访问修饰符如`private`、`protected`和`public`来实现封装。...

    java经典面试题-kaic

    - 属性(fields)是私有的(private),并提供对应的getter和setter方法,以便外部访问和修改属性值。 - 实现`Serializable`接口,以便进行序列化操作,即对象的状态可以转换成字节流并保存或在网络上传输。 3. *...

    java面向对象基础

    - **静态内部类**: 通过`static`关键字定义的内部类,它可以在不创建外部类对象的情况下被实例化,只能访问外部类的静态成员。 - **方法内部类**: 定义在一个方法内的类,只能在该方法内部使用。 #### 十一、匿名...

    黑马程序员入学Java精华总结

    - 继承`Thread`类可以直接访问和修改线程属性。 - 实现`Runnable`接口更灵活,可以被多个线程共享。 4. **线程的生命周期** - 线程的生命周期包括新建、就绪、运行、阻塞和死亡五个阶段。 5. **控制线程** - ...

    Java基础知识的详细总结

    内部类是在另一个类的内部定义的类,它可以访问外部类的所有成员变量和方法。 - **内部类的分类**: - 成员内部类:作为外部类的一个成员存在。 - 局部内部类:在方法内部定义。 - 匿名内部类:没有名字,只能在...

    java语言程序设计 java编程基础入门教程资料 (1)JAVA语言程序设计 共19页.pptx

    - **封装**:封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问,而是通过公共接口访问对象。 - **继承**:一个类可以继承另一个类的属性和方法,从而实现代码的复用。 - **多态**:多态是指允许不同...

    SunJava问题集[归类].pdf

    - **Static Nested Class** 和 **Inner Class**:静态内部类无需外部类对象即可创建,而普通内部类需要。 - **&和&&的区别**:前者是位运算符,后者是逻辑运算符。 - **assert**:用于调试,断言某个条件应该为真...

Global site tag (gtag.js) - Google Analytics