首页
学习
活动
专区
工具
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里,允许为接口定义默认方法,类方法。 接口从宏观上来说,是从多个相似类中抽象出来的规范,接口不提供任何实现。说简单点,接口反映的是一类事物的方法。...非静态内部类不能拥有静态成员。 为什么静态内部的实例方法也不能访问外部类的实例属性? 因为静态内部类是外部类的类相关的,而不是外部类的对象相关的。

    65530

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

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

    5.2K21

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

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

    35330

    Java继承、finalprotected说明、superthis辨析

    都是Java中的关键字 //2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段 //3....在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在 //不同点 //1. this是当前对象的引用,当前对象即调用实例方法的对象, super相当于是子类对象中从父类继承下来部分成员的引用...在非静态成员方法中,this用来访问本类的方法和属性, super用来访问父类继承下来的方法和属性 //3....在构造方法中:this(...)用于调用本类构造方法, super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现 //4....里面创建一个该类的对象,就是不同包的子类(因为我们的创建的对象是实例化的test1里面的类,而这个test1就是子类),如果我们创建的是test2里面的实例化对象吗,这个时候就不可以访问父类的protected

    8110

    程序员的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程序在父类中找不到没有参数的构造方法可供执行。

    17720

    JAVA 1-6章测试题

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

    84930

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

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

    2.3K20

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

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

    98030

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

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

    34010

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

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

    80220

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

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

    98450

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

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

    68740

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

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

    45931

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

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

    64120

    面向对象之封装和多态

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

    46210

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

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

    28650

    Java基础60问

    如果修饰的变量是: 引用类型, 则该变量的地址值不能改变, 属性值可以改变. Q13:Java中常量有几种? 答:有两种, 分为自定义常量和字面值常量....Q20:Java中四舍五入的原理是什么? 答:+0.5, 然后计算该数字对应的: 地板数. Q21:Java中获取指定的随机数有几种方式? 答:1. 可以通过Math#random()实现. 2....Q52:为什么每个构造方法的第一行都有默认的super()? 答:用于子类对象访问父类数据前, 对父类数据进行初始化. Q53:为什么默认的super()都是空参构造, 而不是带参构造?...它们之间有什么关系? 答:抽象类的特点是: 不能实例化, 需要子类继承. 抽象方法的特点是: 没有方法体, 需要子类重写....抽象方法要求子类必须重写, 而final修饰的方法子类不能重写. Q60:Java中类和接口之间的关系是什么? 答:类与类之间: 继承关系, 只能单继承, 不能多继承, 但是可以多层继承.

    56010
    领券