抽象类与接口

抽象类与接口
抽象类与接口

抽象类与接口

一.抽象类(Abstract Class)与抽象方法

1.抽象方法定义

定义方法时用关键字abstract 修饰的方法,其特征是该方法没有方法体。

public abstract void noAction();

2.抽象类

定义类时用关键字abstract 修饰的类

abstract class 类名{}

例:

abstract class MyClass{

int myInt;

abstract public void noAction(); //抽象方法!

public int getMyInt(){//非抽象方法

return myInt;

}

}

3.说明:

A.抽象方法必须包含在抽象类中,然而,抽象类中的方法不必都是抽象方法。

B.抽象类不能用来创建对象,但可以用来声明变量。

C.在抽象类中定义抽象方法在于建立一种约定,如果没有这种约定,则需要在各个

子类中定义不同名称(不同实现)的方法,将使程序变得十分混乱.一般而言,在抽象类中定义了抽象方法后,就可以在子类中覆盖掉父类的同名方法,然后给予特定的实现。

注意:继承了抽象类的子类一定要覆盖父类的抽象方法,如果不是这样子类也将成为抽象类了。

4.final关键字

用来修饰变量,方法和类

4.1.public final int A=10; //表示变量为常数,程序运行中不能再改变其值,常数一般为对象

所共有,故一般也将常量声明为static final

Public static final double PI=3.1415926; PI 值保持不变,并为所有对象所共有

4.2.Public final void f(){} //表示方法为最终方法,其含义为:继承包含final 方

法的类的子类不能覆盖该最终方法,以达到保护父类方法的行为的目的. 即

是说,最终方法具有保护方法的功能,禁止对该方法的行为作出任何修改。

4.3.final class MyClass{} 表示该类不能被继承,因为这样的类可能与其他类具

有千丝万缕的联系,如果被继承,将导致灾难性后果.与abstract修饰的类相反

例如:

//1。定义抽象类:

abstract class Shape{

double area;

public double area(){

return area; //返回形状面积

}

public abstract void draw(); //抽象方法

}

//2。定义派生类

