JAVA.抽象、接口、内部类

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{@Overridepublic void eat() {System.out.println("rabbit eat 胡萝卜");}
}

frog

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

dog

package animalabstract;public class dog extends animal{@Overridepublic 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{@Overridepublic void eat() {System.out.println("dog eat 骨头");}@Overridepublic void swim() {System.out.println("dog 狗刨");}
}

frog

package animalabstract;public class frog extends animal implements swim{@Overridepublic void eat() {System.out.println("frog eat 虫子");}@Overridepublic 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);}@Overridepublic String info() {return this.name + " " + this.age ;}@Overridepublic void study() {System.out.println("乒乓球运动员学习打乒乓球");}@Overridepublic void english() {System.out.println("乒乓球运动员说英语");}
}
package coachplayer;public class bbplayer extends player{public bbplayer(String name, int age) {super(name, age);}@Overridepublic String info() {return this.name + " " + this.age ;}@Overridepublic void study() {System.out.println("篮球运动员打篮球");}
}
package coachplayer;public class ppcoach extends coach implements english{public ppcoach(String name, int age) {super(name, age);}@Overridepublic String info() {return this.name + " " + this.age ;}@Overridepublic void teach() {System.out.println("乒乓球教练教乒乓球");}@Overridepublic void english() {System.out.println("乒乓球教练说英语");}
}
package coachplayer;public class bbcoach extends coach {public bbcoach(String name, int age) {super(name, age);}@Overridepublic String info() {return this.name + " " + this.age ;}@Overridepublic 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{@Overridepublic 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{@Overridepublic void fun1() {System.out.println("适配器的fun1");}@Overridepublic void fun2() {System.out.println("适配器的fun2");}@Overridepublic void fun3() {System.out.println("适配器的fun3");}@Overridepublic void fun4() {System.out.println("适配器的fun4");}@Overridepublic void fun5() {System.out.println("适配器的fun5");}
}
package interface3tips;public class class1 extends inter0Adapter{@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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.mzph.cn/web/49545.shtml

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

相关文章

Java给定一些元素随机从中选择一个

文章目录 代码实现java.util.Random类实现随机取数(推荐)java.util.Collections实现(推荐)Java 8 Stream流实现(不推荐) 完整代码参考(含测试数据) 在Java中,要从给定的数据集合中随机选择一个元素,我们很容易想到可以使用 java.…

【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件

目录 ​编辑 前言 系统调用 open 参数flags 参数mode write 追加方式 read close 文件描述符 打开多个文件并观察其文件描述符 C语言文件操作 理解一切皆文件 理解open操作 前言 各类语言的文件操作其实是对系统调用的封装 我们经常说,创建一个文件&a…

力扣第三十七题——解数独

内容介绍 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独…

CVE-2024-39700 (CVSS 9.9):JupyterLab 模板中存在严重漏洞

在广泛使用的 JupyterLab 扩展模板中发现了一个严重漏洞,编号为CVE-2024-39700 。此漏洞可能使攻击者能够在受影响的系统上远程执行代码,从而可能导致大范围入侵和数据泄露。 该漏洞源于在扩展创建过程中选择“测试”选项时自动生成“update-integratio…

VIM基础配置

1. CTAGS配置 下载 上传虚拟机,解压,进入目录 tar -xzvf ctags-5.8.tar.gz cd ctags-5.8/编译 ./configure sudo make sudo make install查看是否安装成功 ctags --version打印如下 2. 使用Vundle 下载 git clone https://github.com/VundleVim/Vund…

Linux并发程序设计(3):守护进程

目录 前言 一、介绍 1.1 概念 1.2 特点 1.3 举例 二、系统编程 2.1 setsid函数 2.2 getpid函数 2.3 getsid函数 2.4 getpgid函数 2.5 chdir函数 三、代码例程 3.1 使子进程在后台运行 3.2 使子进程脱离原终端 3.3 更换目录,并设定权限(非…

基于STM32通过云平台实现智慧大棚【手机远程查看温湿度】【报警】

文章目录 一、成果演示二、所用到的模块三、实现的功能四、接线说明五、WIFI模块配置步骤5.1云平台介绍5.2云平台使用5.3使用USB转TTL测试联通云平台 六、STM32代码编写七、手机上查看数据6.1下载软件(仅限安卓手机)6.2操作 一、成果演示 STM32通过物联网…

String、StringBuffer和StringBuilder

一、String类 1. String类的理解 2. String类结构 1. String类实现了Serializable接口,说明String对象可以串行化,即可以在网络上传输 2. String类实现了Comparable接口,说明String对象可以比较 String底层是一个字符数组,这个数组里存的是字符串的内容 例如:…

005 仿muduo实现高性能服务器组件_通信连接管理

​🌈个人主页:Fan_558 🔥 系列专栏:仿muduo 📒代码仓库: 项目代码 🌹关注我💪🏻带你学更多知识 文章目录 前言Channel模块设计原因整体设计代码如下 Connection模块设计原…

Florence2:Advancing a unified representation for a variety of vision tasks

Florence-2模型:开启统一视觉基础模型的新篇章_florence -2-CSDN博客文章浏览阅读1.1k次,点赞108次,收藏109次。Florence-2是由微软Azure AI团队开发的一款多功能、统一的视觉模型。它通过统一的提示处理不同的视觉任务,表现出色且优于许多大型模型。Florence-2的设计理念是…

用Postman Flows打造你的专属API:外部公开,轻松上手!

引言 Postman Flows 是一个使用 GUI 进行无代码 API 调用流程创建的服务。这篇文章我尝试使用 Flows 来构建将 Momento Topic 中的数据保存到 TiDB 的保存 API,因此想分享一些使用过程中的技巧等。 实现内容 将从 Momento Topics 配发的 JSON 数据保存到 TiDB 中。…

C++ 栈( stack )学习

目录 1.栈 2.模拟栈 1.1.入栈( push ) 1.2.出栈( pop ) 1.3.获取栈顶元素( top ) 3.直接使用栈( stack ) 3.1.导入头文件并创建栈 3.2.栈的操作 3.2.1.入栈( push ) 3.2.2.出栈( pop ) 3.2.3.获取栈顶元素( top ) 3.2.4.获取栈中元素个数( size ) 3.2.5.判断栈是否…

代码随想录算法训练营day8 | 344.反转字符串、541.反转字符串 II、卡码网:54.替换数字

文章目录 344.反转字符串思路 541.反转字符串 II思路 卡码网:54.替换数字思路复习:字符串 vs 数组 总结 今天是字符串专题的第一天,主要是一些基础的题目 344.反转字符串 建议: 本题是字符串基础题目,就是考察 revers…

docker挂载部署reids6.2.1

1.拉取镜像 docker pull redis:6.2.12.创建挂在目录(根据自己要求修改具体目录) mkdir -p /home/admin/redis/{data,conf}3.在/home/admin/redis/conf目录下创建redis.conf文件 cd /home/admin/redis/conf touch redis.conf4.复制下面文本到redis.conf…

浅析JWT原理及牛客出现过的相关面试题

原文链接:https://kixuan.github.io/posts/f568/ 对jwt总是一知半解,而且项目打算写个关于JWT登录的点,所以总结关于JWT的知识及网上面试考察过的点 参考资料: Cookie、Session、Token、JWT_通俗地讲就是验证当前用户的身份,证明-…

不断把别人“装”进我们的灵魂口袋

嘿,朋友们!今天我们来聊聊一种超酷的能量——本色示人。这不是什么秘密武器,但它比任何超能力都来得实在。 第一部分:本色示人,能量界的“超级赛亚人” 1.1 坦诚的超能力 想象一下,如果你的内心强大到可以…

Window部署Ollama+Qwen2.0+Open-WebUI

文章目录 Windows下安装Docker安装Docker检查是否安装成功, 出现版本即为安装成功安装Ollama启动 Ollama 并拉取模型(选做) 修改默认地址和端口(选做) Ollama 进行跨域配置安装open-webui Windows下安装Docker 准备条件 开启Hyper-V,在“启用或关闭Windows功能”里…

C语言 #指针数组 #数组指针 #数组参数、指针参数

文章目录 前言 一、指针数组 1、概念: 2、指针数组有什么用呢? 二、数组指针 1、数组指针的定义 2、数组名与 &数组名 的区别 3、数组指针如何初始化? 4、数组指针的用法 三、根据代码区分 指针数组 和 数组指针 四、数组参数、指针参数 …

Shell编程之正则表达式与文本三剑客

目录 一、正则表达式 1.引言--什么是正则表达式 1.1正则表达式的功能 2.基础正则表达式(BRE) 2.1特殊字符 2.2定位符 2.3非打印字符 3.扩展正则表达式(ERE) 4.元字符操作的案列 二、命令小工具 1.cut:列截取工具 2.sort排序 …

【Android】使用ViewPager2与TabLayout实现顶部导航栏+页面切换

【Android】使用ViewPager2与TabLayout实现顶部导航栏+页面切换 TabLayout与ViewPager2概述 TabLayout TabLayout 是 Android 支持库中的一个组件,它是 Design 支持库的一部分。TabLayout 提供了一个水平的标签页界面,允许用户在不同的视图…