首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Java 16+中,为什么密封到单个子类的类不能访问该子类中的方法,有什么原因吗?

在Java 16+中,密封类(sealed class)是指通过使用sealed关键字修饰的类,它限制了其他类对其继承的访问权限。密封类可以有多个子类,但是密封类的子类必须在同一个包中定义,或者是密封类本身的内部类。

当一个类被声明为密封类后,它的子类必须显式地声明为final或者是密封类的子类。这意味着密封类的子类不能再有其他的子类。这样做的目的是为了确保密封类的继承关系是有限的,从而提高代码的可维护性和安全性。

由于密封类的子类是有限的,Java编译器可以在编译时对密封类的子类进行静态检查,以确保所有的子类都能够正确地访问密封类中的方法。如果一个密封类的子类不能访问该子类中的方法,可能是由于以下原因:

  1. 子类的方法访问修饰符不正确:子类中的方法可能被声明为私有方法或者是包私有方法,导致无法在其他类中访问。
  2. 子类不是密封类的子类:子类可能没有正确地声明为密封类的子类,或者是声明在了不同的包中,这样就无法访问密封类中的方法。
  3. 密封类的方法被声明为私有方法:密封类中的方法可能被声明为私有方法,导致无法在子类中访问。

总之,密封类的设计目的是为了限制继承关系,提高代码的可维护性和安全性。如果一个密封类的子类不能访问该子类中的方法,可能是由于访问修饰符不正确或者子类没有正确地声明为密封类的子类。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么Java成员变量不能被重写?成员变量Java能够被重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域方法

这篇文章讨论了Java面向对象概念中一个基本概念--Field Hiding(成员变量隐藏) 成员变量Java能够被重写么?...Paste_Image.png 按照我们已有的多态概念,第二个应该是输出sub才对,但却输出了super。这是为什么呢?...意思就是: 一个子类成员变量如果和父成员变量同名,那么即使他们类型不一样,只要名字一样。父成员变量都会被隐藏。子类,父成员变量不能被简单用引用来访问。...其实,简单来说,就是子类不会去重写覆盖父成员变量,所以成员变量访问不能方法一样使用多态去访问。...访问隐藏域方法 就是使用父引用类型,那么就可以访问到隐藏域,就像我们例子代码 就是使用类型转换System.out.println(((Super)c1).s); 翻译自http://www.programcreek.com

3.5K40

Java基础重构-面向对象

构造器引用构造器正在初始化对象 方法引用调用方法对象。 this关键字最大作用就是让中一个方法访问该类里另一个方法或实例变量。...也就是说,表面上看起来某些方法可以被独立执行,但实际上环视使用this或者 作为调用者。 Java参数传递可以引用传递? 不可以,Java参数传递方式只有一种,值传递。...Java 里对封装定义是:每个都应该封装它内存信息和实现细节,而只暴露必要方法给其他使用。但在继承关系子类可以直接访问成员变量(内部信息)和方法,从而造成子类和父严重耦合。...java8里,允许为接口定义默认方法方法。 接口从宏观上来说,是从多个相似抽象出来规范,接口不提供任何实现。说简单点,接口反映是一事物方法。...非静态内部类不能拥有静态成员。 为什么静态内部实例方法不能访问外部类实例属性? 因为静态内部类是外部类相关,而不是外部类对象相关

63430

100道最新Java面试题,常见面试题及答案汇总

子类是从父(superclass)中继承子类可以访问所有public和protected字段和方法。 Q2:Java语言中有哪些常见访问说明符,什么意义?...请举例说明 答案:final是Java关键字,“无法改变”、“终态”含义,final不能被继承,没有子类,final方法默认是final,且不能子类方法覆盖,但可以被继承。...Q28:我们可以覆盖静态方法? 答案:我们不能覆盖静态方法,静态方法属于一个而不是单个对象,并且在编译时解析(而不是在运行时)。 Q29:在下面的例子,输出是什么?...答案:多线程是一个编程概念,可以单个程序以并发方式执行多个任务。同一个进程多个线程堆栈共享,有助于程序性能改进。 Q35:为什么ava中使用Runnable Interface?...答案:私有成员该类范围之外是不可访问,即使同一个包不能访问任何其他。 Q46:同一可以定义重名方法

4.9K21

常见java面试基础问题(二) | 附赠程序员面试必看经典图书

