首页 > 编程语言 >Java拾贝第五天——抽象和接口

Java拾贝第五天——抽象和接口

时间:2023-10-18 13:24:49浏览次数:36  
标签:sell Java 拾贝 void 抽象类 Candy abstract 第五天 public

Java拾贝不建议作为0基础学习,都是本人想到什么写什么

如果父类的方法本身不需要实现,仅仅是为了定义方法。

目的是让子类去重写它,那么,可以把父类的方法声明为抽象(abstract)方法

class Candy {
    public abstract void sell();
}
//无法通过编译

若某类中拥有一个或若干个抽象方法,其类也必须声明为抽象(abstract)

abstract class Candy {
    int i;//抽象类中可以有属性
    public abstract void sell();
    public void buy();//抽象类中可以有普通方法
}

抽象类

如果一个类定义了方法,却没有方法的具体实现,那么该方法可以声明为抽象方法

其类也必须声明为抽象类

abstract修饰的类就是抽象类,无法实例化一个抽象类。

Candy candy = new Candy();//无法通过编译

那有什么用?事实上,抽象类强迫子类必须重写其内部的抽象方法。

所以抽象类可以被视作"模具"/"规范"/"模板"

在多态性得知,方法实际运行效果看子类的具体实现(基于子类重写)

public class test5 {
    public static void main(String[] args) {
        Candy candy = new SmallCandy();//向上转型
        candy.sell();
    }
}
abstract class Candy {
    public abstract void sell();
}
class SmallCandy extends Candy{
    @Override
    public void sell() {
        System.out.println("抽象类设计初始专门用于被继承的子类重写");
    }
}
//抽象类设计初始专门用于被继承的子类重写

抽象类可以拥有属性和普通方法,只要不涉及到抽象方法,可以把抽象类当作普通类去使用。

//向上转型勿忘    属性看对象,方法看指向。
public class test5 {
    public static void main(String[] args) {
        Candy c=new SmallCandy();
        c.i=10;
        System.out.println(c.i);
        System.out.println(c.getI());
        c.say();
        c.sell();
    }
}

abstract class Candy {
    int i;
    abstract void sell();
    void say() {
        System.out.println(getI());
    }
    int getI() {
        return this.i+10;
    }
}
class SmallCandy extends Candy{

    @Override
    void sell() {
        System.out.println(i);
    }
}
/*
10
20
20
10
*/

抽象编程

当我们定义了抽象类Candy,以及具体实现的SamllCandy、BigCandy或更多子类时

可以通过抽象类去指向子类实例。(向上转型)

Candy sc = new SmallCandy();
Candy bc = new BigCandy();

同样的,如果再新增一个子类,我们也不用去关心其具体的对象类型,直接使用向上转型。

Candy sc = new MiddleCandy();

这种尽量使用高层对象(继承关系的高层),避免使用其子类本身的编程方式称之为抽象编程

接口

如果一个抽象类中所有方法都是抽象方法,也没有定义属性。

abstract class Candy {
    public abstract void sell();
    public abstract void buy();
}

那么该抽象类可以改写为接口(interface)

interface Candy {
     void sell();
     public abstract void buy();


//在接口中,所有方法默认public abstract,加了也不影响。
}

当一个类要去实现接口时,使用implements关键字。(该类也被称为实现类)

interface Candy {

    void sell();

    void buy();
}

class SmallCandy implements Candy {
    @Override
    public void sell() {
        System.out.println("实现接口的类称之为实现类");
    }
    @Override
    public void buy() {//接口默认都是抽象方法,必须全部重写
    }
}

我们知道在Java中,只允许继承一个类

class Sub extends Base{}

但是允许实现多接口

class Sub extends Base implements Candy,SmallCandy,...{}

接口继承

接口也可也使用继承,与类的继承特点相同。

interface Candy {
    void sell();
}
interface SmallCandy extends Candy {
    void buy();
}

此时,SmallCandy接口现有2个抽象方法,其中1个来自继承的Candy。

相同的,实现类P也要重写2个方法。

class P implements SmallCandy{

    @Override
    public void sell() {
    }

    @Override
    public void buy() {
    }
}

default方法

如果要给接口新增一个方法时,会设计到全部子类,那么就可以使用defaul方法。

就可以不必去全部修改,只需要在继承树关系最高级的接口中新增defaul方法即可。

public class test5 {
    public static void main(String[] args) {
        Candy c=new P();//向上转型
        c.say();
        SmallCandy s =new P();
        s.say();//变量c和s都可以调用到say方法
    }
}

