Java基础-学习笔记(十二)——抽象类和接口

1、抽象类的定义

java中可以定义一些不含任何语句的方法,它的方法体的实现方式可以交由子类来实现,这种方法叫抽象方法,只要类中有一个抽象方法,这个类就称为抽象类。含有抽象方法的类为抽象类,抽象类中所有的方法不一定全是抽象方法。

2、抽象类的规则

1)抽象类和抽象方法都需要用abstract关键字修饰

2)抽象类不能进行实例化,也就是不能用new创建抽象类的对象

3)抽象方法只需要声明,不用写语句

4)继承抽象类的子类只有在将从父类继承过来的所有抽象方法全部覆盖,该子类才能进行实例化,不然该子类也是抽象类

3、抽象方法的写法

abstract 返回值类型 抽象方法名(参数列表)

 1 abstract class Person
 2 {
 3     String name;
 4     private int age;
 5     public void getAge(int age)
 6     {
 7         this.age=age;
 8     }
 9     abstract void getInfo(){}
10 }
11 class Student extends Person
12 {
13     String school;
14     public void getInfo()//覆盖父类中的getInfo()
15     {
16         System.out.println("name="+name+" "+"age="+age+" "+"school="+school);
17     }
18     public void study()
19     {
20         System.out.println("I‘m studing");
21     }
22 }abstract class Person
23 {
24     String name;
25     private int age;
26     public void getAge(int age)
27     {
28         this.age=age;
29     }
30     abstract void getInfo(){}
31 }
32 class Student extends Person
33 {
34     String school;
35     public void getInfo()//覆盖父类中的getInfo()
36     {
37         System.out.println("name="+name+" "+"age="+age+" "+"school="+school);
38     }
39     public void study()
40     {
41         System.out.println("I‘m studing");
42     }
43 }

4、接口

一个抽象类中所有的方法都是抽象方法,那么我们可以将这个类用另外一种方式来定义。接口是抽象方法和常量值的定义的集合,从本质上讲,接口就是一种特殊的抽象类,这种抽象类只能有常量和方法的定义,不能有变量和方法的实现

abstract class Person
{
  public static fina String name;
  public static fina int age;
  abstract void getInfo(){}
}

这个Person类我们就可以把它定义成接口,由于它是常量(均为全局静态变量)和抽象方法的集合,所以abstract可以省略,常量的public static final也可以省略,并且,默认用public修饰,所以也可以省略public。如下:

public interface Person

{
  String name;
  int age;
  void getInfo();
}

5、实现接口

可以定义一个新的接口来继承一个已有的接口,同样是需要用extends关键字来实现。也可以定义一个类,来实现接口中所有的方法,需要用implements关键字来实现

 1 interface Runner
 2 {
 3     int id=3;
 4     void run();
 5 }
 6 interface Animal extends Runner
 7 {
 8     void breathe();
 9 }
10 class Fish implements Animal
11 {
12     void run()
13     {
14         System.out.println("I can swim!");
15     }
16     /*public void breathe()
17     {
18         System.out.println("I can breathe!");
19     }*/
20 }
21 /*
22 F:\java_example\lesson5>javac test.java
23 test.java:10: 错误: Fish不是抽象的, 并且未覆盖Animal中的抽象方法breathe()
24 class Fish implements Animal
25 ^
26 test.java:12: 错误: Fish中的run()无法实现Runner中的run()
27         void run()
28              ^
29   正在尝试分配更低的访问权限; 以前为public
30 2 个错误
31 */

上面这段代码出错了,第一:是没有实现接口Animal中的所有类;第二,是由于我们要进行重写方法,那么Fish类中的访问修饰符级别应该高于或等同于接口中方法的访问修饰符

一个类在继承一个父类的同时,可以实现一个或多个接口,但extends关键字必须在implements关键字之前,如下所示

1 class Student extends Person implements Runner
2 {
3     ...
4     public void run()
5     {
6         System.out.println("I can run!");
7     }
8     ...
9 }

由于接口当中的是static修饰的常量,那么可以直接由类名来进行引用。用来实现接口的类,同样也可以通过该类来直接引用被实现接口中的常量,也可以新建对象来引用

 1 interface Runner
 2 {
 3     int id=3;
 4     void run();
 5 }
 6 interface Animal extends Runner
 7 {
 8     void breathe();
 9 }
10 class fish implements Animal
11 {
12     public void run()
13     {
14         System.out.println("I can swim!");
15     }
16     public void breathe()
17     {
18         System.out.println("I can breathe!");
19     }
20 }
21 interface Flyer
22 {
23     void Fly();
24 }
25 class Bird implements Runner,Flyer
26 {
27     public void run()
28     {
29         System.out.println("I can run!");
30     }
31     public void Fly()
32     {
33         System.out.println("The bird is flying!");
34     }
35     public static void main(String [] args)
36     {
37         Bird birds=new Bird();
38         System.out.println("the runner‘s id is "+Runner.id);
39         birds.Fly();
40         System.out.println("the runner‘s id is "+Bird.id);
41         System.out.println("the runner‘s id is "+birds.id);
42     }
43 }
44 /*
45 F:\java_example\lesson5>java Bird
46 the runner‘s id is 3
47 The bird is flying!
48 the runner‘s id is 3
49 the runner‘s id is 3
50 */