class Triagle extends Shape{

double d,h;

public Triagle(int a,int b){

d=a;

h=b;

area=d*h/2; // area 面积,从父类继承而来的}

public void draw(){//覆盖抽象方法

System.out.println(“画三角形”);

}

}

//3。定义派生类

class Rectangle extends Shape{

double width,height;

public Rectangle (int a,int b){

width=a;

height=b;

area=width*height; // area 面积,从父类继承而来的}

public void draw(){//覆盖抽象方法

System.out.println(“绘制矩形”);

}

}

//4。定义测试类

public class Test{

public static void main(String[] args){

Shape tri=new Triangle(10,3);

Shape rect=new Rectangle(5,8);

System.out.pritnln(tri.area());

Tri.draw();

System.out.pritnln(rect.area());

rect.draw();

}

}

//输出结果:

15.0

画三角形

40.0

绘制矩形

二.接口:

接口可以理解为两个对象相互通信的规则或约束。声明抽象方法的原因在于定义一种子类可以覆盖进而使用它的约束。故接口本身就是一种约束.

接口将设计与实现分离,可以使编写的代码更加通用,便于维护。在Java中,接口设计称为”优雅”设计

(一)。接口的声明

interface接口名[extends] 父接口

{

/* 接口体*/

//常量声明

[public] [static] [final]常量类型常量名=常量值

//抽象方法声明

[public] [abstract]返回类型方法名(参数表列) [throws 异常列表] }

(二)。接口的特点

1.Java接口的特点:

所有方法都是抽象的

所有变量都是静态常量

public interface MyInter{

public static final int MAX=100;

public int MIN=1; //编译器会自动添加static final 关键字来修饰MIN

public abstract void method();

public void method2(int a); //编译器会自动添加abstract 关键字来修饰method2 }

2.接口继承

一个接口可以继承一个或多个其它接口,这意味着子接口拥有父接口的成员.

接口继承的语法:

interface ChildInterface extends ParentInterface1, ParentInterface2,…

3.接口回调

接口回调指把实现了某一接口的类的实例赋给该接口声明的接口变量中。那么该接口变量就可以调用被类实现的接口中的方法。这是非常重要的接口性质。

4.接口做方法的参数

接口变量可以作为方法的参数,这样,传递个这个接口的形参就可以是实现了这个接口的任何类的实例。

5. 说明:

A. 由于接口中的所有方法都是抽象方法,所以,实现接口的类必须实现接口中

所有的抽象方法。

B. 一个类可以实现多个接口.

C. 实现接口语法

implements ,,…

public class MyClass implements Inter1,Inter2{

//类体

}

D. 可以用接口声明变量

<接口名> var

E. 接口中的方法不能使用private 或protected 修饰.但访问修饰可以缺省,

因为类只能用覆盖的方法实现接口中的抽象方法.

//接口1

interface Interface1{

public void method1();

}

//接口2

interface Interface2{

public void method2();

}

public class TestInterface implements Interface1,Interface2 {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

TestInterface obj=new TestInterface();

obj.method1();

obj.method2();

}

public void method1() {

// TODO Auto-generated method stub

System.out.println("method1 overdide");

}

public void method2() {

// TODO Auto-generated method stub

System.out.println("method2 overdide");

}

}

//接口回调

interface ShowMessage {

void show();

}

class TV implements ShowMessage{

public void show() {

// TODO Auto-generated method stub

System.out.println("电视显示图像");

}

}

class PC implements ShowMessage{

public void show() {

// TODO Auto-generated method stub

System.out.println("计算机显示文本内容");

}

}

public class Test{

public static void main(String[] args){

ShowMessage msg=null;//声明接口变量

msg=new TV();//保存引用到接口变量

msg.show();//接口回调

msg=new PC();//保存引用到接口变量

msg.show();////接口回调

}

}

三.接口与抽象类的区别:

1从编程角度看:

接口中不定义任何与实现相关的内容,在抽象类中可以定义具有具体实现的方法,这个方法是各子类都有的完全相同的行为。

2 从概念角度看

接口与抽象类都是一个抽象体;

抽象类是对实体的抽象,如交通工具就是一个抽象类,它是对各式各样的交通工具的抽象。抽象类和子类在概念上是一致的,子类和抽象类之间表现为”是”的关系, 如,”汽车”是”交通工具”;

接口是对行为的抽象,例如:“可以飞”是个接口,它是对各种可飞的实体的行为的抽象。接口与实现它的类在概念上是不一致的,实现类仅仅是实现了接口所定义的协议,使它具有某个功能,例如,”飞机”与“可以飞”,我们可以说”飞机可以飞”

练习:

1.梯形,圆,矩形都必须有计算面积的功能,定义一个接口包含一个计算面积的方法,

并用相应的类来实现这个接口。

2设计一个接口,其内有一个方法welcom(). 用两个类分别实现这个接口,其中一个类用英文表示欢迎,另一个类用中文表示欢迎;再写一个类,该类有一个方法,此方法包含一个接口参数,在方法的实现体中,用接口参数调用接口方法。最后写一个测试类,完成测试。

3. 设计一个接口:

interface IFlyable {

String fly();

}

然后用两个类Plane和Bird分别实现这个接口,Plane类显示“飞机靠发动机引擎在天空飞行;Bird 类显示”鸟在靠翅膀在天空中飞翔“。最后写一个测试类,该类有一个方法,在方法中有一个接口参数,其实现体调用fly() 显示结果。

系统常用接口

一.Cloneable接口

这是系统提供的一个接口,该接口产生对象的副本,Java产生对象副本时规定:1.创建该对象的类必须实现Cloneable接口

2.创建该对象的类必须覆盖Object类的Clone()方法

protected native Object clone() throws CloneNotSupportedException;

public class Cloneable2 implements Cloneable{//实现Cloneable接口

String s;

int a;

Public Cloneable2(String s,int a){

this.s=s;

this.a=a;

}

public Object clone(){//覆盖Object类的Clone()方法,返回自身副本

try{

return super.clone();//调用Object类的clone()方法

}

catch(CloneNotSupportedException e2){

return null;

}

}

}

public static void main(String[] args){

Cloneable2 obj1=new Cloneable2(“apple”,12);

Cloneable2 obj2=( Cloneable2)obj1.clone(); //生成ob1的副本

//输出hashCode

System.out.println(“原本:”+obj1.hashCode());

System.out.println(“副本:”+obj2.hashCode());

System.out.println(“原本:”+obj1.s+”“+obj1.a);

System.out.println(“副本:”+obj2.s+”“+obj2.a);

}

//运行结果:

原本:2536009 //两个对象的hsahCode 不一样,说明它们处于不同的存储区。

副本:8581339

原本:apple 12

副本:apple 12

二.Comparator 接口

1.接口定义:

public interface Comparator{

public int compare(Object a,Object b);

}

2.说明:

2.1. compare(Object a,Object b)方法的返回值规定如下:

当对象a

当对象a=b 对象时,返回0;

当对象a>b 对象时,返回1

2.2. 该接口在java.util包中。实现两个对象之间的比较,比较规则由方法实现

三.Comparable接口

基本数据类型间可以比较大小,但是对象之间如何比较大小呢?对象分为可比较对象和不可比较对象。如果对象实现了Comparable接口,则称该对象为可比较对象,反之,称该对象为不可比较对象。

1.接口声明如下

public interface Comparable{

public int compareTo(Object obj);

}

2. 说明:

2.1. compareTo(Object obj)方法的返回值规定如下:

当本对象

当本对象=obj 对象时,返回0;

当本对象>obj 对象时,返回 1

2.2. 该接口在java.util包中。实现本对象与参数obj的比较,比较规则由方法实现。练习:

1.设计一个类,用以封装一个矩形Rectangle,并实现Comparable接口,从而使该类的实例之间可以比较大小,比较规则由程序确定。最后声明一个Rectangle(对象)数组,并对该数组进行排序。

2. 设计一个Person类,该类有两个数据成员:职务,年龄。要求该类的实例为可比较对象。假设”职务”取值如下值:军长,师长,旅长,团长,营长,连长,排长。

另外写一个测试程序,对Person数组进行排序。

四.Enumeration 接口

实现了Enumeration 接口的对象内部对于给定的元素需要输出时,提供一种按顺序输出的方式.要使自己的类具有顺序输出功能,可以实现Enumeration 接口。

该接口位于java.util包,它包含两个方法:

public interface Enumeration{

boolean hasMore Elements(); //检查是否有元素,返回true ,表示还有元素.

Object nextElement()返回下一个元素,并自动调整到下一个元素位置}

例如:

package lcm.math;

/**

*

Title:家庭成员列表

*

*

Description: 实现接口Enumeration

*

*

Copyright: Copyright (c) 2006

*

*

Company:

*

* @author not attributable

* @version 1.0

*/

public class Family implements java.util.Enumeration{

private String father,mother,child;

private int currentIndex=0;//当前项索引

public Family(String father,String mother,String child) {

this.father="father:"+father;

this.mother="mother:"+mother;

this.child="child:"+child;

}

public boolean hasMoreElements(){

return currentIndex<3;

}

public Object nextElement(){

String member;

switch(currentIndex){

case 0:

member=father;

break;

case 1:

member=mother;

break;

case 2:

member=child;

break;

default:

throw new IndexOutOfBoundsException("索引越界!");

}

currentIndex++; //调整索引

return member;

}

}

public class Foreach implements Enumeration{

Object[] data=null;

Int count=0;

Public Foreach(Object[] data)

this.data=data;

}

public Boolean hasMoreElements(){

return count

}

public Object nextElement(){

if(count

return data[count++];

return null;

}

public static void main(String[] args){

String[] persons={“dada”,”qwqewq”,”zaq”};

Foreach e=new Foreach(persons);

//遍历对象,获得所有元素

while(e.hasMoreElements()){

System.out.println(e.nextElement());

}

}

}

思考:

修正下列代码中的错误:

class Abstract{

int a;

private void f();

public void g();

public h(){

a=5;

}

}

提示:从抽象类和非抽象类两方面分析和修改。

五.包

包(Package)是类的容器,用于把类名空间分隔开。Java引入包的主要目的是避免名字冲突。这样便于对庞大的类进行管理。通常,一个java源文件可以包含以下4个部分中的任何一个(或全部):

单个包语句(可选)

任意数目的导入语句(可选)

单个公共类声明(必须)

对包来说是私有的任意数目的类(可选)

1.定义一个包

package <包名> //要求该语句必须为源文件的第一条语句!

定义一个包后,意味着这名称与操作系统的一个目录关联起来。

2.查找包和CLASSPATH

java 运行时系统可以通过两种方式之一查找包:默认情况下,java运行时系统

使用当前的工作目录作为它的起始点,如果包在当前工作目录或是其子目录中,

就可以找到包;其次,使用在CLASSPA TH环境变量指定的一个或多个目录路径查找,这种方式可以将包放到任何目录下。

package mypackage;

public class Balance {

String name;

double bal;

Balance(String n,double b){

name=n;

bal=b;

}

void show(){

if(bal<0)

System.out.println("--> ");

System.out.println(name +": $"+bal);

}

}

class AccountBalance{

public static void main(String[] argv){

Balance[] current=new Balance[3];

current[0]=new Balance("张三",154.0);

current[1]=new Balance("汪芜",254.1);

current[2]=new Balance("留洋",194.5);

for(int I=0;I<3;I++){

current[I].show();

}

}

}

编译这个源文件,确保生成的.class文件也在mypackage目录中,然后使用下面的

命令执行AccountBalance类:

java mypackage. AccountBalance

记住,执行该命令时,位置需要在mypackage之上的目录,或者对CLASSPA TH环境变量进行相应的设置。

AccountBalance 现在是包mypackage的一部分,它不能通过自身来执行,即不能用下面的命令行:java AccountBalance

AccountBalance 必须和包名在一起使用。

接口和抽象类的区别

.Net提供了接口,这个不同于Class或者Struct的类型定义。接口有些情况,看似和抽象类一样,因此有些人认为在.Net可以完全用接口来替换抽象类。其实不然,接口和抽象类各有长处和缺陷,因此往往在应用当中,两者要结合来使用,从而互补长短。 接下来先说说抽象类和接口的区别。 区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。这些听起来有些虚,举个例子。例如,狗是对于所有狗类动物的统称,京哈是狗,牧羊犬是狗,那么狗的一般特性,都会在京哈,牧羊犬中找到,那么狗相对于京哈和牧羊犬来说,就属于这类事物的抽象类型;而对于“叫”这个动作来说,狗可以叫,鸟也可以叫。很明显,前者相当于所说的是抽象类,而后者指的就是接口。 区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。 例如: public abstract class AbsTest { public virtual void Test() { Debug.WriteLine( "Test" ); } public abstract void NewTest(); } public interface ITest {

void Test(); void NewTest(); } 区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。 区别四,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。 知道了两者的区别,再来说说,接口相对于抽象类的优势。 好处一,接口不光可以作用于引用类型,也可以作用于值类型。而抽象类来说,只能作用于引用类型。 好处二,.Net的类型继承只能是单继承的,也就是说一个类型只能继承一个类型,而可以继承多个接口。其实,我对于这一点也比较赞同,多继承会使继承树变的混乱。 好处三,由于接口只是定义属性和方法,而与真正实现的类型没有太大的关系,因此接口可以被多个类型重用。相对于此,抽象类与继承类的关系更紧密些。 好处四,通过接口,可以减少类型暴露的属性和方法,从而便于保护类型对象。当一个实现接口的类型,可能包含其他方法或者属性,但是方法返回的时候,可以返回接口对象,这样调用端,只能通过接口提供的方法或者属性,访问对象的相关元素,这样可以有效保护对象的其他元素。

接口和抽象类习题-答案

(一)选择题 1.以下哪个接口的定义是正确的? A.interface B{ void print() { } ; } B.abstract interface B { void print() ; } C.abstract interface B extends A1,A2 { abstract void print(){ }; } D.interface B { void print();} 2.定义一个接口时,下列哪个关键字用不到? A.public B.extends C.interface D.class 3.定义一个接口时,要使用如下哪个关键字? A.abstract B.final C.interface D.class 4.在使用interface声明一个接口时,只可以使用哪个修饰符修饰该接口。 A.private B.protected C.private或者protected D.public 5.下列类头定义中,错误的是? A.public x extends y B.public class x extends y C.class x extends y implements y1 D.class x 6.下列类定义中,不正确的是? A.class x B.class x extends y C.class x implements y1,y2 D.public class x extends X1,X2 7.Java中能实现多重继承功能的方式是? A.接口 B.同步 C.抽象类 D.父类 8.下列叙述正确的是? A.Java中允许多重继承 B.Java一个类只能实现一个接口 C.Java中只能单重继承 D.Java中一个类可以继承多个抽象类 (二)简答题

接口和抽象类习题-答案

一)选择题 1. 以下哪个接口的定义是正确的? A. interface B{ void print() { } ; } B. abstract interface B { void print() ; } C. ab stract interface B extends A1,A2 { abstract void print(){ }; } D. interface B { void print();} 2. 定义一个接口时,下列哪个关键字用不到? A. public B. extends C. interface D. class 3. 定义一个接口时,要使用如下哪个关键字? A. abstract B. final C. interface D. class 4. 在使用interface 声明一个接口时,只可以使用哪个修饰符修饰该接口。 A. private B. protected C. private 或者protected D. public 5. 下列类头定义中,错误的是

A. public x extends y B. public class x extends y C. class x extends y implements y1 D. class x 6. 下列类定义中,不正确的是? A. class x B. class x extends y C. class x implements y1,y2 D. public class x extends X1,X2 7. Java 中能实现多重继承功能的方式是? A. 接口 B侗步 C. 抽象类 D. 父类 8. 下列叙述正确的是? A. Java 中允许多重继承 B. Java 一个类只能实现一个接口 C. Java 中只能单重继承 D. Java 中一个类可以继承多个抽象类 (二)简答题 1) 接口中方法的修饰符都有哪些?属性的修饰符有哪些? 2) 接口的作用是什么?简述接口与类的关系。

