JAVA.抽象、接口、内部类

news2024/11/14 17:56:55

1.抽象

共性,父类定义抽象方法,子类必须重写,或者子类也是抽象类

示例代码

animal

package animalabstract;

//定义抽象类animal
public abstract class animal {

    String name;
    int age;

    //定义抽象方法eat,子类必须重写
    public abstract void eat();
}

rabbit

package animalabstract;

public class rabbit extends animal{

    @Override
    public void eat() {
        System.out.println("rabbit eat 胡萝卜");
    }
}

frog

package animalabstract;

public class frog extends animal{
    @Override
    public void eat() {
        System.out.println("frog eat 虫子");
    }
}

dog

package animalabstract;

public class dog extends animal{


    @Override
    public void eat() {
        System.out.println("dog eat 骨头");
    }
}

Test

package animalabstract;

public class Test {
    public static void main(String[] args) {
        rabbit rb = new rabbit();
        rb.eat();
        frog fg = new frog();
        fg.eat();
        dog dog = new dog();
        dog.eat();
    }
}

抽象类里面可以有构造方法,比如

2.接口

示例代码

swim

package animalabstract;

public interface swim {
    public void swim();
}

用上面抽象的示例代码,animal和rabbit不用改,但是dog类和frog类需要实现swim接口,需要改

dog

package animalabstract;

public class dog extends animal implements swim{


    @Override
    public void eat() {
        System.out.println("dog eat 骨头");
    }

    @Override
    public void swim() {
        System.out.println("dog 狗刨");
    }
}

frog

package animalabstract;

public class frog extends animal implements swim{
    @Override
    public void eat() {
        System.out.println("frog eat 虫子");
    }

    @Override
    public void swim() {
        System.out.println("frog 蛙泳");
    }
}

Test

package animalabstract;

public class Test {
    public static void main(String[] args) {
        rabbit rb = new rabbit();
        rb.eat();
        frog fg = new frog();
        fg.eat();
        fg.swim();
        dog dog = new dog();
        dog.eat();
        dog.swim();
    }
}

成员变量

只能是常量,默认 public static final

构造方法

没有

成员方法

抽象方法等, public abstract

3.接口,类之间的关系

实现多个接口里面有重名的方法也没事,因为是抽象的,需要重写

示例代码

代码结构

package coachplayer;

public abstract class person {
    String name;
    int age;

    public person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }



    public abstract String info();
}
package coachplayer;

public abstract class player extends person{
    public player(String name, int age) {
        super(name, age);
    }
    public abstract String info();
    public abstract void study();
}
package coachplayer;

public abstract class coach extends person{

    public coach(String name, int age) {
        super(name, age);
    }
    public abstract String info();
    public abstract void teach();
}
package coachplayer;

public class ppplayer extends player implements english {

    public ppplayer(String name, int age) {
        super(name, age);
    }

    @Override
    public String info() {
        return this.name + " " + this.age ;
    }

    @Override
    public void study() {
        System.out.println("乒乓球运动员学习打乒乓球");
    }

    @Override
    public void english() {
        System.out.println("乒乓球运动员说英语");
    }
}
package coachplayer;

public class bbplayer extends player{
    public bbplayer(String name, int age) {
        super(name, age);
    }
    @Override
    public String info() {
        return this.name + " " + this.age ;
    }
    @Override
    public void study() {
        System.out.println("篮球运动员打篮球");
    }
}
package coachplayer;

public class ppcoach extends coach implements english{
    public ppcoach(String name, int age) {
        super(name, age);
    }
    @Override
    public String info() {
        return this.name + " " + this.age ;
    }
    @Override
    public void teach() {
        System.out.println("乒乓球教练教乒乓球");
    }

    @Override
    public void english() {
        System.out.println("乒乓球教练说英语");
    }
}
package coachplayer;

public class bbcoach extends coach {


    public bbcoach(String name, int age) {
        super(name, age);
    }
    @Override
    public String info() {
        return this.name + " " + this.age ;
    }
    @Override
    public void teach() {
        System.out.println("篮球教练教篮球");
    }
}
package coachplayer;

public interface english {
    public void english();
}
package coachplayer;

