作者:蚊子爱的 | 来源:互联网 | 2023-05-28 13:21
我有两个程序,一个使用接口实现,另一个只使用类实现 - 我读过使用接口的优点是它可以提供它自己的超类方法的实现,但可以使用抽象类或方法完成压倒一切的.接口有什么用途?
在什么样的层次结构和使用界面的情况下最有利?
接口
interface Shape
{
void area(int x, int y);
}
class Rectangle implements Shape
{
@Override
public void area(int length, int breadth)
{
System.out.println(length*breadth);
}
}
class Triangle implements Shape
{
@Override
public void area(int base, int height)
{
System.out.println(base*height);
}
}
public class ShapeUsingInterface
{
public static void main(String X[])
{
Rectangle r = new Rectangle();
Triangle t = new Triangle();
r.area(5, 4);
t.area(6, 3);
}
}
类
class Shape
{
void Area(int x, int y)
{
System.out.println(x*y);
}
}
class Rectangle extends Shape
{
}
class Triangle extends Shape
{
@Override
void Area(int base, int height)
{
System.out.println((0.5)*base*height);
}
}
public class CalculateArea
{
public static void main(String X[])
{
Rectangle r = new Rectangle();
Triangle t = new Triangle();
r.Area(4, 5);
t.Area(6, 8);
}
}
christopher..
9
要解释为什么使用接口,您必须首先了解继承问题.它被称为钻石问题.简单地说,如果一个类,D
从两个类继承B
和C
,并B
与C
来自同一个类继承两者A
,其中执行从方法A
确实D
得到什么?
我们留下的是Java不喜欢的方法歧义!因此,防止这种方式是确保D
能永远只能有一个超类,所以它可以从任何继承A
,B
或者C
,但从来没有超过一个.这样可以防止出现问题,但是我们失去了多重继承提供的所有优惠!
进入界面.这允许我们具有多重继承的特权(将单个类引用为各种不同的类型)并且仍然避免钻石问题,因为实现类提供了该方法.这消除了方法歧义.
这意味着,例如:
public abstract class MyClass {
public void doSomething();
}
public class MyConcreteClass extends MyClass {
public void doSomething() {
// do something
}
}
您可以引用MyConcreteClass
as 的实例
MyClass class = new MyConcreteClass();
要么
MyConcreteClass class = new MyConcreteClass();
但鉴于此实施,绝不是别的.你不能有extend
更多的课程,因为你可能会得到钻石问题,但你可以包括一个Interface
public class MyConcreteClass extends MyClass implements Serializable {
}
突然之间,你可以说......
Seralizable myClass = new MyConcreteClass();
因为myClass
是 Serializable
.当一个方法可能不需要知道它是一个实例时MyConcreteClass
,这对于将类彼此解耦是非常好的,只是它有一个必要的方法子集.
简而言之:您可以实现许多接口,但是您只能继承一个类.
1> christopher..:
要解释为什么使用接口,您必须首先了解继承问题.它被称为钻石问题.简单地说,如果一个类,D
从两个类继承B
和C
,并B
与C
来自同一个类继承两者A
,其中执行从方法A
确实D
得到什么?
我们留下的是Java不喜欢的方法歧义!因此,防止这种方式是确保D
能永远只能有一个超类,所以它可以从任何继承A
,B
或者C
,但从来没有超过一个.这样可以防止出现问题,但是我们失去了多重继承提供的所有优惠!
进入界面.这允许我们具有多重继承的特权(将单个类引用为各种不同的类型)并且仍然避免钻石问题,因为实现类提供了该方法.这消除了方法歧义.
这意味着,例如:
public abstract class MyClass {
public void doSomething();
}
public class MyConcreteClass extends MyClass {
public void doSomething() {
// do something
}
}
您可以引用MyConcreteClass
as 的实例
MyClass class = new MyConcreteClass();
要么
MyConcreteClass class = new MyConcreteClass();
但鉴于此实施,绝不是别的.你不能有extend
更多的课程,因为你可能会得到钻石问题,但你可以包括一个Interface
public class MyConcreteClass extends MyClass implements Serializable {
}
突然之间,你可以说......
Seralizable myClass = new MyConcreteClass();
因为myClass
是 Serializable
.当一个方法可能不需要知道它是一个实例时MyConcreteClass
,这对于将类彼此解耦是非常好的,只是它有一个必要的方法子集.
简而言之:您可以实现许多接口,但是您只能继承一个类.