以下是代码段:
public abstract class MyAbstractClass {
public abstract void a();
public abstract void b();
}
public class Foo extends MyAbstractClass {
public void a() {
System.out.println("hello");
}
public void b(){
System.out.println("bye");
}
}
public class Bar extends MyAbstractClass {
public void a() {
System.out.println("hello");
}
public void delta() {
System.out.println("gamma");
}
}
Run Code Online (Sandbox Code Playgroud)
我有几个问题:
问题1: - 我应该在abstract课堂上实现所有方法吗?
问题2: - 实现类可以有自己的方法吗?
mde*_*itt 44
当你扩展一个Interface或一个Abstract类时,你正在创建一个与之类似的合同superclass.你在合同中说:
"我将在我的超类中实现所有未实现的方法"
如果不这样做,实施所有未实现的方法,那么你就违反了合同.一种不违反合同的方法是使你的子类Abstract以及一种说法
"我没有在合同中实现所有类,我将让我的子类实现它们".
为了您的类bar现在,你必须执行b()或作出bar一个Abstract类或者你没有履行与您的合同MyAbstractClass
基本思路是:
接口:我的方法都没有实现.子类必须实现我的所有方法才能实现我.(注意:我相信Java 8中已经添加了默认接口,这可能会稍微改变一下)
例:
public interface myInterface
{
//My subclasses must implement this to fulfill their contract with me
public void methodA();
//My subclasses must implement this to fulfill their contract with me
public void methodB();
}
Run Code Online (Sandbox Code Playgroud)
摘要:我可能会实现一些方法,但我也会将方法保留为抽象,以便我的子类必须实现,因为它们可以实现这些类,以便更好地满足它们的需求.
例:
public abstract class myAbstractClass
{
//My subclasses must implement this to fulfill their contract with me
public abstract void methodC();
public void helloWorld()
{
System.out.println("Hello World");
}
}
Run Code Online (Sandbox Code Playgroud)
Abstract类还可以扩展接口,以便它们可以实现一些方法.但是它们也可以保留一些未实现的方法,因此子类可以实现它们.如果保留未实现的接口方法,则不需要将其声明为抽象,它已经在合同中.
例:
public abstract class myAbstractClass2 implement myInterface
{
@Override
public void methodA()
{
// this fulfills part of the contract with myInterface.
// my subclasses will not need to implement this unless they want to override
// my implementation.
}
//My subclasses must implement this to fulfill their contract with me
public abstract void methodD();
}
Run Code Online (Sandbox Code Playgroud)
所以从本质上讲,抽象类与它的超类没有严格的契约,因为它可以将其方法委托给它的子类.
常规类 :(我使用常规表示非接口,非抽象).我必须从我的所有超类中实现所有未实现的方法.这些类具有约束力的合同.
例:
public class mySubClass extends myAbstractClass2
{
@Override
public void methodB()
{
//must be implemented to fulfill contract with myInterface
}
@Override
public void methodD()
{
//must be implemented to fulfill contract with myAbstractClass2
}
public void myMethod()
{
//This is a method specifically for mySubClass.
}
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*ian 20
问题1: - 我应该在abstract课堂上实现所有方法吗?
abstract方法.问题2: - 实现类可以有自己的方法吗?
tsk*_*zzy 10
您不仅应该,而且必须实现所有抽象方法(如果子类是非抽象的).否则,如果调用该方法,该子类的对象将不知道该怎么做!
防止这种情况的唯一方法是,如果也声明了子类abstract,那么它就不能在第一时间实例化.
您不必实现抽象类的所有方法。但是你必须实现它的所有抽象方法。
事实上,扩展抽象类与扩展普通类没有区别。这不像实现接口。由于您正在扩展,因此您正在创建一个子类,因此您可以根据需要添加任意数量的方法和属性。