public class Test {
    public static void main(String[] args) {

        ppplayer ppl=new ppplayer("leo",18);
        ppl.study();
        ppl.english();
        System.out.println(ppl.info());
        bbplayer bbl=new bbplayer("jack",20);
        bbl.study();
        System.out.println(bbl.info());
        ppcoach ppc=new ppcoach("james",50);
        ppc.teach();
        ppc.english();
        System.out.println(ppc.info());
        bbcoach bbc=new bbcoach("amy",40);
        bbc.teach();
        System.out.println(bbc.info());

    }
}

4.接口特殊方法

default

在接口里定义  fun,默认  public abstract ,所以在实现这个接口的时候,就必须对该方法重写

package interface3tips;

public interface inter0 {

    public abstract void fun();
}


package interface3tips;

public class class1 implements inter0{
    @Override
    public void fun() {
        System.out.println("class继承了inter0");
    }
}
package interface3tips;

public class TEST {
    public static void main(String[] args) {
        class1 c1 = new class1();
        c1.fun();
    }
}

但是,把abstract改成default,实现这个接口的时候就不需要重写,因为他是默认的方法,你可以重写也可以不重写,然后可以直接使用

package interface3tips;

public interface inter0 {

    public default void fun(){
        System.out.println("fun的default");
    }
}


package interface3tips;

public class class1 implements inter0{

}
package interface3tips;

public class TEST {
    public static void main(String[] args) {
        class1 c1 = new class1();
        c1.fun();
    }
}

static

package interface3tips;

public interface inter0 {

    public default void fun(){
        System.out.println("fun的default");
    }
    public static void show(){
        System.out.println("inter0的静态方法");
    }
}


package interface3tips;

public class class1 implements inter0{

}
package interface3tips;

public class TEST {
    public static void main(String[] args) {
        class1 c1 = new class1();
        c1.fun();
        inter0.show();
    }
}

private

package interface3tips;

public interface inter0 {

    public default void fun(){
        System.out.println("fun的default");
        fun1();
    }
    public static void show(){
        System.out.println("inter0的静态方法");
    }
    private void fun1(){
        System.out.println("私有方法,外类访问不到");
    }
}


package interface3tips;

public class class1 implements inter0{

}
package interface3tips;

public class TEST {
    public static void main(String[] args) {
        class1 c1 = new class1();
        c1.fun();
        inter0.show();
    }
}

package interface3tips;

public interface inter0 {

    public default void fun(){
        System.out.println("fun的default");
        fun1();
    }
    public static void show(){
        System.out.println("inter0的静态方法");
        fun2();
    }
    private void fun1(){
        System.out.println("私有方法,外类访问不到");
    }
    private static void fun2(){
        System.out.println("私有静态方法,外类访问不到");
    }
}


package interface3tips;

public class class1 implements inter0{

}
package interface3tips;

public class TEST {
    public static void main(String[] args) {
        class1 c1 = new class1();
        c1.fun();
        inter0.show();
    }
}

5.适配器

  当接口inter0有很多个抽象方法,那么一个类class1继承的时候就必须重写所有的抽象方法,但我不想这样,所以先创建一个新的类作为适配器inter0Adapter,实现这个接口,然后再用类来继承这个适配器类  class1 extends interAdapter,这样我的class1类就不用重写inter0的所有抽象方法

package interface3tips;

public interface inter0 {

    public abstract void fun1();
    public abstract void fun2();
    public abstract void fun3();
    public abstract void fun4();
    public abstract void fun5();


}


package interface3tips;

public abstract class inter0Adapter implements inter0{
    @Override
    public void fun1() {
        System.out.println("适配器的fun1");
    }

    @Override
    public void fun2() {
        System.out.println("适配器的fun2");
    }

    @Override
    public void fun3() {
        System.out.println("适配器的fun3");
    }

    @Override
    public void fun4() {
        System.out.println("适配器的fun4");
    }

    @Override
    public void fun5() {
        System.out.println("适配器的fun5");
    }
}
package interface3tips;

public class class1 extends inter0Adapter{

    @Override
    public void fun5(){
        System.out.println("只用到fun5");
    }

}
package interface3tips;

public class TEST {
    public static void main(String[] args) {
    class1 c1 = new class1();
    c1.fun1();
    c1.fun5();
    }
}

6.内部类

1.成员内部类

package Inclass;


public class Outer{

    String name;
    Iner I1;

    public Outer(String name) {
        this.name = name;

    }

    public Outer() {
    }

    class Iner{
        int age;

        public Iner() {
        }

