Java私有构造函数不能阻止继承

下面是一个调用已经私有化的单列的函数的列子. 这里用了静态内部类,关键就是静态内部类可以访问外部类的私有构造函数。

这种算是变种继承吧。前提是可以在原来的单列类里添加代码。

class Single {

private Single(){
                System.out.println("Single");
        }
        
        public void runSingleMethod()
        {
                System.out.println("runSingleMethod");
        }
        public static class Evil extends Single
        {
                public Evil(){
                        System.out.println("Evil");
                }
        }
}

public class SingleTest extends Single.Evil
{
        public SingleTest()
        {
                System.out.println("normal");
        }
        
        public static void main(String[] args) {
                SingleTest a = new SingleTest();
                a.runSingleMethod();
        }
}

output:

Single
Evil
normal
runSingleMethod

这个列子表明,要阻止继承,还是得靠关键字 final.
我不知道 可不可以用字节码增加包 比如ASM 包动态的给Single类增加上面的那段静态类代码,但是有一点在这里可以确认就是私有函数不能完全阻止继承。

Java私有构造函数不能阻止继承,布布扣,bubuko.com

时间: 2024-10-11 07:31:05

Java私有构造函数不能阻止继承的相关文章

四. Java继承和多态8.Java final关键字:阻止继承和多态

在 Java 中,声明类.变量和方法时,可使用关键字 final 来修饰.final 所修饰的数据具有"终态"的特征,表示"最终的"意思.具体规定如下: final 修饰的类不能被继承. final 修饰的方法不能被子类重写. final 修饰的变量(成员变量或局部变量)即成为常量,只能赋值一次. final 修饰的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有 一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用. final 修饰的局部变

10.Java final关键字:阻止继承和多态

在 Java 中,声明类.变量和方法时,可使用关键字 final 来修饰.final 所修饰的数据具有“终态”的特征,表示“最终的”意思.具体规定如下: final 修饰的类不能被继承. final 修饰的方法不能被子类重写. final 修饰的变量(成员变量或局部变量)即成为常量,只能赋值一次. final 修饰的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有 一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用. final 修饰的局部变量可以只声明不赋值,然后再进行

java构造函数是否可继承,以及子类构造函数可否不使用super调用超类构造函数

问题一:java的构造函数能否被继承? 笔者初学java看的一本书说:“java的子类自然的继承其超类的“非private成员”. 通常java的构造函数被设置为public的(若你不写构造函数,java自动添加的无参空构造函数就是public的),因本文中的类都在同一个包中,因此使用无修饰的友好权限说明问题,对于private构造函数的意义,可参见这里. 那么根据该书所述规则,非private的构造函数当然也应该被子类继承. 但实际上,子类不仅无法继承private成员,也无法继承构造函数.

Java知多少(34)final关键字:阻止继承和多态

在 Java 中,声明类.变量和方法时,可使用关键字 final 来修饰.final 所修饰的数据具有“终态”的特征,表示“最终的”意思.具体规定如下: final 修饰的类不能被继承. final 修饰的方法不能被子类重写. final 修饰的变量(成员变量或局部变量)即成为常量,只能赋值一次. final 修饰的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有 一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用. final 修饰的局部变量可以只声明不赋值,然后再进行

java中私有构造函数的作用

1. 强调类的单例模式 public class Elvs { //公有的静态域,来说明该类只能有一个实例(实例化一次后,后面都是同一个实例) public static final Elvs INSTANCE=new Elvs(); private Elvs(){}//将构造函数定义为私有变量后,就不能在外部去调用构造函数实例化类了 public void sys() { System.out.println("******"); } } public class Main { pu

python-装饰器,类与对象,私有字段,析构,__call__,继承,多继承,接口

1.装饰器执行流程 装饰器:将原函数替换为wrapper函数 def outer() @outer  --- func1作为参数传入outer() def wrapper()  --- wrapper()放入内存 return wrapper   --- 返回wrapper地址,Func1重新赋值为wrapper Func1()  --- 调用func1函数 def wrapper() print '验证' def Func1() print 'func1' [[email protected]

Java核心技术 第五章 继承

类.超类.子类: 子类方法不能直接访问超类的私有域. this和super并非引用,不能将其赋给另一个对象变量. super在构造器中的应用: public Manager(String n, double s, int year, int month, int day ) { super(n, s, year, month, day) ; bonus = 0 ; } 使用super调用构造器的语句必须是子类构造器的第一条语句. 如果子类构造器没有显示的调用超类的构造器,则将自动的调用超类默认(

详解Java中代码块和继承

本文发表于个人GitHub主页,原文请移步详解Java中代码块和继承 阅读. 概念 1.代码块 局部代码块 用于限定变量生命周期,及早释放,提高内存利用率 静态代码块 对类的数据进行初始化,仅仅只执行一次. 构造代码块 把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块. 2.继承 继承是已有的类中派生出新的类,新的类能够吸收已有类的数据属性和行为,并能扩展新的功能. 代码块的执行顺序 public class Test {    public String name

Java 第十二章 继承 笔记

Java 第十二章  继承 笔记 一.使用继承:     1)方便修改代码     2)减少代码量 二.super 继承object 类:super 访问父类的无参构造:super 指的是object 的无参构造.     例:子类调用父类:super.属性 / super.方法    注意:子类不能继承父类私有属性:得用set.get方法来调用:    super只能写在代码块的第一句:super只能调用非私有的方法:    super只能出现在子类的方法和构造方法中. 三.不能被继承的父类成