JAVA中的抽象类和接口

一 抽象类

抽象类就是不能被实例化的类,即不可以用new运算符创建本类的对象。在实际应用中,抽象类应该具有子类,且其子类一般不为抽象类。

java中使用抽象类的原因有如下四点:

1.抽象类是较高层次的概括,其他的类可以继承它的抽象化特征;

2.抽象类包括它的所有子类共享的公共行为和公共属性,即抽象类中定义一些属性和方法,其他类继承该抽象类并实现这些属性和方法;

3.抽象类使编写程序更贴近人类的思维方式和客观世界;

4.在用户生成实例时强迫用户生成更具体的实例,保证代码的安全性。

二 接口

在接口中只包含    常量    和     方法的声明,接口中的数据成员默认为static和final,方法默认为public abstract

java中使用接口的原因有如下四点:

1.弥补单继承的不足;

2.接口中定义动作原型,由实现接口的类完成接口中的方法,这样可以最大限度的实现动态绑定,隐藏实现细节,实现不同类之间的常量共享;

3.接口可以了解对象的交互界面,而无需了解对象所对应的类;

4.接口为设计和规划大型java应用程序提供了一种方便的程序设计框架。

三  抽象类和接口的区别

1.抽象类中可以定义抽象的和非抽象的元素,接口是完全抽象的(常量以及抽象方法)。

2.接口没有构造方法,而抽象类中可以有构造方法,但不能创建抽象类的对象。

3.一个类每次只能继承一个类,可以实现多个接口。一个接口可以扩展多个接口。(类的继承和接口的扩展都用关键字extends)

4.接口中的成员都是public的,而抽象类没有这样的限定。

四 抽象类用法以及实例

[访问权限修饰符] abstract class 抽象类名 {

//抽象类成员

}

几点说明:

1.抽象类中可以没有任何抽象方法,但这样做违背了高度抽象的原则。

2.若一个类中有抽象的方法,那么这个类一定为抽象类。

3.抽象类中可以声明构造方法,但是抽象类不能用new运算符创建抽象类的对象。

4.可以声明抽象类的变量,然后讲一个子类对象赋值给它,这是对象的上转型对象用法。

抽象类实例

 1 package 抽象类测试;
 2
 3 abstract class Shape {                                //抽象类
 4     public abstract void showArea();
 5 }
 6
 7 class Circle extends Shape{                            //圆类,继承抽象类Shape
 8     private double r;                                //圆的半径
 9
10     public double getR() {                            //圆的get方法
11         return r;
12     }
13
14     public void setR(double r) {                    //圆的set方法
15         this.r = r;
16     }
17
18     public Circle(double r) {                         //带参数的构造方法
19         this.r = r;
20     }
21
22     public Circle(){                                //无参数的构造方法
23
24     }
25
26     public void showArea() {                        //实现继承的抽象类的抽象方法
27         System.out.println("圆的面积为: " + Math.PI * r * r);
28     }
29 }
30
31 class Rectangle extends Shape{                        //矩形类,继承了抽象类Shape
32     private double width;                            //宽
33     private double height;                            //高
34
35     public double getWidth() {
36         return width;
37     }
38
39     public void setWidth(double width) {
40         this.width = width;
41     }
42
43     public double getHeight() {
44         return height;
45     }
46
47     public void setHeight(double height) {
48         this.height = height;
49     }
50
51     public Rectangle(double width, double height) {
52         this.width = width;
53         this.height = height;
54     }
55
56     public Rectangle(){
57
58     }
59
60     public void showArea() {                            //实现继承的抽象类的抽象方法
61         System.out.println("矩形的面积为: " + width * height);
62     }
63 }
64 public class AbstractDemo {
65     public static void main(String[] args) {
66         Shape shape;
67         Circle circle = new Circle(1);
68         shape = circle;
69         shape.showArea();            //此处调用的是Circle类中实现的showArea()方法
70         Rectangle rectangle = new Rectangle(2, 3);
71         shape = rectangle;
72         shape.showArea();            //此处调用的是Rectangle类实现的showArea()方法
73     }                                //以上两处都是shape.showArea()方法,但是输出的结果不同
74
75 }

