javase学习第九天(抽象类与接口)

抽象类与接口

抽象类

用abstract修饰的类称为抽象类; abstract class 类名{};

用abstract修饰的方法为抽象方法;

抽象方法没有方法体,即没有{};

抽象类可以没有抽象方法,有抽象方法的类一定是抽象类;

抽象类不能实例化;具体是由子类实例化完成的,也体现了抽象类多态

抽象类可以有构造方法,是用来被子类调用的,程序员自己不能调用。

子类继承抽象类,使用extends;分两种情况:

1、子类仍为抽象类:不完全实现其父类的抽象方法;

2、完全的实现类:重写父类抽象类中的所有抽象方法,可以进行实例化对象。

抽象类的抽象方法定义的非法组合:

1、private+abstract:抽象方法依靠子类去实现,但私有方法在类外就不能访问,也就无法实现;

2、final+abstract:final修饰的方法不能被重写,而抽象方法就是需要子类实现,彼此矛盾;

3、static+abstract:抽象方法是没有实体的,使用类名调用的使用调用的是没有实体的方法,没有作用。

抽象类成员的特点:

成员变量:

即可以是变量,也可以是常量(final);

构造方法:有,用于子类访问抽象类数据的初始化;

成员方法:即可以是抽象的,也可以是非抽象的;

抽象类的成员方法特征: 1、抽象方法,强制要求子类去实现; 2、非抽象方法:子类继承的事情,提高代码的复用性。

接口

定义

接口定义了一种规范,接口规定了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类的方法的实现细节,它只规定这批类必须提供某些方法。

接口里的所有方法都是抽象方法,成员变量全部是常量实现类首先用该实现这些最基本的方法,然后在此基础上进行扩展。

特点

格式:interface 接口名{}

类实现接口用implements关键字。 格式:class 类名 implements 接口名{}

接口没有构造方法,即接口不能实例化。由具体的子类实例化。

接口的子类

1、可以是抽象类,用implements关键字

2、可以是一个接口,用extends关键字

3、可以是一个实现类,实现接口中的所有抽象方法。

总结:

1.接口不能实例化对象

2.子类如果是实现类的话,就必须实现接口中定义的所有抽象方法

3.子类如果不完全实现接口中的抽象方法,那子类就是抽象类

4.接口和接口之间可以继承--extends

接口成员特点

成员变量

1、只能是常量,通过接口名访问静态常量;

2、默认修饰符public static final,其中的任何一个都可以省略,也可以全都省略。

构造方法

没有,因为接口主要是扩展功能的,而没有具体存在,子类的构造方法中可以使用super()。

成员方法

1、只能是抽象方法

2、默认修饰符public abstract,可以省略其中之一,或则都省略。

类与类,类与接口,接口与接口的关系

普通类与普通类--extends

继承关系,只能单继承,但是可以多层继承

普通类与抽象类--extends

继承关系,只能单继承,但是可以多层继承

普通类与接口,抽象类与接口--implements

1、实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口

2、此时应注意:extends 写在前,implements写在后

接口与接口--extends

继承关系,可以单继承,也可以多继承

抽象类和接口区别

成员区别

抽象类 :

变量,常量都可以有;

抽象方法,非抽象方法都可以有;可以有构造方法

接口 :

只有常量;只有抽象方法;没有构造方法

实例:

 1 interface ISmoke{
 2     public void smoking();
 3 }
 4 abstract class Person{
 5     private String name;
 6     private int age;
 7     public void setName(String name){
 8         this.name=name;
 9     }
10     public void setAge(int age){
11         this.age=age;
12     }
13     public String getName(){
14         return name;
15     }
16     public int getAge(){
17         return age;
18     }
19     public Person(){}
20     public Person(String name,int age){
21         this.name=name;
22         this.age=age;
23     }
24     public abstract void eat();
25     public void sleep(){
26         System.out.println("all person should sleep");
27     }
28 }
29 class Student extends Person{
30     public Student(){}
31     public Student(String name,int age){
32         super(name,age);
33         
34     }
35     public void eat(){
36         System.out.println("students eat noodle");
37     }
38 }
39 class Teacher extends Person{
40     public Teacher (){}
41     public Teacher(String name,int age){
42         super(name,age);
43     }
44     public void eat(){
45         System.out.println("teacher eat rice");
46     }
47 }
48 class SmokStudent extends Student implements ISmoke{
49     public SmokStudent(){};
50     public SmokStudent(String name,int age){
51         super(name,age);
52     }
53     public void smoking(){
54         System.out.println("i'm student,but i can smoking");
55     }
56     
57 }
58 class PersonDemo{
59     public static void main(String[] args){
60         Person p=new Student("tom",23);
61         p.eat();
62         p.sleep();
63         System.out.println("name: "+p.getName()+" age:"+p.getAge());
64         System.out.println("------------");
65         SmokStudent sm=new SmokStudent("tomtma",35);
66         System.out.println("name: "+sm.getName()+" age:"+sm.getAge());
67         sm.eat();
68         sm.sleep();
69         sm.smoking();
70     }
71 }

 

原文地址:https://www.cnblogs.com/yihaifutai/p/6624333.html