C#抽象类和接口的区别

C#抽象类和接口的区别

c#接口和抽象类的区别大家都容易把这两者搞混,我也一样,在听李建忠老师的设计模式时,他也老把抽象类说成接口,弄的我就更糊涂了,所以找了些网上的资料. 一、抽象类: 抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。 二、接口: 接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1、不能实例化; 2、包含未实现的方法声明; 3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员); 另外,接口有如下特性: 接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。 三、抽象类和接口的区别: 1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。。。”.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中. 2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法; 3.一个类一次可以实现若干个接口,但是只能扩展一个父类 4.接口可以用于支持回调,而继承并不具备这个特点. 5.抽象类不能被密封。 6.抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的. 7.(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。 8.抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现。 9.好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。 10.尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!

抽象类与接口的区别

抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。 其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。 一、理解抽象类 abstract class和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢? 在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。 比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。 在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。 二、从语法定义层面看abstract class和interface 在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。使用abstract class的方式定义Demo抽象类的方式如下: java 代码 abstract class Demo { abstract void method1(); abstract void method2(); …

实验七 抽象类、包与接口

实验七抽象类、接口与包 一、实验目的 1、熟练掌握抽象类abstract的概念。 2、熟练掌握接口interface的概念。 3、熟练包package的概念以及编译运行的方法。 二、实验内容与要求 1.编写求解几何图形(如三角形,矩型,圆,多边型)的周长、面积的应用程序,要求用到继承、多态、抽象类、接口、内部类等面向对象程序设计技术的特点。 2、重写上面的程序,要求三角形,矩型,圆,多边型的类放到不同的包中,用包的技术组织程序的设计。同时要求程序能从键盘上接受数据以便求解不同的几何图形的周长面积。提示:从键盘上输入双精度数的一种方法(程序片段) …… public static void main(String args[]) throws IOException { BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in)); String x; x=keyin.readLine(); double a=Double.parseDouble(x); …… 3.练习https://www.360docs.net/doc/bd7362778.html,ng.Class类的使用,通过一个对象返回一个Class对象,如何获取一个类的名称,如何使用class生成一个类的对象。获取类的描述信息。 4.从命令行输入一个正整数,用递归的方法求出每位数字上的累加和 5、编写一个应用程序,实现以下功能: ①声明一个接口(Calculability),接口中包含一个方法area()。 ②声明一个三角形类继承该接口,类名为Triangle,类中包含两个变量、一个带参数年的构造方法和一个计算三角形面积的方法: 三角形的底边长w 三角形的高h 构造方法Triangle(double width,double height)。 计算三角形面积的方法area(),该方法覆盖接口(Calculability)的同名方法,计算三角形的面积(w*h/2)。 ③声明一个锥体类(Taper),包含一个接口对象bottom(锥体的底)和一个变量(锥体的高)height,一个带参数的构造方法,一个换底方法getbottom(),一个锥体体积的计算方法volume()。 ④声明一个主类Exp6_1,在主方法中声明接口和锥体类的对象,输出锥体的底面积和锥体的体积(bottom*height/3)。

