草庐IT

Inheritance

全部标签

java - Java 中的构造函数保证了哪些属性?

我曾经认为,从直觉上讲,Java中的构造函数就是创建对象的东西,在其构造函数返回之前,没有任何东西可以触及该对象。然而,我一次又一次地被证明是错误的:共享this可以泄露未初始化的对象uninitializedobjectscanbeleakedbyasubclassaccessingitfromthefinalizeruninitializedobjectscanbeleakedtoanotherthreadbeforethey'refullyconstructed所有这些事实都违背了我认为构造函数是什么的直觉。我再也不能自信地说出构造函数在Java中的实际作用,或者它的用途。如果我

java - 在同一个包中子类化 sun.* 类会给出 IllegalAccessError

前言:我要告诉你的是错误的,我很清楚我做这种愚蠢的事情破坏封装是多么糟糕。我不打算解决任何更一般的I/O问题。这只是一个实验。我正在尝试对sun.nio.ch.SourceChannelImpl进行子类化,这是包私有(private)类,在JDK(在rt.jar中)中存在包私有(private)构造函数,所以我必须在sun.nio.ch包。这是我的子类:packagesun.nio.ch;importjava.io.FileDescriptor;importjava.nio.channels.spi.SelectorProvider;classMySourceChannelextend

java - 一种将可变数据结构声明为输出并实际返回不可变数据结构的方法

最近,我对这个问题进行了热烈的讨论。假设我在Java中创建了这个方法:publicSetgetRich(){returnImmutableSet....;}每当我在拉取请求中看到这一点时,我都会大喊并试图解释为什么它是错误的。通过这样做,我通过promise他们将获得Set误导了我的方法的消费者。这意味着他们可以删除或添加元素。javac会愉快地编译它,但会抛出RuntimeException。此外,它违反了“里氏替换原则”。就个人而言,我总是这样做:publicImmutableSetgetRich(){returnImmutableSet....;}这样一来,没人会搬起石头砸自己的

java - 如何在不重复代码的情况下编写子类构造函数?

我想在一个抽象父类(superclass)的构造函数中调用一个抽象方法generateId(),这个抽象方法依赖于各个子类的一些字段。为清楚起见,请考虑以下代码片段:抽象类:SuperClasspublicabstractclassSuperClass{protectedStringid;publicSuperClass(){generateId();}protectedabstractvoidgenerateId();}子类:Sub1publicclassSub1extendsSuperClass{privateSomeTypefieldSub1;publicSub1(SomeTyp

Java 编译器 super() 构造函数将军

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Useof‘super’keywordwhenaccessingnon-overriddensuperclassmethods我是Java的新手,最近阅读了很多有关它的文章,以获取更多关于该语言的知识和经验。当编译器插入自动代码时,我有一个关于继承方法和扩展类的问题。我一直在阅读,如果我使用一些方法创建类A,比如一个名为checkDuePeriod()的方法,然后创建一个扩展类A及其方法的类B。如果我随后在B类中调用方法checkDuePeriod()而不使用super.checkDuePeriod()语法,

java - 当我定义接口(interface)方法的参数 final 时,我需要在实现中重复 final 吗?

这个问题在这里已经有了答案:Finalargumentsininterfacemethods-what'sthepoint?(5个答案)关闭9年前。所以我需要在下面的情况下重复final吗?interfaceFoo{voidmeth(finalBarbar);}publicBazimplementsFoo{@Overridevoidmeth(/*isitfinal?*/Barbar){}}问题不仅是接口(interface)继承,还有类继承——我猜答案是一样的

java - 强制两个相似的类表现得好像它们在 Java 中是多态的

摘要:我想与共享许多相似功能的两个类('Item'和'Block')交互,就好像它们是从具有这些功能的接口(interface)实现的一样,但它们不是,我无法编辑它们。我有什么选择来处理这个问题?我是否一直在编写superhacky代码?详细信息:我正在使用Java开发minecraftmod,使用minecraft的一部分是我无法编辑游戏的基本代码。游戏有两个基本类别;“Block”和“Item”,这两者共享许多功能,但是开发人员并没有让它们实现一个接口(interface)(我希望它们有)。为了保持我的代码干净并避免大量if语句在处理Blocks和Items之间切换,我想将两者都保

java - 为什么我们需要允许接口(interface)只从 java.lang.Object 而不是任何其他类扩展?

这个问题在这里已经有了答案:WhyObjectclassmethodsareavailableininterface?(5个答案)关闭7年前。AspermyunderstandingfromsomebooksonJava,interfacescannotextendclasses.ButallinterfacesdoinheritmethodsfromObjectclass.Whyisthisso?如果接口(interface)不是从对象类扩展的。那么这段代码是如何工作的呢?interfaceA{publicbooleanequals(Objecto);}classInterfaceA

java - 从不同特征继承同名方法

我有一个trait扩展了另外两个trait,这两个trait的函数名称相同,但内部有点不同,我想知道如何知道将调用哪个函数?我有具有print()的特征B和具有print()的特征C,如果我像这样继承它们:traitAextendsBwithC{defprint()}每个打印打印其他东西,哪个打印将被调用? 最佳答案 在名称冲突的特殊情况下,您将收到编译时错误。假设D是实现类:classDextendsAwithCwithBdefmain(args:Array[String]):Unit={vald=newDprintln(d.pr

java - 使用 AspectJ 模拟接口(interface)和方法的注解继承

经常有人问AspectJ这样的问题,所以我想在以后可以轻松链接到的地方回答它。我有这个标记注释:packagede.scrum_master.app;importjava.lang.annotation.Inherited;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;@Inherited@Retention(RetentionPolicy.RUNTIME)public@interfaceMarker{}现在我像这样注释接口(interface)和/或方法:packaged