首页
学习
活动
专区
圈层
工具
发布

Java 的嵌套类(内部类和静态嵌套类)

class NestedClass {        ...    } } 复制代码  内部类与静态嵌套类    嵌套类有静态和非静态两种,其中静态的称为静态嵌套类(static nested classes...),非静态的称为内部类(Inner Classes)  一个嵌套类是包含它的外部类的一个成员,内部类能够访问外部类的其他成员,而静态嵌套类没有访问外部类的权限  作为外部类的成员,嵌套类能被声明为private...静态嵌套类   静态嵌套类与静态类里面的方法类似,一个静态嵌套类不能直接调用外部类里面的实例变量或者方法,它只能通过对象引用访问他们。  ...一个静态嵌套类与其他任何 top-level class 一样和他的外部类的其他成员相互作用。...由于静态嵌套类是通过外部类名来访问的:   OuterClass.StaticNestedClass   所以可以通过以下的语法来创建静态嵌套类的对象:   OuterClass.StaticNestedClass

1.4K20

java的内部类和静态内部类(嵌套类)

尤其是Static 修饰类和修饰对象和变量不一样呢? 定义 1. 内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类; 嵌套类是其封闭类的成员。...非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有的也是如此。静态嵌套类无权访问封闭类的其他成员。...为一体的一个部件OuterClass,一个嵌套类可以声明private,public,protected,或包专用。(回想一下,只能声明外部类public或将其包装为私有。) 2....静态内部类 再一个普通类里面,给内部类加上static关键字的修饰; 与类方法和变量一样,静态嵌套类与其外部类相关联。...通过将类B隐藏在类A中,可以将A的成员声明为私有,而B可以访问它们。另外,B本身可以对外界隐藏。 这可能会导致代码更具可读性和可维护性:在顶级类中嵌套小类会使代码更靠近使用位置。