        public Iner(int age) {
            this.age = age;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "Iner{" +
                    "age=" + age +
                    '}';
        }
    }


    public Iner getI1() {
        if (I1 == null) {
            I1 = new Iner(0); // 默认年龄为 0
        }
        return I1;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Outer{" +
                "name='" + name + '\'' +
                ", I1=" + I1.toString() +
                '}';
    }

    public void setI1(Iner i1) {
        I1 = i1;
    }

}

package Inclass;

public class Test {

    public static void main(String[] args) {
        // 方法1,直接创建
      Outer Outer1=new Outer("jack");
      Outer.Iner Iner1=Outer1.new Iner(18);
      Outer1.setI1(Iner1);
      System.out.println(Outer1);

      // 方法2,外部类编写方法返回内部类n对象
        Outer Outer2=new Outer("james");
        Outer.Iner Iner2=Outer2.getI1();
        Iner2.setAge(20);
        System.out.println(Outer2);

    }
}

2.静态内部类

3.局部内部类

4.匿名内部类

匿名内部类是一个对象来的,只是没有名字,只用一次,就不用在创建一个类了

package Inclass;


public abstract class Outer{

    String name;

    public Outer(String name) {
        this.name = name;

    }

    public Outer() {
    }





    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Outer{" +
                "name='" + name + '\'' +
                '}';
    }

    public abstract void show();


}
package Inclass;

public class Test {

    public static void main(String[] args) {

        new Outer() {

        public  void show () {
            System.out.println("我是匿名内部类");
        }
    }.show();


    }
}

也可以创建一个对象接收,然后再用

package Inclass;

public class Test {

