抽象类,接口(interface)与匿名对象

本文详细介绍了Java中的抽象类和接口,包括它们的特点、使用场景以及相互之间的区别。通过实例展示了如何在实际编程中使用抽象类和接口,解释了它们在软件设计中的作用,如实现多态性和模块化开发。此外,还提到了匿名对象的概念及其应用场景。
摘要由CSDN通过智能技术生成

目录

抽象类

abstract:修饰方法和类

抽象方法特点

抽象类成员特点

抽象类的一些细节

接口

接口成员特点

接口与类的关系

接口与抽象类区别

例子

匿名对象


抽象类

abstract:修饰方法和类

  • 抽象方法:不同类的方法相似,但具体内容不太一样,抽取它的声明,没有具体方法体的方法.
  • 抽象类:有抽象方法的类必须是抽象类
  • 注意:一个类继承了抽象类需要重写他所有的抽象方法,否则这个类就得是抽象类

抽象方法特点

  • 抽象方法只能在抽象类中
  • 抽象类和抽象方法必须被abstract修饰
  • 抽象类不能创建对象(不能实例化)
  • 抽象类中可以有非抽象的方法
  • 抽象类和类的关系也是继承,一个类继承抽象类,要么本身定义为抽象类,要么重写所有抽象方法

抽象类成员特点

  • 可以有成员变量 ,可以有常量
  • 成员方法:可以有抽象方法,非抽象方法
  • 可以有构造方法,对抽象类成员变量初始化

抽象类的一些细节

  • 抽象类关键字abstract不能和final共存,因为其定义的成员变量不能被子类继承改写,不能与private共存,因为其修饰的成员变量不能被子类访问
  • 抽象类不能创建对象实例化,但是其本身具有构造函数,因为其本身具有成员变量并需要初始化,抽象类本身作为一个类需要被子类继承,过程需要调用父类构造
  • 抽象类必须含有抽象方法

接口

继承的特性是单一继承,接口可以实现多个继承,接口里的所有方法全是抽象方法,接口和类的关系是实现,implements

格式:  interface 接口名{ }

接口成员特点

  • 接口中只能有抽象方法,只能有常量
  • 默认且只能使用 public&abstract修饰方法      (建议主动加上默认修饰符)
  • 默认使用public static final 修饰成员变量

注意:接口不能创建对象(不能实例化)

类与接口的关系是实现关系,一个类实现一个接口必须实现它的所有方法

接口与类的关系

  • 类与类:继承关系,单一继承,多层继承
  • 类与接口:实现关系,多实现  (接口中都是抽象方法,可以同时被多个子类实现)
  • 接口与接口关系: 继承关系,多层继承

优点:  打破了继承的局限性

           对外提供规范(规则)

           降低了程序的耦合性 (实现模块化开发,定义好规则后每个人实现自己的模块,提高开发效率)

接口与抽象类区别

区别: Ⅰ与类的关系:

  •          接口与类的关系:实现关系,且是多实现,一个类可以对接多个接口
  •          抽象类与类关系:继承关系,且java中的继承是单一继承,多层继承,一个类只能有一个父类

          Ⅱ 成员变量:

  •           接口只能有常量
  •           抽象类可以有成员变量,可以有常量

               成员方法:

  •            接口只能有抽象方法,且方法有默认修饰符 public abstract
  •            抽象类可以有抽象方法,可以有非抽象方法

               构造方法

  •             接口没有构造方法
  •             抽象类有构造方法

共性:不断抽取出抽象的概念

例子

 

package CeShi;

/**
 * @author Lzy
 * @creat 2021-01-17-20:36
 */
public class InterfaceTest {
    public static void main(String[] args) {
//创建软件系学生对象
        SoftWare sw = new SoftWare();
        sw.name = "小李";
        sw.age = 20;
        sw.gender = "男";
        sw.eat();//继承父类student类继承的Person类实现 eat  sleep 方法
        sw.sleep();
        sw.study();// 继承student实现study
        sw.speak();//实现SpeakEnglish接口
        System.out.println("--------------");
//创建医学教师
        DoctorTeacher ct = new DoctorTeacher();
        ct.name = "大刘";
        ct.age = 50;
        ct.gender = "女";
        ct.eat();//继承Teacher类继承的 Person类实现 eat sleep 方法
        ct.sleep();
        ct.teach();//继承Teacher类实现 teach 方法
    }
}
class Person{
    String name;//姓名
    int age;//年龄
    String gender;//性别
//无参构造
    public Person(){}
//有参构造
    public Person(String name,int age,String gender){
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    //吃
    public void eat(){
        System.out.println("吃饭饭");
    }
    //睡
    public void sleep(){
        System.out.println("睡觉觉");
    }
}

//学生  继承Person类
abstract class Student extends Person{
    //学习
    public abstract void study();
}
//老师  继承Person类
abstract class Teacher extends Person{
    public abstract void teach();
}
//软件系  继承Student类  实现SpeakEnglish接口
 class SoftWare extends Student implements SpeakEnglish{
    @Override
    public void study(){
        System.out.println("学编程");
    }
    @Override
    public void speak(){
        System.out.println("说英语");
    }
}
//医学系 继承Student类 
 class Doctor extends Student{
    @Override
    public void study(){
        System.out.println("学医");
    }
}
//说英语
interface SpeakEnglish{
    public abstract void speak();
}
//软件老师  继承Teacher类  实现SpeakEnglish接口
class SoftWareTeacher extends Teacher implements SpeakEnglish{
    @Override
    public void teach(){
        System.out.println("教编程");
    }
    @Override
    public void speak(){
        System.out.println("说英语");
    }
}
//医学老师   继承Teacher类
class DoctorTeacher extends Teacher{
    @Override
    public void teach(){
        System.out.println("教医学");
    }
}

匿名对象

没有变量引用的对象,用于不需要创建变量直接调用对象的场景

 应用场景:当方法只调用一次时候可以使用

package CeShi;

/**
 * @author Lzy
 * @creat 2021-01-18-10:14
 */
public class Name {
    public static void main(String[] args) {
        //常规调用方法
        Students s = new Students();
        s.study();
        //匿名对象是没有变量引用的对象
        new Students().study();
    }
}

class Students{
    String name;
    int age;

    public void study(){
        System.out.println("学习");
    }
}

可以当作参数进行传递,但无法在传参之前做其他事情

package CeShi;

/**
 * @author Lzy
 * @creat 2021-01-18-10:14
 */
public class Name {
    public static void main(String[] args) {
        //常规调用方法,可以对成员变量赋值并调用方法
        Students s = new Students();
        s.name = "比奇古";
        s.age = 18;
        method(s);
        System.out.println("---------");
        //匿名对象 无法在传参之前做其他事情
        method(new Students());
    }
    public static void method(Students s){
    }
}

class Students{
    String name;
    int age;
}

注意:匿名对象可以调用成员变量赋值,但赋值没有意义,因为赋值本身没有调用

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值