运行结果如下

圆的面积为: 3.141592653589793
矩形的面积为: 6.0

五 接口的使用方法和实例

接口的定义

[接口修饰符] interface 接口名称 [extends 父接口名] {

//方法的声明以及静态常量

}

几点说明:

1.接口中的数据成员是静态常量,用final修饰,必须赋初始值,此值不能改变,可以实现不同类之间的常量共享。

2.接口中的方法必须为抽象方法,用public abstract修饰。

3.接口中数据成员前的final关键字,抽象方法前的public abstract 关键字可以省略。

4.一个类只能继承一个父类,但是可以实现多个接口。 如 class A extends B inplements C, D, E;

5.一个类实现某个接口时,需要实现接口中所有的方法

6.一个类在实现接口中的方法时,一定要用public修饰

7.一个接口可以扩展多个接口。    interface 子接口名 extends 父接口名1, 父接口名2 ...;

接口实例

 1 package 接口测试;
 2
 3 interface Area {
 4 //    final double area = 100;
 5     public abstract void showArea();
 6 }
 7
 8 class Circle implements Area {
 9 private double r;                                //圆的半径
10
11     public double getR() {                            //圆的get方法
12         return r;
13     }
14
15     public void setR(double r) {                    //圆的set方法
16         this.r = r;
17     }
18
19     public Circle(double r) {                         //带参数的构造方法
20         this.r = r;
21     }
22
23     public Circle(){                                //无参数的构造方法
24
25     }
26
27     public void showArea() {                        //实现接口中的抽象方法
28         System.out.println("圆的面积为: " + Math.PI * r * r);
29     }
30 }
31
32 class Rectangle implements Area {
33     private double width;                            //宽
34     private double height;                            //高
35
36     public double getWidth() {
37         return width;
38     }
39
40     public void setWidth(double width) {
41         this.width = width;
42     }
43
44     public double getHeight() {
45         return height;
46     }
47
48     public void setHeight(double height) {
49         this.height = height;
50     }
51
52     public Rectangle(double width, double height) {
53         this.width = width;
54         this.height = height;
55     }
56
57     public Rectangle(){
58
59     }
60
61     public void showArea() {         //实现接口中的抽象方法
62         System.out.println("矩形的面积为: " + width * height);
63     }
64 }
65 public class InterfaceDemo {
66     public static void main(String[] args) {
67         Area area;
68         Circle circle = new Circle(1);
69         area = circle;
70         area.showArea();            //此处调用的是Circle类中实现的showArea()方法
71         Rectangle rectangle = new Rectangle(2, 3);
72         area = rectangle;
73         area.showArea();            //此处调用的是Rectangle类实现的showArea()方法
74     }                                //以上两处都是area.showArea()方法,但是输出的结果不同
75
76
77 }

运行结果

圆的面积为: 3.141592653589793
矩形的面积为: 6.0

以上两个程序分别用抽象类和接口实现了多态。

时间: 2024-11-23 01:39:24

JAVA中的抽象类和接口的相关文章

Java 中的抽象类及接口

抽象类使用 abstract 关键字修饰,该类即为抽象类. 抽象类的作用: 1.某些情况下,父类约束子类必须包含哪些方法,但不知道子类如何去实现这些方法. 2.可以从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,避免子类设计的随意性. 抽象类的使用规则: 1.使用 abstract 定义抽象对象: 2.abstract 定义抽象方法,只有声明,不需要实现: 3.包含抽象方法的类是抽象类: 4.抽象类中可以包含普通的方法,也可以没有抽象方法: 5.抽象类不能直接创建,可以定义

关于JAVA中的抽象类和接口中常量和变量定义的原因

