抽象类和接口

来源:互联网 发布:足疗店软件 编辑:程序博客网 时间:2024/05/21 11:35
最近在复习java这本书的时候看到了抽象类和接口的概念,所以简单的谈一下。

首先我们先说一下抽象类。那么什么是抽象类呢?定义为在java中,用abstract修饰符修饰的类即为抽象类,同理,用abstract修饰符修饰的成员方法即为抽象方法。(如果大家不太理解,可以思考一下C++中的纯虚函数,java抽象类相当于它)。就比如说最经典的圆,三角形,矩形等等,我们可以由他们的共同之处入手,将它们抽象成形状不同的几何图形,再由此抽象出类shape。

抽象方法的格式:abstract 返回类型 抽象方法名(【参数列表】);

在这里我把书上说的理解抽象类需要注意的地方简单的概括一下:

1,抽象类中可以有0个或多个抽象方法,也可以包含非抽象方法。但需要注意的是,只要类中有一个抽象方法,那么该类必须声明为抽象类,即类前必须有abstract修饰。

2,抽象类不能创建对象,创建对象一般由抽象类派生的子类实现。但可以有声明,而且其声明可以引用所有具体子类的对象。

3,抽象类和具体类是继承和被继承的关系。

4,抽象类必定要派生子类,若子类为具体类,则具体子类中必须实现抽象类中定义的所有抽象方法;若子类为抽象类,则子类不能定义与父类同名的抽象方法。

5,再抽象类中,非抽象方法——以实现的方法,可以调用抽象方法。

6,abstract和final不能同时修饰一个类,应为final修饰的类为最终类,而抽象类一定会有子类继承。

接下来我们说一下接口,接口定义用关键字interface来修饰,而不用class。interface前的修饰符要么为public,要么为默认。其声明格式为:

[public] interface 接口名 [extends 父接口名列表]{

//静态常量数据成员声明

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

//抽象方法声明

[public][abstract] 返回值 方法名 (参数列表)[throw 异常列表]

}

使用接口时需要注意:

1,接口中定义的数据成员全是静态常量。

2,接口中没有构造方法,所有成员方法均为抽象方法。注意,方法前不能修饰为final。

3,接口也可以利用extends来继承。

4,接口和子接口都不能有自己的实力对象,但可以有自己的声明,也可以引用那些声明。(和抽象类一样)

5,借口之间可以多重继承。

一个类实现接口时需注意:

1,implements关键字用于实现接口。一个类可以实现多个接口,声明是在implements后用“,”隔开即可。类在实现接口时,实现方法应与接口中的定义完全一致。

2,接口的实现者可以继承接口中定义的常量。

3,如果是实现某接口的类不是抽象类,那它就必须实现借口中的所有抽象方法。

最后,抽象类和接口的比较可以参考下面例题,不再多说。

简单提一下引用比较:第一种方法是equals 方法比较,例如if(p1.equals(pp)),所传入参数必须是对象,注意对象不能和基本数据类型比较。第二种方法是使用“==”进行比较,如果“==”两边是引用,则比较他们的引用是否相同,若两边是值,则比较它们呢的数值即可。

一、

1.Java支持的数据类型有哪些?什么是自动拆装箱?
答:数据类型:byte, short,int, long, char, boolean, float, double;
自动拆箱:自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。

2.接口和抽象类的区别是什么?
答:1)接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
2)类可以实现很多个接口,但是只能继承一个抽象类
3)类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
4)抽象类可以在不提供接口方法实现的情况下实现接口。
5)Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
6)Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
7)接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

3.接口是否可继承接口?接口类是否实现接口?接口类是否可继承实体
答:接口可以继承接口;接口类可以实现接口,接口类可以继承接口类,但是实体类必须有构造函数。
面试常考题
1、Java抽象类可以有构造函数吗?
答:抽象类可以有构造函数,接口不可以有。
2、Java抽象类可以实现接口吗?它们需要实现所有的方法吗?
答:子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。
3、Java抽象类可以是final的吗?
答:、abstract不能与final并列修饰同一个类。
4、Java抽象类可以有static方法吗?
答:抽象方法可以有public、protected和default这些修饰符
abstract 不能与private、static、final或native并列修饰同一个方法。
5、可以创建抽象类的实例吗?
答:不可以。
6、抽象类必须有抽象方法吗?
答:不是必须,抽象和非抽象的都可以。
7、Java抽象类和接口有何不同?(同上题的2)
8、何时选用抽象类而不是接口?
答:抽象类的设计模式是自下而上的,而接口是自上而下的。当所设计的多个类中可以抽象出一个共同的类,这个时候适合抽象类,而不用接口。
程序题:
1>shape接口:
public interface shape {
double PI=3.1415;
public double circum();
public double area();
}
2>Circle类:
public class Circle implements shape{
private double r;
public Circle(double r){
this.r=r;
}
public double circum(){
return 2*PI*r;
}
public double area(){
return PI*r*r;
}
}
3>Rectangle类:
public class Rectangle implements shape{
private double length;
private double width;
public Rectangle(double length,double width){
this.length=length;
this.width=width;
}
public double circum(){
return 2*(length+width);
}
4>测试类:
public class Type {


/**
@param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
shape [] shapes = new shape[3];
shapes[0] = new Circle(2);
shapes[1] = new Rectangle(4, 6);
shapes[2] = new Circle(1);
shape s;
for (int i = 0; i < shapes.length; i++) {
s = shapes[i];
System.out.println(i+":周长="+s.circum()+", 面积="+s.area());
}
}
}
运行结果:
run:
0:周长=12.566, 面积=12.566
1:周长=20.0, 面积=24.0
2:周长=6.283, 面积=3.1415
成功构建 (总时间: 0 秒)
0 0
原创粉丝点击