目录
一、引言 :
PS:首先在开头,要介绍一些内容,由于前人已经总结,我就不总结,我将用代码来分析。总结内容可以直接参考。
此外,这篇文章是为了我之后的多态做准备的。
① 接口和抽象类的分析:
主要是 接口的特点,抽象类的特点,他们的区别,共同点以及使用场景。
https://blog.csdn.net/fsq0827/article/details/78646119
注意:在该博客 四-1 中,我做了如下修改:
1、抽象类中的普通方法可以有方法体,但是抽象方法不可以,所以接口中的方法(全部是抽象)不可以有方法体。总结:抽象方法不可以有方法体。
② 接口成员变量使用规范
https://blog.csdn.net/qiumengchen12/article/details/44852023
③ 对读者需求:
看这篇文章之前,你应该已经知道了继承,重载,这两个基本知识以及Java面向对象基本知识。
那么接下来,我就开始了。
二、抽象类
1.抽象类的关键字
- extends 抽象类需要继承,才可以使用(有构造方法)
- abstract 在方法名或者类名之前加上
例如 abstract people :表示people抽象类,abstract eat(); 表示抽象方法
2.代码块:
import java.util.*;
//抽象类
abstract class people{
public abstract void method1();
public int a ;
}
class me extends people{
@Override //重写父类抽象方法
public void method1() {
System.out.println("重写了抽象类的抽象方法");
}
}
public class ABSTRACTTest {
public static void main(String[] args) {
people p =new me();
p.method1();
p.a=10;
System.out.println(p.a);
}
}
结果如下:
分析如下:
- 抽象类必须被子类实例化,不能自身实例化对象
- 请注意,此处用的是people p = new me(); 因为抽象类用于多态,所以此处为向上转型
- 若抽象类与子类有命名相同的成员变量,如下图
import java.util.*;
//抽象类
abstract class people{
public abstract void method1();
public int a=0 ;
}
class me extends people{
public int a=1;
@Override //重写父类抽象方法
public void method1() {
System.out.println("重写了抽象类的抽象方法");
}
}
public class ABSTRACTTest {
public static void main(String[] args) {
people p =new me();
p.method1();
me m=new me();
m.method1();
System.out.println(p.a+" "+m.a);
}
}
输出如下 :
三、接口
1.接口概念
- 接口是抽象类的延申,在抽象类的基础上,只有抽象方法,没有普通方法(构造方法也没有)
2.接口关键字
- extends 可以不继承,但是需要实现,才可以实例化出对象
- implement 类实现接口时需要的关键字
3.代码分析
①基本继承
import java.util.*;
//接口一
interface people{
public static final int a = 0;
public abstract void method2();
}
//接口二
interface people2{
public static final int b = 1;
public abstract void method3();
}
class me implements people,people2 {
@Override
public void method2() {
System.out.println("接口一");
}
@Override
public void method3() {
System.out.println("接口二" );
}
}
public class INTERFACETest{
public static void main(String[] args) {
people p=new me();
p.method2();
System.out.println(p.a);
people2 p2 = new me();
p2.method3();
System.out.println(p2.b);
}
}
结果如下:
分析如下:
- 定义了两个接口 people 和 people2 ,用me类来实现
- me类中分别重写了两个接口的抽象方法,
- 分别调用两个接口的引用p ,p2 来实例化对象,并调用接口方法(注意实例化的方式,也是向上转型)
- 表明接口支持多继承,可以同时多个接口
②接口另一种方式组合继承
代码如下:
import java.util.*;
//接口一
interface people{
public static final int a = 0;
public abstract void method2();
}
class student{
public void eating(){
System.out.println("妹妹喜欢吃零食");
}
}
class me extends student implements people {
@Override
public void method2() {
System.out.println("接口一");
}
}
public class INTERFACETest{
public static void main(String[] args) {
people p=new me();
p.method2();
System.out.println(p.a);
student w = new me(); //此处也可以 me w = new me();只不过前面用了向上转型而已
w.eating();
}
}
结果如下:
分析如下:
- 该代码由继承和接口实现共同构成
- 创建了一个接口(people)和两个普通类(student,me)
- me类继承student类并且实现了people类,然后在测试类中实例化me类对象,并调用抽象方法和父类方法
PS:
- 抽象类和接口都和向上转型相关,不同场景使用不同,具体内容可以看看我文章引言。