(完整版)毕设外文翻译-详细解析Java中抽象类和接口的区别

Parsing Java Abstraction of the Difference Between Classes and Interfaces In Java language, abstract scale-up and with support class abstraction definition of two mechanisms. Because of these two kinds of mechanism of existence, just gives Java powerful object-oriented skills. Abstract scale-up and with between classes abstraction definition for support has great similarities, even interchangeable, so many developers into line non-abstract class definition for abstract scale-up and it is becoming more casual with choice. In fact, both between still has the very big difference, for their choice even reflected in problem domain essence of understanding, to design the intentions of the understanding correctly and reasonable. This paper will for the difference analysis, trying to give a developer with a choice between them are based. Understand class abstraction Abstract class and interface in Java language is used for abstract classes (in this article non-abstract class not from abstract scale-up translation, it represents an abstract body, and abstract scale-up for Java language used to define class abstraction in one way, please readers distinguish) defined, then what are the abstract classes, use abstract classes for us any good? In object-oriented concept, we know all objects is through class to describe, but in turn not such. Not all classes are used to describe object, if a class does not contain enough information to portray a concrete object, this class is abstract classes. Abstract classes are often used to characterization of problem field in our analysis, design that the abstract concepts, is to the series will look different, but essentially the same exact conception of abstraction. For example: if we carry out a graphical editing software development, will find problem domain exists round, triangle so some specific concept, they are different, but they all belong to shape such a concept, shape this concept in problem domain is not exist, it is an abstract concept. Precisely because the abstract concepts in problem field no corresponding specific concept, so to characterization abstract concepts non-abstract class cannot be instantiated. In an object-oriented field, mainly used for class abstraction types hidden. We can