6、接口特性:

实现一个接口就是要实现该接口中的所有方法(抽象类除外);

接口中的方法都是抽象的;

多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口。

7、接口设计的目的:

在java中,设计接口的目的就是为了让类不必受限于单一继承的关系,而可以灵活的继承一些共有的特性,从而达到多重继承的目的,并且避免了C++中多重继承的复杂关系所产生的问题。多重继承的危险性在于一个类可能继承了同一个方法中的不同实现,对于接口来讲就没有这种情况发生,因为接口没有实现。

时间: 2024-08-09 21:58:36

Java基础-学习笔记(十二)——抽象类和接口的相关文章

Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权限修饰符,默认访问, 类,方法,成员变量 private 权限修饰符,私有访问, 方法,成员变量 static 静态修饰符 方法,成员变量 final 最终修饰符 类,方法,成员变量,局部变量 abstract 抽象修饰符 类 ,方法 我们编写程序时,权限修饰符一般放于所有修饰符之前,不同的权限修饰

java jvm学习笔记十二(访问控制器的栈校验机制)

欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们会简单的描述一下jvm访问控制器的栈校验机制. 这节课,我们还是以实践为主,什么是栈校验机制,讲一百遍不如你自己实际的代码一下然后验证一下,下面我们下把环境搭起来. 第一步,配置系统环境.(copy吧,少年) path=%JAVA_HOME%/bin JAVA_HOME=C:/Java/jdk1.6

Java基础学习笔记十六 集合框架(二)

List List接口的特点: 它是一个元素存取有序的集合.例如,存元素的顺序是11.22.33.那么集合中,元素的存储就是按照11.22.33的顺序完成的. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理). 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素. List接口的常用子类有: ArrayList集合 LinkedList集合 List接口的特有方法(带索引的方法)1.增加元素方法 add(Object e):向集合末尾

Java基础学习笔记十五 集合、迭代器、泛型

Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. 集合中存储的元素必须是引用类型数据 集合继承关系图 ArrayList的继承关系: 查看ArrayList类发现它继承了抽象类AbstractList同时实现接口List,而List接口又继承了Collection接口.Collec

Java基础学习笔记十九 IO

File IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据读出来继续使用呢?其实要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘.光盘.U盘等)上. 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作.当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作.因此我们把这种输入和

JavaBean(web基础学习笔记十二)

一.JavaBean简介 JavaBean是使用Java语言开发的一个可重用的组件,在JSP的开发中可以使用JavaBean减少重复代码,使整个JSP代码的开发更简洁.JSP搭配JavaBean来使用, 有以下的优点: 可将HTML和Java代码分离,这主要是为了日后维护的方便.如果把所有的程序代码(HTML和Java)写到JSP 页面中,会使整个程序代码又多又复杂,造成日后维护上的困难. 可利用JavaBean的优点.将常用到的程序写成JavaBean组件,当在JSP要使用时,只要调用Java

Java基础学习笔记十四 常用API之基本类型包装类

基本类型包装类 Java中有8种基本的数据类型,可是这些数据是基本数据,想对其进行复杂操作,变的很难.怎么办呢?在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类型,考试成绩需要转换成double类型等.那么,想实现字符串与基本数据之间转换怎么办呢?Java中提供了相应的对象来解决该问题,基本数据类型对象包装类:java将基本数据类型值封装成了对象.封装成对象有什么好处?可以提供更多

Java基础学习笔记十八 异常处理

什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体系 在Java中使用Exception类来描述异常. 查看API中Exception的描述,Exception 类及其子类是 Throwable 的一种形式,它用来表示java程序中可能会产生的异常,并要求对产生的异常进行合理的异常处理. Exception有继承关系,它的父类是Throwable.Thr

Java基础-学习笔记(二)

1.java的普通数据类型 数据类型 关键字 占用字节数 布尔型 boolean 1 字节型 byte 1 字符型 char 1 短整型 short 2 整型 int 4 长整型 long 8 浮点型 float 4 双精度型 double 8 2.普通数据类型之间的转换,一个例子说明情况 1 public static void main(String args[]) 2 { 3 int x=1; 4 float f=2.0f;//如果不加f,则默认为double类型 5 double e=f

Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类

final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢?要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变.final是个修饰符,它可以用来修饰类,类的成员,以及局部变量. final的特点 final修饰类不可以被继承,但是可以继承其他类. class Yy {} final clas