class P implements SmallCandy {

    @Override
    public void sell() {
    }
    @Override
    public void buy() {
    }
}

interface Candy {
    default void say(){
        System.out.println("default方法就是这个作用哒!");
    }
    void sell();
}

interface SmallCandy extends Candy {
    void buy();
}

default方法和抽象类的普通方法是有所不同的。因为interface没有属性,default方法无法访问属性,而抽象类的普通方法可以访问属性。

抽象类与接口的不同

抽象类 接口
继承 只能extends一个类 可以implements多个接口
属性 可以存在属性 不能存在属性
抽象方法 可以定义抽象方法 可以定义抽象方法
非抽象方法 可以定义普通方法 可以定义default方法

标签:sell,Java,拾贝,void,抽象类,Candy,abstract,第五天,public
From: https://www.cnblogs.com/Ocraft/p/17771841.html

相关文章

  • java在ubuntu上部署生产环境(适合小项目)
    一、概述需求:将SpringBoot项目打包成jar包,快速部署到云服务器的生产环境。(小型项目)二、部署步骤1.配置好项目运行所需的环境2.将jar包上传到服务器的指定目录(可以自定义)。如:/usr/local/或/tony/jar/(这是个自定义目录)3.创建一个服务文件并将其放入:/etc/system......
  • java
    "循环加载"(circulardependency)指的是,a脚本的执行依赖b脚本,而b脚本的执行又依赖a脚本。 css复制代码//a.jsvarb=require('b');//b.jsvara=require('a');通常,"循环加载"表示存在强耦合,如果处理不好,还可能导致递归加载,使得程序无法执行,因此应该避免出现......
  • 【有趣的小细节】在Java中native方法hashcode()默认是如何生成哈希码的?
    之前看其他文章说,hashcode是根据对象的内存地址生成的。但为了满足自己的好奇心,同时验证这个结论是否是真实的,我半个月前深究了一下。今天突然想起来这回事了,把结论记录一下。结论目前hashcode的方式有以下六种算法:HashCodeMode==0:由操作系统生成的一个随机数。HashCodeMode==1:基......
  • Java(Spring) 通过反射classforName获取对象实例导致@Autowired注入失效
    使用策略模式多态获取具体的策略问题描述:classforName在代码中使用反射获取对象实例后,对象实例中通过@Autowrite注解注入的属性值为null(注入失败),导致带反射获取的对象实例调用方法时出现空指针等情况。问题原因:通过反射获取对象实例相当于“new”了一个对象,所以这个对象并没有被......
  • 手写商用Java虚拟机HotSpot,疯狂磨砺技术中
    在当前Java行业激烈竞争的形式下,唯有掌握技术,心中才不能慌。在多年前,我就开始苦练底层技术,但是眼看百遍也不如手过一遍,所以我打算把虚拟机的精华实现部分用手敲出来,这个过程注定不会轻松,但是心态不能着急,要一步一步来,一年二年三年后终能达成。这个过程还会录制一些免费视频,简单介......
  • linux centos7安装配置java环境
    1.先查看本地是否自带java环境:yumlistinstalled|grepjava2.卸载自带的java(输入su,输入root超级管理员的密码,切换到root用户模式)yum-yremovejava-1.8.0-openjdk*yum-yremovetzdata-java*3.查看yum仓库中的java安装包yum-ylistjava*4.安装java:yum-yi......
  • JAVA爬虫被封IP问题的解决方法
    以下是JAVA爬虫被封IP问题的解决方法:解决Java爬虫被封IP问题随着网络技术的发展,Java爬虫在网络应用中越来越普遍,然而在爬取数据的过程中,经常会遇到IP被封的问题。以下是几种常见的解决方法:1.使用代理IP代理IP可以隐藏爬虫的真实IP地址,从而提高爬虫的隐蔽性,减少被封IP的风险。可以......
  • java图片转base64(不换行)
    publicstaticStringImageToBase64(StringimgPath){InputStreamin=null;byte[]data=null;//读取图片字节数组try{in=newFileInputStream(imgPath);data=newbyte[in.available()];in.read(data);in.close();}catc......
  • 【实操】Java+百度ocr,实现图片识别文字小工具
    前言......
  • Java拾贝第四天——动态绑定机制
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么//根据面向对象3中提及的属性看对象,方法看指向。试想如下代码publicclassTest4{publicstaticvoidmain(String[]args){Basebase=newSub();System.out.println(base.sum());System......