子父成员关系 成员变量:子类方法中使用一个变量时,首先,方法局部变量找这个变量,则使用。否则,本类找成员变量,则使用。否则,找成员变量,则使用。否则,报错。...成员方法:用子类对象使用一个方法时。首先,子类找这个方法则使用。否则,找这个方法则使用。否则,报错。 重写和重载区别? 重载:同一方法名相同,参数列表不同。...重写:不同类(子父)。方法声明相同(返回类型,方法名,参数列表均相同)。 重写需要注意: 子类方法访问权限要大于等于父方法访问权限。 静态只能重写静态。但是这种情况一般不会出现。...抽象问题 A:抽象是否构造方法?能不能被实例化?如果不能为什么构造方法? 抽象构造方法。 抽象不能被实例化。 抽象构造方法子类实例化调用。...所以,不能用static修饰。 抽象可不可以没有抽象方法?如果可以,这样什么用? 抽象可以没有抽象方法。 抽象没有抽象方法作用,只是为了不让别的建立抽象对象。

33530

程序员56大Java基础面试问题及答案

==与equals区别 8.Object哪些公用方法 9.为什么Java里没有全局变量? 10.while循环和do循环什么不同? 11.char型变量不能存储一个中文汉字?为什么?...,如何跳出当前多重嵌套循环 49.Java定义一个不做事且没有参数构造方法作用 50.调用子类构造方法之前会先调用父没有参数构造方法,其目的是?...equals Object与==是一样子类一般需要重写方法。 hashCode 方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。...notify 唤醒对象上等待某个线程。 notifyAll 唤醒对象上等待所有线程。 toString 转换成字符串,一般子类都有重写,否则打印句柄。 9.为什么Java里没有全局变量?...因此,如果父只定义了参数构造方法,而在子类构造方法又没有用super()来调用父特定构造方法,则编译时将发生错误,因为Java程序找不到没有参数构造方法可供执行。

14020

JAVA 1-6章测试题

Native:集成其他语言代码,java没有代码体 默认:系统默认只能在同一个包访问方法 41、、抽象、接口之间关系?...2>子类方法必须和父方法具有相同方法名、参数列表和返回值 3>子类可以定义与父方法同名方法,以便在子类隐藏父方法 4>父方法不能子类重写成实例方法,而父实例方法不能子类隐藏为方法...5>父private、final修饰方法不能被重写;子类方法不能缩小父访问权限;子类方法不能抛出比父方法更多异常。...为什么? 答:。 1>方法内部类只能在定义内部类方法内实例化,不可以在此方法外对其实例化。 2>方法内部类对象不能使用内部类所在方法非final局部变量。...抽象可以没有抽象方法,但含有抽象方法必须申明为抽象。 51、静态内部类可以静态成员,而非静态内部类则不能有静态成员对为什么? 答:对!

83030

泛型接口,泛型和泛型通配符

java零基础入门-高级特性篇(六) 泛型 泛型使用位置,除了最常见约束集合元素,还可以使用在接口,方法上面。...2.再看另一个问题,如果父是泛型类型,如何定义子类? ? 泛型子类 如果将一个定义为泛型,那么创建泛型子类时候不能子类直接继承泛型,而是需要指定父泛型类型。...比如父是Book,子类不能直接extends Book,而是需要指定T类型,上例中使用Book作为类型。 java,泛型不能继承和实现。为什么?WHY?...访问通配符泛型List时候,集合里元素只能当做Object来访问,因为定义时候只是一个通配符,不是具体类型,所以不能进行类型转换只能作为Object访问。 2.不能使用add方法。...定义通配符以后,使用通配符方法里是不知道类型,所以不能使用add方法。 ? 不能用add方法 就算是Object类型也不能使用add方法为什么?假设可以添加,会发生什么问题?

2.2K20

你真的了解Override,属性能够被重写

最近想到了一个问题,Java属性能够被Override?首先让我们看一下下面这个继承例子。...你脑袋里是不是充满了问号上面的例子定义了一个隐藏字段。,与父字段具有相同名称字段为隐藏字段,即使它们类型不同。子类,父字段不能通过其简单名称引用。...相反,字段必须通过父访问。一般来说,我们不建议隐藏字段,因为它使代码难于阅读。 从这个定义,成员字段不能方法一样被重写。当子类定义具有相同名称字段时,子类仅声明一个新字段。...超字段是隐藏。它没有被重写,所以它不能被多态访问。 那么,怎样去访问隐藏字段呢?...两种方法可以供选择: 就像上面的例子c2.s一样,通过申明父去调用 将子类强制转化成父类型再来调用:((Super)c1).s 最后,实际开发中就不要申明隐藏字段了,毕竟这种代码容易引起误解。

75120

JAVA零基础入门系列】Day13 Java继承与多态