转载自https://my.oschina.net/cdzsc/blog/86107 在抽象类中,可以包含一个或多个抽象方法:但在接口(interface)中,所有的方法必须都是抽象的,不能有方法体,它比抽象类更加"抽象". 1. 为什么接口中只能定义static final:     1.1 static(这时暂且认为是变量)解释:因为一个类可以实现多个接口,如果一个类同时实现了多个接口而每个接口中都定义了同一个变量的话就会产生在类中不知道是哪个接口中的变量了,所以必须定义成stat

java中的抽象类和接口详解

1.抽象类 /** 1. 抽象方法一定存在于抽象类中,抽象方法和抽象类需要abstract修饰! 2. 抽象类不能实例化. 3. 如果抽象类中多个抽象方法,而其子类只继承了一个抽象方法,则该子类为抽象类,故也无法实力化. 4. 抽象类只能被子类覆盖其全部的抽象方法,才能建立子类对象! 5. 抽象类中可以有非抽象方法 */ //该子类未覆盖父类func1的抽象方法,故子类为抽象类,不能实例化.编译失败 abstract class Person{     abstract void func();

java中的抽象类与接口

抽象类: 用关键字abstract(位于class关键字之前的任何位置)修饰的类叫做抽象类,抽象类不能被实例化,即不能new出来一个抽象类的对象(实例). 对于关键字abstract---->可选修饰符(static.final.abstract)一般可以共存,但abstract与static.final都不能同时共存(理解其的真正含义) 抽象方法: 用abstract关键字所修饰的方法叫做抽象方法. 抽象方法必须定义在抽象类中. 抽象方法有声明,无实现(没有花括号{},有花括号但是内容为空也是

Java读书笔记十四(java中的抽象类)

前言 在java中,有时候需要对类的行为进行提取,因此也就有了抽象类和接口的概念,这篇博客,小编来剖一下java中的抽象类和接口.  抽象方法和抽象类 抽象方法和抽象类的规则如下: 1.抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽线方法不能有方法体 2.抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例.即使抽象类里不可包含抽象方法,这个抽象类也不能被创建实例. 3.抽象类可以包含成员变量.方法(普通方法和抽象方法都可以

Java语言中的----抽象类、接口

day12  Java语言中的抽象类与接口 一.抽象类和接口概述; 在昨天我们学习了Java的继承功能,这个是一个核心知识点,今天我们再继承的基础之上学习一下抽象类和接口这两个知识.什么是抽象类?如何定义一个抽象类?如何使用一个抽象类?这些都是我们需要掌握的. 同时我们还要知道如何来定义一个接口,在开发中定义接口来实现相关的功能是一个很重要的功能.如何来实现接口中的抽象方法,这些在这一节都会说到. 二.抽象类和接口 1.抽象类: 什么是抽象类?包含抽象方法的类就叫做抽象类 .使用abstract

java 中的2个接口 Comparable和Comparator

像Integer.String这些类型的数据都是已经实现Comparable接口的,所以对这些类型可以直接通过Arrays.sort(...)和Collections.sort(...)方法进行排序.但是对于一些自己new出来的对象而言,如果想使用sort这种方法,必须要实现Comparable接口,这是由sort方法底层决定的,具体看一下实例: 定义一个Bean public class Employee implements Comparable{ private int age;  pri

Java中Comparable和Comparator接口区别分析

Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧.Comparable 简介Comparable 是排序接口.若一个类实现了Comparab 本文要来详细分析一下Java中Comparable和Comparator接口的区别,

C++--C++对象模型分析、c++中的抽象类和接口

一.C++对象模型分析 A.class是一种特殊的struct1.在内存中class依旧可以看作变量的合集2.在class域struct遵循相同的内存对齐规则3.class中的成员函数与成员变量是分开存放的--每个对象有独立的成员变量,所有对象共享类中的成员函数Q:class与struct的内存占用情况? #include <iostream> #include <string> using namespace std; class A { int i; int j; char c