一。抽象类
有时候,我们可能想要构造一个很抽象的父类对象,它可能仅仅代表一个分类或抽象概念,它的实例没有任何意义,因此不希望它能被实例化。例如:有一个父类“ 水果(Fruit)”,它有几个子类“苹果(Apple)”、“橘子(Orange)”、“香蕉(Banana)”等。水果在这里仅仅只是作为一个分类, 显然水果的实例没有什么意义(就好像一个人如果告诉你他买了一些水果但是却不告诉你是苹果还是橘子,你很难想象他到底买的是什么。)。而水果类又要能被子 类化,这就要求我们使用抽象类(abstract class)来解决这个问题。
在java中,通过在class关键字前增加abstract修饰符,就可以将一个类定义成抽象类。抽象类不能被实例化。例如:
定义抽象类水果(Fruit)
public abstract class Fruit {
……
}
如果我们试图用以下语句来获得一个实例,将无法编译成功。
Fruit fruit = new Fruit();
而我们仍然可以构造水果类的子类,如:
子类“苹果(Apple)”
public class Apple extends Fruit {
……
}
子类“橘子(Orange)”
public class Orange extends Fruit {
……
}
这样就达到我们的目的了。
抽象类除了能象普通类一样可以拥有一般的属性和方法,也可以拥有抽象方法(abstract method)。例如:
抽象类“形状(Shape)”拥有抽象方法draw()。
public abstract class Shape {
……
public abstract void draw();
……
}
抽象方法与抽象的行为相对应,通常是这个行为对父对象没有意义,而子对象有具体动作。例如方法draw()对于类Shape没有意义,而类 Shape的子类矩形(Rectangle)的方法draw()可以有实际的动作(根据矩形的四个顶点画出矩形的四个边),子类圆(Circle)的方法 draw()也可以有实际的动作(根据圆心和半径画出圆周)。
抽象类可以有抽象方法也可以没有抽象方法;但是如果一个类有抽象方法,那这个类只能定义为抽象类。
如果按照以下代码类“形状(Shape)”仍然拥有抽象方法draw(),但没有定义为抽象类,将会编译失败。
public class Shape {
……
public abstract void draw();
……
}
抽象方法还有一个特点是,它强迫子类要么仍然保持抽象性(即不具体实现该方法并仍然定义为抽象类),要么具体表现出这个方法的行为(实现具体的动作或者通过抛出UnsupportedOperationException异常来表明不支持该行为)。这样也可以强化多态性。
二 接口
下面谈谈接口(interface)。java语言使用关键字interface定义一个接口。接口也是抽象对象,它甚至比抽象类更抽象。接口中的方法都是抽象方法。
一个接口可以继承其他接口;一个类通过关键字implements声明要实现一个接口,并具体实现接口的方法。
例如:有一个接口InterfaceA,
Java代码
public interface InterfaceA {
void methodA();
}
类ClassA实现接口InterfaceA。
Java代码
public class ClassA implements InterfaceA {
public void methodA() {
System.out.println( "methodA of ClassA implements InterfaceA" );
}
}
如果是抽象类实现一个接口,那么抽象类中可以不具体实现接口的方法(保持其抽象性),而由其子类去实现。
抽象类ClassB实现接口InterfaceA,但是没有具体实现方法methodA(),
Java代码
public abstract class ClassBS implements InterfaceA{ }
子类ClassBSub实现接口InterfaceA,但是没有具体实现方法methodA(),
Java代码
public class ClassBSub implements InterfaceA{
public void methodA() {
System.out.println( "methodA of ClassBSub the subclass of ClassB" );
}
}
接口和抽象类显著的共同点是接口和抽象类都可以有抽象方法。
接口和抽象类的不同点有:
(1)抽象类可以有实例变量,而接口不能拥有实例变量,接口中的变量都是静态(static)的常量(final)。
(2)抽象类可以有非抽象方法,而接口只能有抽象方法。
java允许一个接口继承多个父接口,也允许一个类实现多个接口,而这样的多继承有上面提到的缺点马?
答案是没有,这是由接口的抽象性决定的。
正如前面介绍的,在接口中不能有实例变量,只能有静态的常量,不能有具体的方法(包含方法体),只能有抽象方法,因此也就摒弃了多继承的缺点。
对于一个类实现多个接口的情况,因为接口只有抽象方法,具体方法只能由实现接口的类实现,在调用的时候始终只会调用实现类的方法(不存在歧义), 因此不存在多继承的第二个缺点;而又因为接口只有静态的常量,但是由于静态变量是在编译期决定调用关系的,即使存在一定的冲突也会在编译时提示出错;而引 用静态变量一般直接使用类名或接口名,从而避免产生歧义,因此也不存在多继承的第一个缺点。
对于一个接口继承多个父接口的情况也一样不存在这些缺点。
请看以下示例。
接口A:
Java代码
public interface InterfaceA {
int len = 1 ;
void output();
}
接口B:
Java代码
public interface InterfaceB {
int len = 2 ;
void output();
}
接口InterfaceSub继承接口A和接口B:
Java代码
public interface InterfaceSub extends InterfaceA, interfaceB { }
类Xyz实现接口InterfaceSub:
Java代码
public class Xyz implements InterfaceSub {
public void output() {
System.out.println( "output in class Xyz." );
}
public void outputLen( int type) {
switch (type) {
case InterfaceA.len:
System.out.println( "len of InterfaceA=." +type);
break ;
case InterfaceB.len:
System.out.println( "len of InterfaceB=." +type);
break ;
}
}
public static void main(String[] args) {
Xyz xyz= new Xyz ();
xyz .output();
xyz .outputLen();
}
以上代码不存在什么问题,但是如果试图编写以下存在冲突的代码,则会编译失败。
Java代码
Xyz xyz = new Xyz();
int len = xyz.len;
System.out.println(len);
分享到:
相关推荐
在Java编程语言中,接口的实现与类的继承是两个...综上所述,Java中的接口实现与类继承为开发者提供了强大的工具来组织和复用代码。正确理解并灵活运用这两种机制,可以帮助开发者设计出更加健壮和可维护的软件系统。
JAVA接口与继承实验 本实验报告主要涉及到JAVA的接口和继承两个重要概念。通过三个实验,逐步介绍了接口的定义和使用、继承关系的建立和应用。 一、实验目的: 1. 掌握类的继承关系。 2. 掌握接口的定义与使用。 ...
Java抽象类和接口是两种不同的概念,它们之间存在着继承关系。在Java中,抽象类(abstract class)和接口(interface)都是用来描述对象的行为和状态的,但它们之间有着明显的区别。 首先,让我们来看一下抽象类。...
在Java中,继承是单继承的,即一个类只能直接继承一个父类,但可以通过接口实现多继承的效果。继承提高了代码的复用性,使得类层次结构更加清晰。 接口与继承的关系密切。一个类可以同时实现多个接口,也可以继承一...
Java选择单继承加接口的设计,而非像C++那样支持多继承,主要是为了简化语言的复杂度和提高程序的可读性和可维护性。在多继承情况下,解决菱形问题需要额外的语法和逻辑处理,这不仅增加了语言的学习曲线,还可能...
本文将深入探讨如何在Java中合理地消除实现继承和面向接口编程中的不当用法,以提高代码的可读性、可维护性和灵活性。 ### 1. 避免过度使用继承 继承在OOP中被用于表示“is-a”关系,即一个类是另一个类的一种特殊...
制作本文档的目的是将类的继承关系可以打印成书,直观了解继承关系图,同时还罗列出接口继承与实现关系图及枚举继承图(其中枚举放于最后两页)。 我已用该文档装订了一本书,作为自己学习java的参考,希望快速提供...
在 Java 编程中,接口技术有助于实现类之间的松散关联关系,体现了行为规范和行为实现的分离。使接口,这个特殊类的设计,上升到更抽象的高度。 Java 接口的使用场景: * 实现多重继承,一个子类可以继承多个直接...
Java 类、抽象类、接口和继承是面向对象编程的核心概念,它们构成了 Java 语言的基石。在 Java 中,类是用来封装数据和行为的结构,而对象则是类的实例,具有具体的属性和行为。 1. **类与对象的区别** 类是模板...
Java开发接口帮助文档是开发者在进行Java编程时的重要参考资料,它包含了JDK中的类库、接口、类与类之间的继承关系以及接口与接口之间的继承结构等详细信息。这份文档通常以`.chm`(Microsoft Compiled HTML Help)...
在Java编程语言中,由于Java不支持类的多继承,但是为了实现类似的功能,我们可以使用接口(interface)和抽象类(abstract class)。这两种机制都允许我们定义行为规范,供其他类来实现或扩展。 首先,接口是Java...
定义 Java 接口需要使用 `public interface` 关键字,后跟接口名和可能的继承关系。接口中的内容可以省略,类似于类,但是接口里的方法都是抽象的方法。定义接口的基本语法如下: `public interface 接口名 ...
综上所述,文件内容从标题到描述,再到部分内容,紧密围绕Java面向对象编程的继承特性展开,介绍了类与接口的设计,以及通过继承关系构建图形类库的基本思路。在实际开发中,这样的结构能够提高代码的可维护性和可...
6. **通过接口实现多态性**:不同类实现同一接口,可以实现相同的行为,而不需要考虑这些类的层次关系。 比较抽象类和接口: - 抽象类可以包含非抽象方法的实现,而接口则不能。 - 类可以继承一个抽象类,同时实现...
使用`extends`关键字声明继承关系。例如: ```java public class B extends A { // 子类可以有自己的属性和方法 } ``` ##### 2.3 方法的重写 子类可以通过`@Override`注解重写父类的方法,从而改变其默认的行为。...
在 Java 中,多态可以通过继承和接口实现。 继承的类型 在 Java 中,继承可以分为单继承和多继承。单继承是指一个子类继承一个父类,而多继承是指一个子类继承多个父类。Java 只支持单继承,但可以通过接口实现多...
实验要求学生掌握如何正确地划分和继承类,理解类之间的关系,以及如何使用包和接口来组织和扩展类的功能。在实践中,学生需要创建`Payroll`类,继承`Employers`类,定义工资相关的属性和方法,并编写构造器以初始化...
此外,设计模式如工厂模式和策略模式也可以帮助我们更好地管理这些继承关系,提高代码的可扩展性和可维护性。 总结起来,通过普通类、接口和抽象类的组合使用,我们可以有效地实现单继承和多继承,并应用于CRUD操作...
### Java接口深度解析 #### 引言:Java接口的核心价值 在Java编程世界里,接口(Interface)扮演着举足轻重的角色,它是语言中实现多态性的重要工具,为程序设计提供了高度的灵活性和扩展性。理解并熟练掌握接口的...
这意味着在不修改现有代码的基础上,可以通过添加新的接口实现来扩展功能。在案例中,通过`DBFactory`类的静态方法`getConn()`,我们可以根据需要动态地获取并使用不同的数据库连接类,而无需关心其具体实现,这就是...