2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java中的嵌套类、内部类、静态内部类

    嵌套类可以分为两种,静态的和非静态的,即静态嵌套类和非静态嵌套类。非静态嵌套类又叫做内部类(Inner Class)。...内部类的实例对象都会绑定一个外围类的实例对象,并且InnerClass可以访问其所绑定的OuterClass的所有成员属性以及方法,包括私有成员属性以及方法。...静态嵌套类   有些人把静态嵌套类成为静态内部类,其实静态内部类这个称呼不严谨,因为内部类都是非静态的。...由于静态嵌套类没有像内部类那样绑定外部类对象,所以也就不存在静态嵌套类不能访问其外围类的成员这种说法。  ...综上所述,虽然内部类和静态嵌套类都属于嵌套类,但是二者有本质区别:内部类的实例化对象需要绑定一个外围类的实例化对象,而静态嵌套类的实例化对象不能也无法绑定外围类的实例化对象。

    2.2K50

    java内部类----安全问题-----访问外围类的私有变量

    我们知道如果一个变量是私有的,它应该就不希望别人去访问它。 隐秘的访问方法需要拥有包的可见性,所有攻击代码需要与被攻击类放在同一个包中。...当使用了内部类的时候,编译器做了这样一件事: 它在外围类添加了一个静态方法  static boolean access$0(外部类); 内部类方法将调用这个函数 这个是有风险的,因为任何人都可以通过access...$0方法很容易的读取到外围类的私有域 黑客可以使用十六进制编辑器轻松创建一个用虚拟机指令调用这个函数的类文件。...结论就是: 如果内部类访问了私有数据域,就有可能通过附加在外围类所在的包中的其他类访问它们。 请慎用!

    2K20

    单例设计模式的正确写法(双重校验,静态内部类,枚举)

    单例设计模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统系统中一个类只有一个实例。...属于创建型模式 特点: 单例模式类只有一个实例(对象) 单例模式类必须自己创建自己的唯一实例 单例模式类必须给所有其他对象提供这一实例 2.1 懒汉式 普通的懒汉式由于懒加载所以存在线程安全问题,这里给出有一种双重检查的实现方式...Singleton(){} public static Singleton getInstance(){ reuturn LazyHolder.INSTANCE; } } 注意事项: 从外部无法访问静态内部类...LazyHolder,只有当调用Singleton.getInstance方法的时候,才能得到该单例对象 INSTANCE对象初始化的时机并不是在单例类Singleton被加载的时候,只有当调用getInstance...方法,使得静态内部类LazyHolder被加载的时候。

    55220

    Java基础入门之Object类、匿名内部类、构造方法的继承解析

    这篇文章我们主要介绍Java基础中的Object类、匿名内部类、构造方法的继承知识,一起来学习下吧! 一、Object类 1.Object类是所有类的父类,所有类都继承Object类。...二、匿名内部类 1.什么是匿名内部类 匿名内部类简单来说就是不知道这个类的名字。创建匿名内部类,只要调用一次就可以了。...2.匿名内部类的语法 new 类名(参数) | 父接口() { // 匿名内部类的类体部分 } 3.如何实现匿名内部类例子 //定义水果类接口interface Fruit{ double weight...三、构造方法的继承 1.构造方法的继承的特点: ① 子类是可以无条件地继承父类的无参数的构造方法; ② 如果子类自己没有构造方法,将继承父类的无参数构造方法成为自己的构造方法;如果子类自己定义了构造方法...四、总结 本文主要介绍了Object类、匿名内部类、构造方法的继承。 Object类是所有类的父类,所有类都继承Object类。

    73710

    java(4)-深入理解java嵌套类、内部类以及内部类builder构建构造函数六、使用 builder 模式解决构造方法参数过多的情况

    一、什么是嵌套类及内部类   可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。...静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。...使用嵌套类的好处: 嵌套类可以访问外部类的所有数据成员和方法,即使它是私有的。 提高可读性和可维护性:因为如果一个类只对另外一个类可用,那么将它们放在一起,这更便于理解和维护。...提高封装性:给定两个类A和B,如果需要访问A类中的私有成员,则可以将B类封装在A类中,这样不仅可以使得B类可以访问A类中的私有成员,并且可以在外部隐藏B类本身。 减少代码的编写量。...3、另外,就是要注意,内部类Inner及InnterTwo只在类Outer的作用域内是可知的,如果类Outer外的任何代码尝试初始化类Inner或使用它,编译就不会通过。

    2K10

    Effective-java-读书笔记之类和接口

    (或接口)只是在某一个类的内部被用到, 就应该考虑使它成为那个类的私有嵌套类.对于成员(域, 方法, 嵌套类和嵌套接口), 有四种可能的访问级别(可访问性递增):私有的(private).包级私有的(package-private...对公有类, 应该用包含私有域和公有访问方法(getter)的类来代替, 对可变的类, 加上公有设值方法(setter).-> 保留了改变内部表现的灵活性.如果类是包级私有的, 或者是私有的嵌套类, 直接暴露它的数据域并没有本质的错误...Java类库中的String的可变配套类是StringBuilder和StringBuffer.为了让类不能被继承, 除了使类成为final的外, 还有一种方法: 让类的所有构造器都变成私有的或者包级私有的...使子类更易提供针对子列表的快速clear方法.对于为了继承而设计的类, 唯一的测试方法就是编写子类.在为了继承而设计的类有可能被广泛使用时, 必须要意识到, 对于文档中所说明的自用模式, 以及对于其受保护方法和域中所隐含的实现策略...(从Java 8开始接口也可以包含默认方法了.)抽象类需要继承(Java只允许单继承), 但是可以实现多个接口.使用接口的好处:现有的类可以很容易被更新, 以实现新的接口.接口是定义混合类型(mixin

    1K71

    不清楚Java内部类的编译原理?读完这篇就够了

    举例子3:静态内部类的创建 /** * * 静态内部类:声明为static的内部类 * 不需要外围类的对象即可以创建嵌套类 * 嵌套类对象不可访问非静态的外围类对象...与普通的内部类还有一个区别:普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段, 也不能包含嵌套类。但是在嵌套类里可以包含所有这些东西。...* */ public class DotNew { //外围类仅仅提供了一个内部类,但是没有开放任何方法给客户端来调用,以达到从内部类的目的。...可以参考:《通过接口引用对象》与《设计模式的六大原则》。...内部类与外围类的继承机制 外围类A继承了外围类B的内部类,需要注意需要指明继承关系,否则编译器会报错:“No enclosing instance of type 'innerClass.test10.

    64520

    C++面向对象继承全面解析:不能被继承的类、多继承、菱形虚拟继承与设计模式实践

    一、实现一个不能被继承的类 1.1 间接方式 我们知道在继承中先构造父类再构造子类,那如果我们将基类中的构造函数私有化,派生类中就看不见基类中的构造函数,就不能调用基类中的构造函数,那么派生类就无法实例化出相应的对象...派生类就不能继承了 二、继承和友元 友元关系不能继承,也就是说基类友元不能访问派生类的私有和保护成员 (比如说:你爸爸有一些朋友,你去找你爸爸的朋友,让你爸爸的朋友帮忙,不一定帮,但是如果是你爸爸让朋友帮忙...,你爸爸的朋友会帮忙) 假设现在我想在类外面访问基类和派生类的成员变量—— 但是我们知道类里面的私有成员或者保护成员在类外无法访问,此时我们就可以将Display函数成为基类的友元函数—— 但是好像还不能访问...我不是已经继承了基类吗? ok,其实这是因为友元关系不能继承,也就是说基类友元不能访问派生类私有和保护成员 。...所以在现实中不要去玩菱形继承!!! 4.1.2 题目 多继承中指针偏移问题?下⾯说法正确的是( C) A:p1 == p2 == p3 B:p1 < p2 < p3 C:p1 == p3 !

    12810

    Python类中公开方法、私有方法和特殊方法的继承原理

    在Python中,对象的私有成员在类外部、派生类或程序中无法直接访问,但是可以通过“对象名._类名__私有成员名”这样一种特殊的形式来访问。...基类的构造方法和公开方法可以在类的外部直接访问,也可以被派生类继承。 在访问对象成员时,如果不存在则按照派生顺序逆序查找其基类中是否存在该成员,如果都不存在则抛出异常。...,会继承基类的构造方法 >>> class B(A): #这不会覆盖基类的私有方法 def __private(self): print('__private() method in...', '__class__', ...] >>> class C(A): #显式定义构造函数 def __init__(self): #这里调用的是类C的私有方法...另外,Python中的类还有大量特殊方法,详见Python对象特殊方法及其用法演示,在创建派生类时,基类中已经实现的特殊方法可以被派生类继承。

    2.4K50

    【C++】继承 - 从基类到派生类的代码复用逻辑

    这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。...基类private成员在派生类中是不能被访问(物理上被继承了下来,但是语法上不能使用),如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。...可以看出保护成员限定符是因继承才出现的。 实际上面的表格我们进行⼀下总结会发现,基类的私有成员在派生类都是不可见。...,派生类的构成必须调用基类的构造函数,但是基类的构成函数私有化以后,派生类看不见就不能调用了,那么派生类就无法实例化出对象。...继承与友元 友元关系不能被继承,也就是说基类友元不能访问派生类私有和保护成员。

    81710

    Java内部类详解

    内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。 注意:以上是从百度上copy的,因为现在很多人都认为内部类包含了静态嵌套类。...成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类 代码演示 ? ? 总结: 1、内部类可直接使用外部类的私有成员变量或方法,外部类对内部类是可见的。...2、外部类中可以创建私有内部类对象。 3、外部类可通过内部类的对象调用内部类的私有成员变量或方法。 4、当内部类与外部类有同名成员变量和方法时,内部类可通过Outer.this方式来引用外部类成员。...匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。...以上就是所有的java内部类的各种模式的简单例子 大家要注意一点,java中只能在内部类中创建静态成员的类,也就是静态嵌套类,也有很多人疑惑为什么 java 静态嵌套部类中可以有非静态成员,还有为什么可以

    1K21

    【Flutter】Dart 面向对象 ( 类定义 | 类的继承 | 私有变量 | 可选参数 | 默认参数 | 初始化列表 )

    文章目录 一、 Dart 面向对象 二、 类定义 三、 类的继承 四、 私有变量 五、 可选参数与默认参数 六、 初始化列表 七、 完整代码示例 八、 相关资源 一、 Dart 面向对象 ---- OOP...基本特点 : 封装 : 将现实中存在的事务封装成类 ; 继承 : 使用现有类的功能 , 无需重写现有类的变量及方法 , 只实现扩展内容 ; 多态 : 子类对象可以赋值给父类类型变量 ; 类中定义的内容..., this.age); // 重写父类的方法 @override String toString() { return "$name : $age"; } } 三、 类的继承...(String name, int age): super(name, age); } 四、 私有变量 ---- 以下划线开始的变量是私有变量 ; // 私有变量, 以下划线开始的变量是私有变量...age"; } } // 继承 class Student extends Person{ // 私有变量, 以下划线开始的变量是私有变量 int _grade; String school

    2.9K00

    【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )

    一、继承 + 组合 模式的类对象 构造函数和析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 , 又 在类中 维护了一个 其它类型 的 成员变量 , 那么 该类 的 构造 与 析构 , 就需要涉及到...类 本身 的 构造函数 和 析构函数 , 父类 的 构造函数 和 析构函数 , 类 成员变量 的 构造函数 和 析构函数 ; 2、调用规则 在 继承 + 组合 的情况下 , 构造函数 与 析构函数 调用规则如下...析构函数 ; 最后 , 调用 父类 析构函数 ; 二、完整代码示例分析 ---- 1、代码分析 在下面的代码中 , 继承关系 : C 类 继承了 B 类 class C : public B , B 类...继承了 A 类 class B : public A ; 组合关系 : D 类 是一个普通类 , 在 C 类中维护了一个 D 类成员变量 ; class C : public B { public:..., 涉及到的 父类构造/析构函数 , 自身构造/析构函数 , 成员变量 构造/析构函数 的调用顺序 ; 构造函数调用顺序 : 父类 -> 成员 -> 自身 ; 析构函数调用顺序 : 自身 -> 成员

    1.1K10

    关于类的继承,私有化及final关键字等的一些理解

    这时候私有化就很有用了,直接将AppMode类中的属性私有化,这样子类的定义就算和父类同名,也是互不影响的。...那如果子类想访问获取设置父类AppModel类中的私有属性怎么办?...这个时候get和set方法的作用就体现出来了,可以写两个方法,一个获取这个私有属性,一个用于修改这个私有属性 我怕别人不小心在子类中将我父类中的方法重写,而出现一些不可控的错误,但是又希望保持继承的关系...这个时候就可以用final关键字,用它来修饰方法可以保证方法不被子类重写 如果修饰类的话会使类变成最终类,也就是不可被继承的类。...名词解释 重载和重写的区别? 重载是定义相同的方法名,但是参数不同。重载是在一个类中的操作。重载是编译时的多态性。 重写是子类重写父类的方法,重写是在子类和父类之间。重写是运行时的多态性。

    48910

    关于Java里面的嵌套类,你了解多少?

    嵌套类的意义 在Oracle官网文档里面,有如下的描述: (1)是一种逻辑分组的方法,仅仅只在一个地方使用。也就是说这个嵌套类存在仅仅只为它的外部类服务。...我们都知道继承,封装,抽象,多态是Java语言最重要的四大特点。嵌套类对相对于其他外部的类是隐藏的。 (3)增加了可读性和可维护性。把相关的类定义在一个类文件里面在阅读和维护方法变得更加有利。...),但它不是外部类的实例 1.2: 类声明可以使用所有的访问修饰符 1.3:它仅仅可以访问外部类的静态字段和静态方法,私有的也可以 1.4:它可以定义静态和非静态的成员 示例如下: public class...4.2: 可以访问外部类所有的成员,包括静态和非静态的 4.3: 除了static final修饰的编译时常量成员外,内部只能定义非静态成员 4.4: 是唯一一种不能定义构造方法不能使用继承功能不能使用实现接口功能的类...答案是嵌套类的this是引用的本身,如果想在嵌套类里面使用外部类的this,那么必须使用外部类的类名类引用this: 示例如下: public class NewOuter { int a =

    70840

    【C++类和数据抽象】类的作用域

    理解类的作用域对于正确使用类和避免命名冲突至关重要。 一、类的作用域基本概念 1.1 什么是类的作用域 类的作用域是指类定义的大括号内的范围。...五、嵌套类 5.1 嵌套类的定义 嵌套类是指在一个类的内部定义的另一个类。嵌套类的作用域被包含在外部类的作用域内。...5.2 嵌套类的访问权限 嵌套类可以访问外部类的静态成员,但通常不能直接访问外部类的非静态成员。外部类对嵌套类的成员的访问也受到嵌套类的访问控制规则的限制。...七、类作用域与继承 7.1 基类和派生类的作用域关系 在继承关系中,派生类的作用域嵌套在基类的作用域之上。派生类可以访问基类的公共和受保护成员,同时可以定义自己的成员。...理解类的作用域的基本概念、成员查找规则、嵌套类和局部类的使用,以及类作用域在继承中的应用,对于编写高质量的 C++ 代码至关重要。

    12210

    关于Java里面的嵌套类,你了解多少?

    嵌套类的意义 在Oracle官网文档里面,有如下的描述: (1)是一种逻辑分组的方法,仅仅只在一个地方使用。也就是说这个嵌套类存在仅仅只为它的外部类服务。...我们都知道继承,封装,抽象,多态是Java语言最重要的四大特点。嵌套类对相对于其他外部的类是隐藏的。 (3)增加了可读性和可维护性。把相关的类定义在一个类文件里面在阅读和维护方法变得更加有利。...),但它不是外部类的实例 1.2: 类声明可以使用所有的访问修饰符 1.3:它仅仅可以访问外部类的静态字段和静态方法,私有的也可以 1.4:它可以定义静态和非静态的成员 示例如下: public class...4.2: 可以访问外部类所有的成员,包括静态和非静态的 4.3: 除了static final修饰的编译时常量成员外,内部只能定义非静态成员 4.4: 是唯一一种不能定义构造方法不能使用继承功能不能使用实现接口功能的类...答案是嵌套类的this是引用的本身,如果想在嵌套类里面使用外部类的this,那么必须使用外部类的类名类引用this: 示例如下: public class NewOuter { int

    1.2K40
    领券