    public static void main(String[] args) {

         Outer o1= new Outer() {

        public  void show () {
            System.out.println("我是匿名内部类");
        }
    };
         o1.show();


    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1950836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《企业实战分享 · CodeGeeX 初体验》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

企业级视频拍摄与编辑SDK的全面解决方案

视频已成为企业传播信息、展示品牌、连接用户的重要桥梁,如何高效、专业地制作高质量视频内容,成为众多企业面临的共同挑战。美摄科技,作为视音频技术领域的创新先锋,以其强大的视频拍摄与编辑SDK,为企业量身打造了一站…

react中简单的配置路由

1.安装react-router-dom npm install react-router-dom 2.新建文件 src下新建page文件夹,该文件夹下新建login和index文件夹用于存放登录页面和首页,再在对应文件夹下分别新建入口文件index.js; src下新建router文件用于存放路由配置文件…

【Android】Activity生命周期与五种启动模式

文章目录 生命周期返回栈Activity状态生命周期方法 启动模式standard模式singleTask模式singleTop模式singleInstance模式singleInstancePerTask模式配置方式 生命周期 返回栈 每个Activity的状态由它在Activity栈(又叫“回退栈back stack”)中的位置决…

Web Worker 详细介绍

Web Worker 详细介绍 如果我们有一些处理密集型的任务,但是不想让它们在主线程上运行(那样会使浏览器/UI变慢),这时候我们可能会希望 JavaScript 可以以多线程的方式操作。 虽然 JavaScript 是单线程了,但是在浏览器…

超声波眼镜清洗机哪款好用又实惠?4款高评分眼镜清洗机机型深度测评

眼镜党都知道超声波清洗机吧,每次眼镜脏了,去眼镜店清洗,店员用的就是超声波清洗机。利用超声波的原理,这种清洗机可以深入物品内部进行清洁,效果非常出色。相比手工清洗,超声波清洗机能在清洁过程中保护镜…

远程项目调试-informer2020

informer2020 Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting(原文)Informer 是一个基于Transformer的模型,是为了应对长依赖关系而开发的。本文的主要主题是序列预测。序列预测可以在任何具有不断变化的数据的地方…

做短视频素材哪里找?去哪里下载?自媒体下载素材网站分享

自媒体视频创作:高质量素材网站大公开! 大家好,我是一名热情的短视频创作者。今天,我要与大家分享一些寻找优质视频素材的秘诀。无论是新手还是老手,这些建议都能帮助你的视频在众多平台中脱颖而出,吸引更…

系统移植(四)u-boot移植 ② basic版本

文章目录 一、u-boot移植&#xff08;一&#xff09;生成u-boot源码1. 配置交叉编译器&#xff0c;修改u-boot源码目录下的MAKEFILE文件4. 执行make <board_name>_defconfig命令&#xff0c;配置u-boot源码5. make menuconfig---图形化界面配置6. 根据DK1板子的设备树文件…

ISP 代理提供商:互联网安全的关键参与者

简介&#xff1a;互联网安全的演变态势 互联网改变了我们互动、工作和开展业务的方式&#xff0c;但也带来了与安全性和可访问性相关的重大挑战。在这个数字时代&#xff0c;互联网服务提供商 (ISP) 代理提供商在解决这些问题方面发挥着关键作用。他们提供的基本服务不仅可以增…

PDF解锁网站

https://smallpdf.com/cn/unlock-pdfhttps://smallpdf.com/cn/unlock-pdfhttps://www.freemypdf.comhttps://www.freemypdf.com

LVGL使用上一个不方便的问题记录

slider这个控件&#xff0c;应该画在蓝色框的里面&#xff0c;源码实现将中心画在蓝色框上&#xff0c;导致总会有两边超出的情况出现&#xff0c;真想修改源码&#xff0c;作者不知道咋想的&#xff1f;&#xff1f;&#xff1f;

vue3 Router 点击index中的按钮,查看相应的详情信息,并且传递id,及其路由的定义方法。

1、路由的定义 结构如下: 2、路由定义代码&#xff1a; {path: tabs,name: TabsDemo,component: () > import(/views/demo/feat/tabs/index.vue),meta: {title: t(routes.demo.feat.tabs),hideChildrenInMenu: true,},children: [{path: detail/:id,name: TabDetail,compon…

封装和桥接Unity 协程体系

简介 协程&#xff08;Coroutine&#xff09;在C#中是一种特殊的函数&#xff0c;它允许开发者编写可以暂停执行并在未来某个时刻恢复执行的代码块。协程通常用于实现异步操作&#xff0c;如延时执行、等待某个事件发生、或者分段执行复杂的任务。在Unity游戏引擎中&#xff0c…

Cuda编程模型中常见的错误检测方法

Cuda编程模型中常见的错误检测方法 1 CUDA错误检测简介2 直接嵌入检测函数2.1 检测函数介绍2.2 使用示例 3 封装在.cuh头文件中嵌入3.1 创建 error.cuh 头文件3.2 在 CUDA 程序中包含 error.cuh 并调用 CHECK 宏3.3 使用示例 1 CUDA错误检测简介 CUDA编程模型中的错误检测是确…

【C++】选择结构案例-三只小猪称体重

案例问题 假设有三只小猪A、B、C&#xff0c;在输入三者体重后希望能输出他们各自的体重并测出谁最重 思路 先让A与B相比较&#xff0c;如果A重&#xff0c;则让A和C相比较&#xff0c;如果A重则输出A最重&#xff0c;否则输出C最重 在最开始的条件&#xff08;AB相比较&am…

JQuery简单实现ul li点击菜单项被选中的菜单项保持高亮状态(导航ul li点击切换样式)

效果&#xff1a; JS&#xff1a; $(function () {//遍历list&#xff08;一般为ul li&#xff09;$("#menu a").each(function () {//给当前项添加点击事件&#xff08;点击后切换样式&#xff09;$(this).bind(click,function () {// 移除其他所有项的active类$(&…

Sokit(TCP/UDP调试工具)

下载&#xff1a;http://www.winwin7.com/soft/56522.html#xiazai Sokit中文版是一款免费开源的TCP / UDP 测试&#xff08;调试&#xff09;工具&#xff0c;它主要可以用于接收和发送TCP/UDP数据包&#xff0c;让你更深的了解网络状况&#xff0c;能够有效地接收、发送、转…

Linux中的进程1

进程的概念 程序&#xff1a;二进制文件 进程&#xff1a;启动的程序 所有的数据都在内存中 需要占据更多的系统资源 cpu&#xff0c;物理内存&#xff08;RAM&#xff09; 并行和并发 并发&#xff1a;在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动…

干货讲解 | 在线教育行业如何搭建帮助中心

引言 随着互联网技术的飞速发展&#xff0c;在线教育已成为教育领域不可或缺的一部分&#xff0c;它打破了传统教育的时空限制&#xff0c;让知识传播更加高效、便捷。然而&#xff0c;在享受在线教育带来的便利时&#xff0c;用户也面临着操作复杂、功能理解不透彻、遇到问题…