(滑稽)   开个玩笑,这里继承跟我们现实生活中继承还是很大区别的,一个可以继承另一个,继承内容包括属性跟方法,被继承被称为父或者基,继承称为子类或者导出子类可以调用父方法和变量...java,只允许单继承,也就是说 一个最多只能显示地继承于一个父。但是一个却可以被多个继承,也就是说一个可以拥有多个子类。这就相当于一个人不能有多个父亲一样(滑稽,老王表示不服)。   ...1)能够继承父public和protected成员方法不能够继承父private成员方法;   2)对于父访问权限成员方法,如果子类和父同一个包下,则子类能够继承;否则,子类不能够继承...具体访问控制表现如下:   private修饰属性或方法为该类所特有,在任何其他中都不能直接访问;   default修饰属性或方法具有包访问特性,同一个包其他可以访问;   protected...修饰属性或方法同一个其他可以访问,同时对于不在同一个包子类也可以访问;   public修饰属性或方法外部类中都可以直接访问

93950

你真的了解Override,属性能够被重写

最近想到了一个问题,Java属性能够被Override?首先让我们看一下下面这个继承例子。...答案跟我们预料一样,输出结果如下: Sub Super 不觉得奇怪?我们确实创建了两个Sub对象,但是为什么第二个输出结果却是Super。Override在你心目中是不是一个惊叹号?...上面的例子定义了一个隐藏字段。,与父字段具有相同名称字段为隐藏字段,即使它们类型不同。子类,父字段不能通过其简单名称引用。相反,字段必须通过父访问。...从这个定义,成员字段不能方法一样被重写。当子类定义具有相同名称字段时,子类仅声明一个新字段。超字段是隐藏。它没有被重写,所以它不能被多态访问。 那么,怎样去访问隐藏字段呢?...两种方法可以供选择: 就像上面的例子c2.s一样,通过申明父去调用 将子类强制转化成父类型再来调用:((Super)c1).s 最后,实际开发中就不要申明隐藏字段了,毕竟这种代码容易引起误解。

67240

Java基础知识面试题(2020最新版)

对象实例与对象引用何不同? 变量与方法 成员变量与局部变量区别有哪些 Java定义一个不做事且没有参数构造方法作用 调用子类构造方法之前会先调用父没有参数构造方法,其目的是?...重写:子类对父某些方法进行重新定义,调用这些方法时就会调用子类方法。 向上转型:多态需要将子类引用赋给父对象,只有这样引用才能够具备技能调用父方法子类方法。...它需要提供接口中所有声明方法实现 构造器 抽象可以构造器 接口不能有构造器 访问修饰符 抽象方法可以是任意访问修饰符 接口方法默认修饰符是public。...Java定义一个不做事且没有参数构造方法作用 Java程序执行子类构造方法之前,如果没有用super()来调用父特定构造方法,则会调用父“没有参数构造方法”。...因此,如果父只定义了参数构造方法,而在子类构造方法又没有用super()来调用父特定构造方法,则编译时将发生错误,因为Java程序找不到没有参数构造方法可供执行。

91130

Java基础知识面试题(2020最新版)

对象实例与对象引用何不同?     变量与方法成员变量与局部变量区别有哪些Java定义一个不做事且没有参数构造方法作用在调用子类构造方法之前会先调用父没有参数构造方法,其目的是?...重写:子类对父某些方法进行重新定义,调用这些方法时就会调用子类方法。  向上转型:多态需要将子类引用赋给父对象,只有这样引用才能够具备技能调用父方法子类方法。 ...它需要提供接口中所有声明方法实现构造器抽象可以构造器接口不能有构造器访问修饰符抽象方法可以是任意访问修饰符接口方法默认修饰符是public。...Java定义一个不做事且没有参数构造方法作用  Java程序执行子类构造方法之前,如果没有用super()来调用父特定构造方法,则会调用父“没有参数构造方法”。...因此,如果父只定义了参数构造方法,而在子类构造方法又没有用super()来调用父特定构造方法,则编译时将发生错误,因为Java程序找不到没有参数构造方法可供执行。

32710

Java基础知识面试题(2020最新版)

对象实例与对象引用何不同?     变量与方法成员变量与局部变量区别有哪些Java定义一个不做事且没有参数构造方法作用在调用子类构造方法之前会先调用父没有参数构造方法,其目的是?...重写:子类对父某些方法进行重新定义,调用这些方法时就会调用子类方法。  向上转型:多态需要将子类引用赋给父对象,只有这样引用才能够具备技能调用父方法子类方法。 ...它需要提供接口中所有声明方法实现构造器抽象可以构造器接口不能有构造器访问修饰符抽象方法可以是任意访问修饰符接口方法默认修饰符是public。...Java定义一个不做事且没有参数构造方法作用  Java程序执行子类构造方法之前,如果没有用super()来调用父特定构造方法,则会调用父“没有参数构造方法”。...因此,如果父只定义了参数构造方法,而在子类构造方法又没有用super()来调用父特定构造方法,则编译时将发生错误,因为Java程序找不到没有参数构造方法可供执行。

