Tag: 抽象

为什么抽象方法只能在抽象类中声明?

我知道在抽象类中,方法既可以是抽象的,也可以不是抽象的。 但为什么我不能在“普通”非抽象类中创建抽象方法呢? 提前感谢您的任何解释!

抽象类应该至少有一个抽象方法吗?

抽象类是否有必要至少有一个抽象方法?

如何访问Abstract超类实例变量

所以我有两个class: Property和Houses 。 Property是抽象超类,而Houses是它的子类。 这是Property的代码 public abstract class Property{ String pCode; double value; int year; public Property(String pCode, double value , int year){ this.pCode = pCode; this.value = value; this.year = year; } public Property(){ pCode = “”; value = 0; year = 0; } public abstract void depreciation(); //Accessors private String getCode(){ return pCode; […]

在处理inheritance时重写equals方法

我一直在阅读在处理子类时如何最好地覆盖equals方法,在这里我发现了不少post。 他们建议使用instanceof或getClass()来实现解决方案的不同方法来比较不同子类的对象。 但是参考Effective Java,我的理解是(我是新手,所以我可能错了!)Bloch认为最终两者都有问题,“没有办法扩展可实例化的类并添加一个值组件,同时保留等于合同,除非你愿意放弃面向对象抽象的好处“。 然后建议“赞成合成而非inheritance”。 所以我正在处理这个类层次结构:AbstractClass,ConcreteClass1和ConcreteClass2。 ConcreteClass1扩展了AbstractClass,ConcreteClass2扩展了ConcreteClass1。 目前只有AbstractClass重写了equals方法。 所以在AbstractClass中: public abstract class AbstractClass { private String id; public boolean equals(Object other) { return other != null && other.getClass().equals(getClass()) && id.equals(((AbstractClass) other).id); } } 在ConcreteClass1我有: public class ConcreteClassOne extends AbstractClass { private final AbstractClass parent; public ConcreteClassOne( String anId, AbstractClass aParent ) { super( anId ); […]

有没有办法确保实现接口的类实现静态方法?

首先,我阅读了erickson对“为什么我不能在Java接口中定义静态方法?”的有用回复。 。 这个问题不是关于“为什么”而是关于“如何呢?”。 编辑:我原来的例子不合适,但我会把它留在下面。 虽然我现在确信在大多数情况下我想做的事情是矫枉过正,但有一种情况可能需要它: 我将再次参加ParametricFunction示例。 现在让我们看一个复杂的函数,比如Bessel函数 ,其中查找表是合适的。 这必须初始化,因此两个选项是将参数直接传递给构造函数或提供init(double[] parameters) 。 后者的缺点是getValue(double x)必须检查每次调用的初始化(或者ArrayIndexOutOfBoundsException必须被视为初始化检查),因此对于时间要求严格的应用程序,我更喜欢构造函数方法: interface ParametricFunction { public double getValue(double x); } class BesselFunction implements ParametricFunction { public BesselFunction(double[] parameters) { … } public double getValue(double x) { … } } 这涉及另一个问题,接口中构造函数的不可能性。 那里有什么好的解决方案? 我当然可以使用init(double[] parameters)方法,但我之所以提到我的原因。 (编辑:好的,这里实现接口的抽象类会这样做) 现在让我们假设ParametricFunction只允许某些参数,例如正整数。 如何检查传递给构造函数的参数的真实性? 抛出IllegalArgument checkParametersValidity(double[] parameters)是可能的,但checkParametersValidity(double[] parameters)似乎更方便。 但是在构造之前需要检查参数,因此它必须是静态方法。 这就是我真正想知道的方法,以确保实现ParametricFunction接口的每个类都确实定义了这个静态方法。 我知道这个例子是相当人为的,不仅仅是通过接口使用init方法的原因值得商榷,我仍然想知道答案。 如果您不喜欢它,请将其视为学术问题。 […]

Java – 包含变量的抽象类?

让抽象类定义实例变量是一种好习惯吗? public abstract class ExternalScript extends Script { String source; public abstract void setSource(String file); public abstract String getSource(); } 然后子类ExternalJavaScript.class会自动获取源变量,但是如果所有子类本身都定义了源代码而不是inheritance,我觉得读代码更容易。 你有什么建议吗? /亚当

抽象类中受保护的数据

我的问题涉及专门的Java,抽象类和受保护数据的使用。 我被告知所有数据都应该是私有的,并且仅使用受保护的getter / setter。 现在,我理解我们希望屏蔽数据,使其免受该类临时用户的直接操作,并且公共数据成员通常是一个值得怀疑的做法。 我看过“Java protected fields vs public getters”( Java protected fields vs public getters ),但我仍然怀疑: protected int i; 在抽象类中比在以下情况更糟糕: private int i; protected int geti(); protected void seti(int j); 当抽象类准确地为子类提供父/公共设施时,我只是没有看到缺点,受保护的范围旨在提供对子项的访问,同时保护数据免受临时用户的影响。 我在上面提到的问题中指出,大多数答案似乎都解决了为什么数据一般应该是私有而不是公开的问题。 我试图将我的问题专门集中在一个抽象的父母中存在的数据,供孩子们使用。 我迄今听到的唯一合理的评论是,使用父母受保护的数据(例如,上面的int i)会在子类中留下引用未在子类中声明的变量的代码。 不太引人注目的是参数(参见基类中的公共受保护数据成员? ),您可能希望某天更改访问权限,现在您必须尊重您的界面。 这是一个抽象类,旨在100%扩展。 谢谢! 特定标题/页面#对书籍的引用对于引用“..anyany basic Java programming text …”更有帮助。 ========================================== 10-13-2010 这是关于抽象类的问题,因为它与受保护的数据有关。 我觉得令人失望的是,在OOP中数据隐藏是否是一件好事的回答似乎已经转移(答案:是)。 这里有很多深度涉及抽象类的性质,以及它与常规非final类的区别,以及在抽象父类中修复数据项的名称和类型可能有哪些可能的优点供儿童class。 我认为这里有可能将创新和更大的控制从抽象父类扩展到实现子类。 我担心一般原则,例如数据隐藏的优点,可能成为教条,并抑制创新和新模式和想法的发展。 感谢所有贡献者。

我应该扩展ArrayList以添加非null的属性吗?

我想将一个对象集合添加到arrayList,只有当特定属性不为null时。 我正在考虑扩展ArrayList并在子类中实现检查。 另一种方法是在将它放入Arraylist之前检查属性,但这意味着,如果我需要根据逻辑将对象添加到arraylist,我必须分散if检查每个位置。 我想知道你对它的想法……再想一想,这是一种矫枉过正吗?

没有“抽象”的Java中的运行时多态性?

我正在阅读官方的Oracle教程,其中介绍了多态性的概念,以及3个类的类层次结构的示例; 自行车是超类,MountainBike和RoadBike是2个子类。 它显示了2个子类如何重写在Bicycle中声明的方法“printDescription”,通过声明它的不同版本。 最后,在最后,教程提到Java虚拟机(JVM)为每个变量中引用的对象调用适当的方法。 但是,关于多态性的教程没有提到“抽象”类和方法的概念。 除非将Bicycle中的printDescription()声明为“abstract”,否则如何实现运行时多态性? 我的意思是,在这个例子中,基于什么提示,编译器决定在编译时不将方法调用绑定到引用类型,并认为它应该留给JVM在运行时处理? 以下是使用的示例: public class Bicycle { public int cadence; public int gear; public int speed; public Bicycle(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; } public void setCadence(int newValue) { cadence = newValue; } public void setGear(int newValue) { gear = […]

抛出的Java抽象类

如果我有一个具有以下function的抽象类 – abstract class A{ void foo(String s) throws Exception{ throw new Exception(“exception!”); } } 然后是另一个扩展抽象类并实现自己的foo版本的类 – class B extends A{ void foo(String s){ //do stuff that does *not* throw an exception } } 这会产生问题吗? 具体在以下测试案例中 – Collection col = new Collection(); B b = new B(); col.add(b); for(A a : col){ a.foo(); } 我做了一些测试,似乎没有什么破坏,但我不明白为什么B的foo被调用而不是A的