我只是好奇他们的待遇是否有所不同。例如,如果我们有:界面:publicinterfaceTest{publicvoidmethod();}和抽象类:publicabstractclassTest{publicabstractvoidmethod();}JVM会以不同方式对待这些类吗?两者中哪一个在存储期间占用更多磁盘空间,哪个将使用最多的运行时内存哪个执行更多操作(性能更好).这个问题不是关于何时使用接口(interface)或抽象类。 最佳答案 Yes,theyaredifferent.Withaninterface,client
我正在处理一个项目,其中我为每种可能的异常情况编写了一个异常。关键是我发现它更具“可读性”,但我收到了大量不同的异常。这样做被认为是一种好的做法吗?或者我应该只写更抽象的异常,以便没有那么多?非常感谢您的宝贵时间。 最佳答案 哪个更好取决于您的代码捕获特定异常的可能性。如果您只可能捕获(或以其他方式区分)更一般的(父类(superclass))异常,那么拥有许多更具体的(子类)异常并不会取得多大成就。在这种情况下,最好定义更少的异常并使用异常消息来表达出错的更详细信息。另一方面,如果特定的异常已经存在,那么使用它们是有意义的。只是抛
我有很多抽象类的子类,每个子类都声明了一个同名的publicstaticfinal字段。我在考虑在抽象父类(superclass)中有这个字段而不初始化它,并希望每个子类都被强制初始化它。我之所以想到这一点,是因为我的抽象类的所有子类都声明了一个名为UNIQUE_ID的公共(public)静态最终字符串字段,并且每个子类都必须声明一个具有完全相同名称的字段。我希望我的问题足够清楚,如果不是请告诉我。可以做一些或多或少等同于此的事情吗?编辑:添加代码:我的抽象类如下所示:publicabstractclassExperimentPanelModelextendsPanelizable{p
我正在尝试确定通用类对象是否是抽象类的实例。到目前为止,我运气不佳。下面是我正在尝试使用的代码。AbstractActivity是我从中扩展一些Activity的父类的名称。publicvoidstartActivity(Intentintent){ComponentNamename=intent.getComponent();if(name!=null){Classcls=null;try{cls=Class.forName(name.getClassName());if(cls.isInstance(AbstractActivity));{//dosomething}else{su
我正在玩弄Java的反射。我有一个带有构造函数的抽象类Base。abstractclassBase{publicBase(Stringfoo){//dosomemagic}}我还有一些扩展Base的类。它们不包含太多逻辑。我想用Base的构造函数实例化它们,而不必在那些派生类中编写一些代理构造函数。当然,我想用反射来实例化那些派生类。说:Classcls=SomeDerivedClass.class;Constructorconstr;constr=cls.getConstructor(newClass[]{String.class});//willreturnnullClasscls
类前面需要加abstract关键字吗?或者它是否需要有未实现的(抽象的)方法?任何普通类都可以扩展吗? 最佳答案 是的,所有非final的方法(static与其他方法也有点不同)都可以被覆盖,除非类本身被声明为final。仅当您不在基类中提供任何实现时才使用抽象方法。 关于java-Java中可以扩展(继承)非抽象类吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/958505
我使用GWT和Place&Activity机制。很遗憾Place是一个类,因为我的自定义place不能扩展另一个类。当我查看Place代码时,我看到以下内容:publicabstractclassPlace{/***Thenullplace.*/publicstaticfinalPlaceNOWHERE=newPlace(){};}可见,Place可以是一个接口(interface)。GWT团队选择将Place设为抽象类而不是接口(interface)是否有充分的理由?概括地说:是否有充分的理由创建真正空的抽象类与接口(interface)? 最佳答案
在Java中,我定义了一个抽象类,里面既有具体的方法,也有抽象的方法,而且必须由第三方开发者独立子类化。只是为了确定:我是否可以对抽象类进行任何更改,使其与它们的类源代码兼容但二进制不兼容?换句话说:在他们编译了他们的子类之后,我可以改变抽象类-除了例如向其中添加一个抽象方法或从中删除一个由子类调用的protected方法,这些子类当然是源代码不兼容的——以一种可能迫使他们重新编译其子类的方式? 最佳答案 如果现在更改您的系统还为时不晚,我建议您这样做。覆盖通常不是自定义功能的好方法,因为它非常脆弱。例如,如果您稍后使用您的客户使用
现在,我们知道Java8在接口(interface)中引入了默认方法和静态方法。接口(interface)最初是在Java中引入的,以避免thediamondproblem发生在C++中的多重继承中。但是随着Java8在接口(interface)中引入默认方法,现在Java也引入了之前版本避免的菱形问题。不需要强制覆盖默认方法。但是当使用接口(interface)出现菱形问题时,实现这些接口(interface)的类必须覆盖默认方法。所以现在,我有三个问题:为什么需要默认方法?我们不能通过类本身进行多重继承,而不是在接口(interface)中使用默认方法吗?如果他们必须在Java8中
这个问题在这里已经有了答案:Java8:virtualextensionmethodsvsabstractclass(5个答案)关闭9年前。我在探索Java8的特性时遇到了“函数式接口(interface)”。根据我的理解,这些接口(interface)可以有一些默认实现的方法:@FunctionalInterfacepublicinterfaceComplexFunctionalInterfaceextendsSimpleFuncInterface{defaultpublicvoiddoSomeWork(){System.out.println("Doingsomeworkinint