44631

面向对象之封装和多态

封装(encapsulation) 为什么需要封装?封装作用和含义? 我要看电视,只需要按一下开关和换台就可以了。必要了解电视机内部结构必要碰碰显像管?...使用访问控制符,实现封装 范围越来越大 同一个 同一个包 子类 所有 private * default(即不加修饰符时候) * * protected * * * public...运行时类型(运行时,具体是哪个子类就是哪个子类为什么会有这俩种类型呢 发生多态时,编译时看编译时类型,运行时看运行时类型。 ? 注:看代码里注释,我结合代码分析了多态。 ?...JAVA 除了 final 、final 方法、static 方法(因为这些是不可变数据,在编译时期已经确认),其他所有方法都是 JVM 在运行期才进行动态绑定。...对应上面那个代码例子: ((Circle) shape).area(); 一个父引用类型变量可以“指向”其子类对象。 一个父引用不可以访问子类对象新增加成员(属性和方法)。

44410

【JavaSE专栏59】方法重写概念及优先级问题,面向对象多态性机制

方法重写特点有如下 4 点,请同学们认真学习。 子类重写方法必须与父被重写方法具有相同方法签名。 重写方法访问修饰符不能比被重写方法访问修饰符更严格。...重写方法不能使用比被重写方法更窄访问修饰符,例如,如果父方法是 protected,那么子类重写方法可以是 protected 或 public,但不能是 private。...---- 二、为什么需要用到方法重写 Java 需要使用方法重写主要原因是实现多态性和代码灵活性。 多态性:方法重写是实现多态性重要手段之一。...---- 三、方法重写优先级问题 Java 方法重写优先级是基于继承关系。 如果子类重写了父方法,那么调用方法时会优先调用子类重写方法。...如果父方法是 final ,能够被子类重写? 调用重写方法时候,到底调用父方法还是子类方法? 能否调用子类重写方法方法重写和多态之间关系是什么?

20750

62道Java核心面试题,这次全了

Java ,抽象用于创建具有某些被子类实现默认方法,一个抽象可以有没有方法抽象方法,也可以和普通一样有方法方法。...接口中变量只能是隐式常量,抽象可以任意类型变量。 如果一个抽象 main() 方法,则可以运行它;但接口不能。...public interface C extends A,B{ } 从 Java 8 开始,接口可以默认方法,所以当多个接口中存在相同默认方法时,需要在实现接口中提供方法实现。...我们可以一个定义一个,这个被称为内部类。内部类可以访问外部类所有变量和方法,内部类不能有任何静态变量。 44、什么是匿名内部类?...当在子类重写了父方法时,可以通过 super 关键字访问方法。 也可以使用 super 关键字子类构造方法调用父构造方法,它必须是构造方法第一条语句。

62220

Java面向对象三大特性(封装、继承、多态)

Java不同于C++/Python,JAVA中一个子类只能继承一个父(单继承) 子类会继承父所有public 字段和方法. 对于父 private 字段和方法, 子类是无法访问....来看一个列子: 当我们自己给父写了一个构造方法后,两个子类都报错了,是什么原因呢? 因为当子类继承父后,构造子类之前,就必须先帮父进行构造。...this.name = name; } } (4) 小结 总结: Java 对于字段和方法共有四种访问权限 1.private: 内部能访问, 外部不能访问 2.默认(也叫包访问权限)...: 内部能访问, 同一个包可以访问, 其他不能访问. 3.protected: 内部能访问, 子类和同一个包可以访问, 其他不能访问. 4.public : 内部和调用者都能访问...和多态什么关系? 当我们在这个代码添加一个drawMap方法后 运行结果 这不就是动态绑定

28030

(16) 继承细节

第一次输出是new过程输出new过程,首先是初始化父,父构造方法调用test(),test被子类重写了,就会调用子类test()方法子类方法访问子类实例变量a,而这个时候子类实例变量赋值语句和构造方法还没有执行...像这样,构造方法调用可被子类重写方法,是一种不好实践,容易引起混淆,应该只调用private方法。...对于private变量和方法,它们只能在内被访问访问也永远是当前,即在子类访问子类访问,它们只是碰巧名字一样而已,没有任何关系。...外,则要看访问变量静态类型,静态类型是父,则访问变量和方法,静态类型是子类,则访问子类变量和方法。...另外,Java,protected还表示可被同一个包其他访问,不管其他是不是该类子类,后续章节我们再讨论包。

66890
领券