Java面试问题:抽象类与接口的区别.

Java面试问题:抽象类与接口的区别2019-01-01 很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题, 。本文我们将仔细讨论这些话题。 在讨论它们之间的不同点之前,我们先看看抽象类、接口各自的特性。 抽象类 抽象类是用来捕捉子类的通用特性的。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。以JDK中的GenericServlet 为例: public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { // abstract method abstract void service(ServletRequest req, ServletResponse res); void init() { // Its implementation } // other method related to Servlet } 当HttpServlet类继承GenericServlet时,它提供了service方法的实现: public class HttpServlet extends GenericServlet { void service(ServletRequest req, ServletResponse res) { // implementation } protected void doGet(HttpServletRequest req, HttpServletResponse resp) { // Implementation } protected void doPost(HttpServletRequest req, HttpServletResponse resp) { // Implementation } // some other methods related to HttpServlet } 接口 接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。以Externalizable 接口为例: public interface Externalizable extends Serializable { void writeExternal(ObjectOutput out) throws

面向对象--接口与抽象类、对象和接口(通俗讲解)

面向对象--接口与抽象类的恩恩怨怨 接口与抽象类是面向对象编程中两个非常重要的角色,二者各自起着非常重要的作用。但是很多初学的朋友往往会对使用接口还是抽象类存在的很大的迷惑。就我自己的一点心得,发表一下拙见。 面向对象的一些回顾: 面向对象世界中有一个古老的法则:接口隔离原则,指的是不要把多个功能全部都集中在一个接口里面。接口实现的功能要相对单一;衍生开来可以得到另外一个结论:对一组或者称一系列功能的实现,尽量定义相对功能单一的小模块来实现这一组功能。这其实也是解耦和的体现。 那这跟我们的接口和抽象类有什么关系呢?那又得摆出另外一个法则:依赖倒置原则,针对接口编程而不是针对实现编程。 说到这,又会有一个新的问题蹦出来,这是自相矛盾啊,既然要针对接口编程还要抽象类干吗使?我们经常说面向对象,面向对象是来源于生活的。是人们要把对现实世界中的一系列方法论应用到程序设计当中来。从对象这一概念的引入我们就可以揣摩这一点。人类社会中有很多对象的概念,人、车、物体。不幸的是用程序来实现这些对象比在概念上定义对象要难很多。 (如果能达成这一共识,您可以继续往下看,否则就请看官您移步至留言讨论吧) MS给出开发者的建议是,用抽象类来实现接口。子类再继承基类。 实例说明: 为什么要这么建议?OK,我们试着结合实际来说明一下这个问题吧。我们要造车。这个车有个基本的属性就是能移动、还必须有轮子。那我们就设计一个接口 1public interface ICar 2 { 3 string Wheel 4 { 5 get; 6 set; 7 } 8 void Move(); 9 } 10

接下来的事情,就是实现了。造什么车都行,继承一下就行。随着科技的发展,我们的车想要飞了。此时当然不能修改这个接口,因为要遵循开闭原则。为什么要遵循?我们可以想一下,人坐上飞机能飞上天。但是也没见谁认为人有会飞这个特性的。那也好办,不许修改,那我再加一个接口。 1interface IFlyable 2 { 3 void Fly(); 4 } 5 好,我们的飞行汽车最后应该是这样的。 1class FlyCar : ICar,IAerocraft 2 { 3 private string wheel = string.Empty; 4 5 public void Fly() 6 { 7 Console.WriteLine("{0}车飞起来了",this.wheel); 8 } 9 public string Engine 10 { 11 get 12 { 13 return wheel; 14 } 15 set 16 { 17 wheel = value; 18 } 19 } 20 21 public void Move() 22 { 23 Console.WriteLine("{0}轮车在走",this.wheel); 24 } 25 } 26 看起来很不错,车能飞能走了。那它现在他的祖宗到底车还是飞行器呢?我们自己在心里辩论一下吧。估计不是很容易辩清楚。 我们前面说过,面向对象的思想来源于现实生活。如果把这组例子引入到现实中来,造会飞的汽车。肯定是要在原有的汽车上面下功夫。比如你装上喷气动力装置,或者装上翅膀。

抽象类和接口的相同和异同点

抽象类和接口的相同和异同点 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。 接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。 在编写对象的时候会对一些类的方法进行定义。但是并没有具体的实现。而是把它们放到子类中去实现,具有灵活性。在抽象类中可以有抽象方法,也可以没有抽象方法。但是有了抽象方法的类一定是抽象类。 抽象类和接口在JA V A中都是用来表述抽象类的。 在面向对象的概念,所以的对象都是通过类来描述的。但反之则不行。若是一个类中没有包含足够的信息描绘一个具体的对象,这个的类就是抽象类。 在JA V A中除了使用抽象类来实现一定程度的抽象外还可以定义一种特殊的抽象方法----接口(interface)。和抽象类的方法不一样,在抽象类中需要加上关键字abstract来表明某个方法是抽象的,但是在接口中则不需要。 相同点: 1.他们都能不能生成实例,都有抽象方法。 2接口是特殊的抽象类。 3.接口和抽象类的继承都使用的关键字是extends。 不同点: 1.接口的定义的变量默认是public static final型,且必须给其赋初值。所以在实现类中不能重新定义,也不能改变其值。而在抽象类中其值在子类中可以重新定义也可以重新赋值。 2.接口的方法默认的都是public abstract类型的。 3.抽象类中可以有构造器,但是接口中除了抽象方法什么都没有。 4.名字不同,接口写的是public interface Shape{}; 而抽象类写的是public abstract class Shape{}; 接口里全部都是抽象方法。而抽象类里可以有抽象方法也可以有其他的方法。接口里的属性都是静态的。但是抽象类的属性可以是任意的。 5.还可以从继承的角度看,接口可以多继承,一个接口可以继承多个接口。但是抽象类却不能,只能是继承一个父类,不能继承多个父类。要是能继承多个父类的话会在父类和子类的方法中有发生冲突。

Java实验7抽象类和接口

实验6 抽象类和接口 一、实验目的: 1、学习掌握抽象类的概念和使用方法。 2、学习掌握接口的概念和定义接口的方法。 3、学习使用Cloneable接口和clone方法进行对象内容的复制。 4、理解浅复制和深复制的概念,掌握覆盖clone方法进行对象内容深复制 的技术。 二、实验任务: 1、学习掌握抽象类的概念和使用方法。程序要求: (1)首先创建一个类家族,其中抽象类几何图形类GeometricObject为父类,圆类Circle和矩形类Rectangle为子类。几何图形类 GeometricObject中定义保护型字符串变量color,表示图形的颜色; 该类要具备构造方法和两个抽象方法findArea和findPerimeter,抽 象方法findArea求图形面积,抽象方法findPerimeter求图形周长。 (2)Circle类和Rectangle类是GeometricObject类的子类,其中应实现父类的抽象方法。 (3)程序主方法中创建两个几何对象,一个圆和一个矩形,并用GeometricObject类的引用变量引用它们,调用抽象方法。 2、学习接口的概念和利用接口实现多态的方法。程序要求如下: (1)首先创建圆类Circle和圆柱体类Cylinder,其中Circle类是父类,Cylinder类是子类; (2)创建接口Comparable,其中包含一个抽象方法compareTo,用来比较对象的大小。抽象方法compareTo的形式如下: public int compareTo(Object o); (3)创建类ComparableCircle,该类为Circle类的子类,并实现

C++中抽象类和接口的区别

抽象类和接口的区别 抽象类:抽象类是特殊的类,只是不能被实例化(将定义了一个或多个纯虚函数的类称为抽象类);除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的,但同时也能包括普通的方法。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。虽然不能定义抽象类的实例,但是可以定义它的指针,并且指向抽象类的指针实际上在赋值时是指向其继承类的实例化对象的,这样通过统一的使用该指针可以很好的封装不同子类的实现过程,这在模式设计的过程中得到了极大的应用! 接口:接口是一个概念。它在C++中用抽象类来实现,在C#和Java中用interface来实现。 接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1、不能实例化; 2、包含未实现的方法声明; 3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员); 另外,接口有如下特性: 接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。 抽象类和接口的区别: 1.接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。

实验六 抽象类、包与接口

实验五抽象类、接口与包 一、实验目的 1、熟练掌握抽象类abstract的概念。 2、熟练掌握接口interface的概念。 3、熟练包package的概念以及编译运行的方法。 4、熟练掌握内部类inner class的概念。 5、熟练掌握递归的概念。 6、理解面向对象的程序设计方法。 二、实验内容与要求 1.编写求解几何图形(如三角形,矩型,圆,多边型)的周长、面积的应用程序,要求用到继承、多态、抽象类、接口、内部类等面向对象程序设计技术的特点。 2、重写上面的程序,要求三角形,矩型,圆,多边型的类放到不同的包中,用包的技术组织程序的设计。同时要求程序能从键盘上接受数据以便求解不同的几何图形的周长面积。提示:从键盘上输入双精度数的一种方法(程序片段) …… public static void main(String args[]) throws IOException { BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in)); String x; x=keyin.readLine(); double a=Double.parseDouble(x); …… 3.练习https://www.360docs.net/doc/bd7362778.html,ng.Class类的使用,通过一个对象返回一个Class对象,如何获取一个类的名称,如何使用class生成一个类的对象。获取类的描述信息。 4、编写一个应用程序,实现以下功能: ①声明一个接口(Calculability),接口中包含一个方法area()。 ②声明一个三角形类继承该接口,类名为Triangle,类中包含两个变量、一个带参数的构造方法和一个计算三角形面积的方法: 三角形的底边长w 三角形的高h 构造方法Triangle(double width,double height)。 计算三角形面积的方法area(),该方法覆盖接口(Calculability)的同名方法,计算三角形的面积(w*h/2)。 ③声明一个锥体类(Taper),包含一个接口对象bottom(锥体的底)和一个变量(锥体的高)height,一个带参数的构造方法,一个换底方法getbottom(),一个锥体体积的计算方法volume()。

