1.抽象类
(1) 概述
- 我们在前面学习猫狗案例当中,发现猫和狗都继承动物这个类,我们对动物这个类也创建了对象,其实这是不对的,因为动物也是一个抽象的概念,你根本不知道是那种动物。所以前面我们给动物写的方法是不合理的,每个动物都有不同的行为。所以我们不应该在动物类中给出一个具体的实现,只需要给出一个方法声明即可。
- 在Java中,我们对于一个没有方法体的方法应该被定义为抽象方法,同时该类也被定义为抽象类。
- 抽象类:abstract class Animal{}
抽象方法:public abstract void eat() - 抽象类不一定有抽象方法,但有抽象方法的一定是抽象方法。
- 抽象类不能被实例化,但抽象类中却还有构造方法。因为这个构造方法是用来子类完成对抽象类初始化数据的用的。
- 抽象类的子类:抽象类的子类要么是抽象类,要么重写抽象类中所有的抽象方法。
- 举例
//具体事物:基础班老师,就业班老师
// 共性:姓名,年龄,讲课。
package com.westmo.demo1;
public class MyTest4 {
public static void main(String[] args) {
Teacher teacher= new jiuyeTeacher();
System.out.println(teacher.name = "小李");
System.out.println(teacher.age = 10);
teacher.teach();
jichuTeacher jichuTeacher = new jichuTeacher();
jichuTeacher.teach();
}
}
abstract class Teacher{
String name;
int age;
public abstract void teach();
}
class jiuyeTeacher extends Teacher{
public void teach(){
System.out.println("讲就业课");
}
}
class jichuTeacher extends Teacher{
public void teach(){
System.out.println("讲基础课");
}
}
(3)抽象类中的面试题
- 一个没有抽象方法的类可不可以被定义为抽象类,有什么意义?
答:可以,意义就是这个不能被实例化 - 抽象类不能和那些关键字共存?
答:private(修饰的方法不能被继承)
final(修饰的方法不能被重写)
static(无意义)
(1)概述 由前面的猫狗案例中,我们知道狗一般是看门的,可是有的狗却能搜寻猎物,而这些行为并不是它一开始就具备的,是后天训练出来的。我们对于这些额外的动作Java中就提供了接口来定义,并不给出具体的实现,将来那些对象需要这些额外的功能时,就只需要实现接口中的定义(重写)即可。
(2)特点
- 创建:interface 接口名{}
实现:class 类名 implements 接口名{} - 接口的子类可以是抽象类(没意义),也可以是具体类,但是该具体类必须要重写接口中所有的抽象方法。
- 成员变量: 都是静态常量,前面有默认修饰符public static final可以省略不写。
- 成员方法:都是抽象方法,前面有默认修饰符public abstract可以省略不写。
- 构造方法:没有构造方法
package com.westmo.demo1;
public class MyTest5 {
public static void main(String[] args) {
Test test = new Test();
test.show();
System.out.println(test.age);
//多态进行访问
//Interface1 In1 =new Test();
//System.out.println(In1.age);
//In1.show();
}
}
interface Interface1{
int age=10;
void show();
}
class Test implements Interface1{
@Override
public void show() {
System.out.println("你好");
}
}
(4)类与类,类与接口,接口与接口的关系
- 类与类
继承关系,只能单继承,也可以多层继承 - 类与接口
实现关系,既能单实现也能多实现(一个类实现多个接口) - 接口与接口
继承关系,可以单继承,也可以多继承
//举例:类与类前面有,这里就不测试了
package com.westmo.demo1;
public classMyTest6{
public static void main(String[] args) {
}
}
interface jiekou1{
public abstract void eat();
}
interfacejiekou2{
public abstract void play();
}
interface jiekou3 extends jiekou1{
}
interface jiekou4 extends jiekou1,jiekou2,jiekou3{//接口与接口多继承
}
class Test1 implements jiekou1,jiekou2,jiekou3{//一个类实现多个接口
@Override
public void eat() { }
@Override
public void play() { }
}
实例 【JavaSE|JavaSE——面向对象(五)(抽象类,接口)】动物类:姓名,年龄,吃饭,睡觉。
动物培训接口:跳高
狗继承动物类
部分狗继承狗类并实现跳高接口
通过抽象类测试基本功能。
通过接口测试扩展功能。
package com.westmo.demo1.demo2;
public class MyTest {
public static void main(String[] args) {
Interface In1=new wangcaiDog();
//wangcaiDog wangcaidog = new wangcaiDog();
In1.jump();
Animal animal=new Dog();
animal.eat();
System.out.println(animal.name = "小花");
}
}
interface Interface{
public abstract void jump();
}
abstract class Animal{
String name;
int age;
public abstract void eat();
public abstract void sleep();
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("吃鱼");
}
@Override
public void sleep() {
System.out.println("晚上睡觉");
}
public void lookdoor(){
System.out.println("看门");
}
}
class wangcaiDog extends Dog implements Interface{
@Override
public void jump() {
System.out.println("跳高");
}
}
推荐阅读
- 团队vue基础镜像选择思考
- 敖丙大佬的《吐血整理》-顶级程序员书单集 JAVA
- http|HTTP 流量拷贝测试神器 GoReplay
- mvnd打包快到飞起
- 基础算法
- Arrays.toString() 的用法
- JavaSE进阶Day01
- Spring|小唐开始学 Spring Boot——(3)利用mybatis访问数据表
- SpringBoot MongoDB批量删除指定日期前的文件