接口与抽象类的相同点及不同点

1抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 (4) 具体派生类必须覆盖基类的抽象方法 (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们。如: 二、接口 (1) 接口不能被实例化 (2) 接口只能包含方法声明 (3) 接口的成员包括方法、属性、索引器、事件 (4) 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员。如: (5) 接口中的所有成员默认为public,因此接口中不能有private修饰符 (6) 派生类必须实现接口的所有成员 (7) 一个类可以直接实现多个接口,接口之间用逗号隔开 (8) 一个接口可以有多个父接口,实现该接口的类必须实现所有父接口中的所有成员 三、抽象类和接口 相同点: (1) 都可以被继承 (2) 都不能被实例化 (3) 都可以包含方法声明 (4) 派生类必须实现未实现的方法 区别: (1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。 (2) 抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后带able字段,证明其是表述一类“我能做。。。” (3) 接口可以被多重实现,抽象类只能被单一继承 (4) 抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中 (5) 抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定,因此反映的是事物的外部特性 (6) 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法 (7) 接口可以用于支持回调,而继承并不具备这个特点 (8) 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的 (9) 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法

抽象类和接口测试题

1. Java中用来实现继承的关键字是____ A、extends B、implements C、public D、protected 2.如果要用到一个接口的关键字是____ A、import B、implements C、extends D、final 3.接口是Java面向对象的实现机制之一,以下说法正确的是 A、Java支持多重继承,一个类可以实现多个接口 B、Java只支持单重继承,一个类可以实现多个接口 C、Java只支持单重继承,一个类只可以实现一个接口 D、Java支持多重继承,但一个类只可以实现一个接口 4.请分析以下代码,请问下面____不可以产生Q8对象? public class Q8{ public Q8(int i){} public Q8(int i,float f){} } A、Q8 q=new Q8(); B、Q8 q=new Q8(10); C、Q8 q=new Q8(10,10f); D、以上方法均不可以 5.设有下面两个类的定义: class Person { long id; String name; } Class Student extends Person{ int scroe; int getScore(){} } 则类Student和类Person的关系是____ A、包含关系 B、继承关系 C、关联关系 D、上述类定义有语法错误 7. ____类是JAVA语言中所有类的父类。 A、class B、https://www.360docs.net/doc/bd7362778.html,ng C、Object D、以上都不正确 8. 下列关于抽象类描述正确的是__有问题__ A、某个抽象类的父类是抽象类,则这个类必须要重写父类中的所有抽象方法 B、接口和抽象类是一回事 C、可以使用抽象类去创建对象 D、抽象类中不可以有非抽象方法 10.下面的程序输出的结果是____ public class A implements B { int k=20; public static void main(String args[]) { int i; B c1 = new A(); i= c1.k; System.out.println("i="+i); } } interface B { int k = 10; } A) i=20 B) i=10 C) 程序有编译错误 D) i=true

抽象类和接口的作用

Interface和抽象类的应用 一个类可以(继承)实现多个接口,但只能继承一个类。接口中只能定义方法名,方法参数和返回值,以及静态变量。而抽象类中可以有方法的实现,也可以定义非静态的类变量。所以,当你需要多继承特性时,那你只能使用接口;当你需要在父类中实现部分代码(通用功能)而根据不同情况某一方法有不同的实现时,那就设计为抽象类。 我们也可以从多态性的角度来考虑是要使用接口还是用抽象类。如果预计要创建组件的多个版本,我们应该创建抽象类。这是因为,抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。所以,如果创建的功能将在大范围的全异对象间使用,则使用接口。 抽象类主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。 一个基本原则是,首先考虑使用接口。接口可以继承接口。抽象类可以实现(implements)接口,抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数。有个通用的设计思想,如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。 接口一旦被定义和接受,就必须保持不变,以保护为使用该接口而编写的应用程序。接口发布后,就不能对其进行更改。这是我们进行组件设计的一个重要原则,叫做‘接口不变性’。创建一个接口就是在创建一个定义,接口定义发布后则永远不能更改。接口不变性,就是为了保护为使用接口而编写的现有系统。当接口设计与需求有所出入,确认需要大幅度变更时,我们应该创建新的接口。一般命名方式是,新接口可以通过在原来的接口名称后追加一个数字‘2’来命名,以显示出它与现有接口的关系。 一般来说,我们会把确定哪些属性和方法属于接口的设计过程称为‘接口分解’。基本准则是,应在一个接口中将紧密相关的几个功能聚合为一组。功能太多会使接口不便于运行,而过于细分功能将导致额外的系统开销并降低使用的简易性。掌握分解的这个度的能力是需要不断的在技术上进行磨炼,以及在对每个项目深入分析与理解的基础上才能得到的。 接口是一种非常有效的编程方法,它让对象的定义与实现分离,从而可以在不破坏现有应用程序的情况下使对象得以完善与进化。接口消除了实现继承的一个大问题,就是在对设计实施后再对其进行更改时很可能对代码产生破坏。即使实现继承允许类从基类继承实现,在类首次发布时仍然会使我们不得不为设计做很多的抉择。如果原有的设想不正确,并非总可以在以后的版本中对代码进行安

实验5:Java抽象类与接口

实验5:Java抽象类与接口 实验时间:实验地点:一、实验目的及要求 (1)掌握抽象类的概念及使用。 (2)掌握接口的概念和实现方式。 (3)理解抽象类和接口的区别。 二、实验设备环境及要求 三、实验任务 (1)输入给定的Java Application程序,写出运行结果。 (2)按照要求编写Java Application程序。 四、实验内容与步骤 1.分析下列程序的输出结果。 interface Myface{ int getnext(); void setstart(int x); } class Add3 implements Myface{ int sta,val; Add3(){ sta=0;val=0; } public int getnext(){ val+=3; return val; } public void setstart(int i){ sta=i;

val=i; } } public class Face{ public static void main(String args[]){ Add3 a=new Add3(); for(int i=0;i<5;i++) System.out.println(a.getnext()); System.out.println(); a.setstart(10); for(int i=0;i<5;i++) System.out.println(a.getnext()); } } 2.按照要求编写Java Application程序。 假定要为某个公司编写雇员工资支付程序。这个公司有各种类型的雇员(Employee),不同类型的雇员按不同的方式支付工资: 经理(Manager):每月获得一份固定的工资; 销售人员(Salesman):在基本工资的基础上每月还有销售提成; 一般工人(Worker):则按他每月工作的天数计算工资。 试用类的继承及相关机制描述这些功能需求,并编写一个Java Application程序,演示这些类的用法。 五、实验指导与处理 六、分析讨论

相关文档
最新文档