Java进阶(第二期):package 包 抽象类和抽象方法 接口的实现 多态的实现 综合继承、接口、多态的使用。

2023年11月26日20:11:11

文章目录

  • Java进阶(第二期)
    • 一、package包的概念
    • 二、抽象类和抽象方法(abstract)
          • 2.1 使用
          • 2.1 抽象类注意事项
    • 三、接口
          • 3.1 接口的定义格式
          • 3.2 接口成员特点
          • 3.3 类和接口的关系
          • 3.4 接口和抽象类的对比
    • 四、多态
          • 4.1 多态的前提条件
          • 4.2 对象多态
          • 4.2 行为多态:
          • 4.3 多态的成员访问特点
          • 4.4 多态的转型技术
          • 4.5 多态中的转型问题
    • 五、综合练习:

Java进阶(第二期)

一、package包的概念

  • package包,其实就是管理类的文件夹,用来存放文件类的。
  • 只需要注意,同类名不同包的情况下,重复的类名,需要使用带包名访问。

在这里插入图片描述

二、抽象类和抽象方法(abstract)

2.1 使用

抽象类:抽象类其实就是特殊的父类

抽象方法存活在抽象类中,并且继承后的子类必须重写抽象方法

  • + 抽象方法的定义格式:+ public abstract 返回值类型   方法名(参数列表);
    + 抽象类定义格式:+ public abstract class 类名 {}
    
  • 问题:特殊在哪里?
  • 回答;内部允许编写抽象方法

  • 问题:什么是抽象方法?
  • 回答:当我们将其共性的方法,抽取到父类之后,发现这个方法中无法给出具体明确(描述不清),而且这个方法,还是子类必须要有的方法,就可以设计为抽象方法。
  • 看下面代码:这样设计完全不合理,我想抽取到父类中,让两个动物子类继承父类。里面的方法通过父类继承。但是我发现,方法都是一样的,就是里面的逻辑不一样,此时就得用到了抽象类和抽象方法:

    不使用抽象类的代码如下:

    package com.liujintao.demo;public class Abstrcte {public static void main(String[] LiuJinTao) {}
    }
    class Animal {public void eat () {System.out.println("我是吃饭的方法");}
    }
    class dog {public void eat () {System.out.println("吃骨头");}
    }class pig {public void eat () {System.out.println("吃食料");}
    }
    

使用抽象类和抽象方法后的代码如下:

package com.liujintao.demo;public class Abstrcte {public static void main(String[] LiuJinTao) {}
}
abstract class Animal {public abstract void eat (); // 抽象方法必须存在抽象类中!!!
}
class dog extends Animal {public void eat () {System.out.println("吃骨头");}
}
class pig extends Animal {public void eat () {System.out.println("吃食料");}
}
  • 经过改造,这就使用了抽象方法和抽象类实现了功能,让子类自己重写,补充些就滚蛋。
2.1 抽象类注意事项
  1. 抽象类不能实例化:
    • 如果抽象类允许创建对象,就可以调用内部没有方法体的抽象方法了,不合理。
  1. 抽象类存在构造方法:
    • 子类通过super方法进行访问父类构造方法
  2. 抽象类中可以存在普通方法:
    • 因为抽象中,除了抽象方法外,的普通方法,子类可以通过继承使用父类中的方法
  1. 抽象类的子类:
      1. 要么重写方法抽象类中的所有抽象方法。
      2. 要么就让子类自己变成抽象类

在这里插入图片描述

三、接口

接口:体现的思想是对规则的声明,Java中的接口更多体现的是对行为的抽象(抽象方法)

  • 思路:

如果发现一个类,所有的组成,都是抽象方法

    • 不能有成员变量
    • 不能有普通的方法
  • 这种类,我们就会将他设计为Java中的接口,因为现在这个类存在的唯一价值,就是声明规则。给需要的接口的使用者命名规则。
3.1 接口的定义格式

和定义类很像:

interface 接口名 {}

注意:接口不允许实例化。

接口和类之间是实现关系,通过implements关键字来完成接口的实现(和继承父级一样的写法)

class 类名 implements 接口名 {}

实现类 (也就是接口的子类)

  1. 要么重写接口中的所有抽象方法。
  2. 要么将实现类变成抽象类(继承后的抽象方法就必须存活在抽象类中)

第一种使用接口的方式(实现类中,重写抽象方法)

/*** 定义一个接口*/
interface Inter {public void method ();public void show ();
}// 第一中使用接口的方法,使用接口(实现类)
class demoClass implements Inter {// 1. 要么将接口里面的规则(抽象方法)全部重写public void method() {System.out.println("我是实现类中的 method方法");}public void show () {System.out.println("我是实现类中的 show方法");}
}

第二种使用接口的方式(将实现类变成抽象类) 不推荐使用

/*** 定义一个接口*/
interface Inter {public void method ();public void show ();
}// 接口的第二种使用方法(变成抽象类,让其他类继承我的实现类)
abstract class Demo implements Inter {// 要么将这个实现类变成抽象类
}class Test extends Demo {public void method () {}public void show () {}
}
3.2 接口成员特点
  1. 成员变量: 只能定义常量,因为系统会默认加上三个关键字:
    • public static final
    • 这三个关键字没有顺序关系
  • 所以接口定义的时候,遵循static 和 final的使用规则。
  1. 成员方法:只能是抽象方法,因为系统会默认加入两个关键字

    • public abstract
  2. 接口中没有构造方法

3.3 类和接口的关系

在这里插入图片描述

1、 类和类之间的关系只能单继承,或者多层继承(前面有讲过),这里展示一个类继承多个类:

package com.liujintao.demo;public class InterfaceDemo02 {public static void main(String[] LiuJinTao) {}
}// 定义一个抽象父类
abstract class Fu1 {// 抽象方法public abstract void show();
}// 定义第二个抽象父类
abstract class Fu2 {public abstract void show();
}// 定义一个子类继承抽象方法 (类与类不支持一个继承多个)
abstract class Zi extends Fu1, Fu2 { // 报错 同时继承了两个类// 重写抽象方法public  void show() {}
}

2、 类和接口之间的关系(这里展示一个继承多个的代码实现):

package com.liujintao.demo;public class InterfaceDemo02 {public static void main(String[] LiuJinTao) {}
}// 定义一个接口
interface Interf {public void show ();public void method();
}// 定义第二个接口
interface Interf2 {public void show ();public void method ();
}// 定义一个实现类(一个类继承多个接口(类))abstract class testClass implements Interf, Interf2 {// 实现了接口(就相当于继承了),里面全是抽象方法,因此必须存活在抽象类中。public void show () {System.out.println("我是实现类,实现接口继承方法后,重写抽象类");}public void method () {System.out.println("我是实现类,实现了接口的继承方法后,重写抽象类");}
}
  • 这里主要看我实现类以及里面对抽象方法的重写。

3、 接口和接口之间的关系(和上面一样,一个接口继承多个接口代码展示):

package com.liujintao.demo;public class InterfaceDemo02 {public static void main(String[] LiuJinTao) {}
}// 定义第一个接口
interface isInter1 {public void showA();
}// 定义第二个接口
interface isInter2 {public void showB();
}// 定义第三个接口,实现上面连个接口的继承
interface  Come extends isInter1, isInter2 {public void showA();public void showB();
}
  • 一个接口使用继承的方式继承多个接口,如果下次有个实现类,就得重写这些接口里面的所有抽象方法。
3.4 接口和抽象类的对比
  • 抽象类:对事物做抽象(描述事物)
  • 接口:对行为抽象(制定规则)

接口里面写的全是抽象的方法,然后通过实现类对我的规则进行重写,完成功能的实现。

四、多态

在这里插入图片描述

4.1 多态的前提条件
  • 有继承/接口实现关系
  • 有方法重写
  • 父类引用指向子类对象

多态分为:

  • 对象多态
  • 行为多态
4.2 对象多态
  • 父类的引用指向了子类的对象
package com.liujintao.polymorphic;public class PolymorphicDemo {public static void main(String[] LiuJinTao){// 对象多态的实现Animal x = new Dog();Animal y = new Cat();}
}// 定义一个父类
class Animal {}// 下面定义两个子类
class Dog extends Animal {}class Cat extends Animal {}

对象多态的好处:

  • 方法的形参定义为父类类型,这个方法就可以接受到该父类的任意子类对象了。
package com.liujintao.polymorphic;public class PolymorphicDemo {public static void main(String[] LiuJinTao){// 对象多态的实现Animal x = new Dog();Animal y = new Cat();// 调用方法 传递子类对象给父类引用userAnimal(new Dog());userAnimal(new Cat());}// 展示一下对象多态的好处 (就是定义一个父类的实例,接受子类对象)public static void  userAnimal (Animal element) {}
}// 定义一个父类
class Animal {}// 下面定义两个子类
class Dog extends Animal {}class Cat extends Animal {}
4.2 行为多态:
package com.liujintao.polymorphic;import java.sql.SQLOutput;public class PolymorphicDemo {public static void main(String[] LiuJinTao){// 调用方法 传递子类对象给父类引用
//        userAnimal(new Dog());userAnimal(new Cat());}// 展示一下对象多态的好处 (就是定义一个父类的实例,接受子类对象)public static void  userAnimal (Animal element) {// 行为多态的使用element.eat();      // cat}
}// 定义一个父类
abstract class Animal {public abstract void eat ();
}// 下面定义两个子类
class Dog extends Animal {public void eat () {System.out.println("dog");}
}class Cat extends Animal {public void eat () {System.out.println("cat");}
}

userAnimal(new Cat()); : 根据传递的子类对象,方法的形参引用不同的对象,实现功能方法。

4.3 多态的成员访问特点
  1. 成员变量:编译看左边(父类), 运行看左边(父类)

  2. 成员方法:编译看左边(父类), 运行看右边(子类)

    • 在编译的时候,会检查父类中有没有这个方法:
      • 没有:编译报错
      • 有:编译通过,但是运行的时候,一定会执行子类的方法逻辑
        • 因为担心父类的方法里面没有逻辑,是一个抽象方法。
  3. 多态创建对象,调用静态成员:

    • 静态的成员,推荐类名进行调用
    • 细节:静态的成员,可以使用对象名调用,但这是一种假象。
      • 生成字节码文件后,会自动将对象名调用,改成类名调用(也就是会说执行的时候就已经是类名调用了)
  • 1、访问成员变量的时候,访问的是父类,如果将变量设计在了本类,那就是本类的变量值。
package com.liujintao.polymorphic;public class polymorphicDemo02 {public static void main(String[] args) {Zi z = new Zi();System.out.println(z.num);  // 100}
}// 定义一个父类
class Fu {int num = 100;public void method () {System.out.println(num);}
}// 定义一个子类
class Zi extends Fu {public void method () {System.out.println(num);}
}
  • 2、访问成员方法的时候
package com.liujintao.polymorphic;public class polymorphicDemo02 {public static void main(String[] args) {Zi z = new Zi();System.out.println(z.num);  // 100z.method();                 // 我是子类}
}// 定义一个父类
class Fu {int num = 100;public void method () {System.out.println(num);}
}// 定义一个子类
class Zi extends Fu {public void method () {System.out.println(num);System.out.println("我是子类");}
}
  • 3、访问的是父类
Zi z = new Zi();Zi.print();  // <== z.print(); 编译的时候自动改为类调用。// 定义一个父类
class Fu {public static void print() {System.out.println("父类----print");}
}// 定义一个子类
class Zi extends Fu {public static void print() {System.out.println("父类----print");}
}
  • 总而言之,多态的访问,必须符合多态的形式
  • 父类没有的,子类有的就访问不了,(这就是多态的弊端),解决方法就得用转型技术。往下面看。
4.4 多态的转型技术

向上转型:

  • 从子到父 (父类引用指向子类对象)
  • Fu f = new Zi();

向下转型:

  • 从父到子(将父类引用所指向的对象,转交给子类类型)
  • Zi z = (Zi)f;
4.5 多态中的转型问题
  • 关键字 instanceof
  • 使用格式:
    • 对象名 instanceof 类型
    • 判断一个对象是否是一个类的实例
    • (通俗易懂的理解:判断关键字左边的对象,是否是右边的类型,返回值为boolean类型)就是判断数据类型是否相同

在这里插入图片描述

五、综合练习:

在这里插入图片描述

测试类:

package com.liujintao.test;import com.liujintao.polymorphic.PolymorphicDemo03;import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请选择支付方式:  1. 支付平台支付   2. 银行卡网银支付  3. 信用卡快捷支付");int choice = sc.nextInt();// 定义一个接口类型的引用Payment payment = null;switch (choice) {case 1 :// 父类引用指向子类对象payment = new PlatformPaymentImpl();break;case 2:payment = new BankcardPaymentImpl();break;case 3:payment = new CreditCardsAccepted();}System.out.println("请输入您的支付金额: ");double money = sc.nextDouble();// 通过实现类对象。访问实现类里面的方法payment.pay(money);}
}

先定义一个接口:

package com.liujintao.test;/*** 支付接口*/
public interface Payment {void pay(double money);
}

第一个实现类:

package com.liujintao.test;/*** 实现类*/
public class PlatformPaymentImpl implements Payment {/*** 重写接口方法* @param money*/@Overridepublic void pay(double money) {System.out.println("通过支付平台支付了:" + money + "元!");}
}

第二个实现类:

package com.liujintao.test;/*** 实现类*/public class BankcardPaymentImpl implements Payment{@Overridepublic void pay(double money) {System.out.println("通过银行卡网银支付了:" + money + "元!");}
}

第三个实现类:

package com.liujintao.test;/*** 实现类*/
public class CreditCardsAccepted implements Payment {public void pay(double money) {System.out.println("通过信用卡支付了:" + money + "元");}
}

在这里插入图片描述

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

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

相关文章

Sentry介绍与使用 - Issues模块

这篇文章是我在公司做 Sentry 相关分享的演讲稿。 大家好&#xff0c;现在由我来讲解 Sentry 的 Issues &#xff08;问题&#xff09;模块。我会分为三个部分来讲&#xff0c;首先我会介绍 Sentry 一些重要的概念&#xff0c;然后讲一下 Issues 的基本使用方式&#xff0c;最后…

steam/csgo搬砖项目真能月入过万吗?到底真的假的

steam/csgo搬砖第三课之如何出售 steam搬砖核心原理是什么&#xff1f;为什么会有差价产生&#xff1f;buff不是更低价吗&#xff1f;很多小白会有这些疑问&#xff01; steam搬砖指的是通过买卖csgo游戏装备赚钱的。 玩过游戏的应该就很清楚&#xff0c;像绝地求生&#xff…

Linux安装jdk8【十分丝滑】

1.上传安装包到Linux&#x1f495;&#x1f495;&#x1f495; 2.使用命令解压缩&#x1f495;&#x1f495;&#x1f495; tar -zxvf 压缩文件名 3.重命名&#x1f495;&#x1f495;&#x1f495; mv 原文件名 新的文件名 4.配置环境变量&#x1f929;&#x1f929;&…

Linux中vi常用命令-批量替换

在日常服务器日志查看中常用到的命令有grep、tail等&#xff0c;有时想查看详细日志&#xff0c;用到vi命令&#xff0c;记录下来&#xff0c;方便查看。 操作文件&#xff1a;test.properites 一、查看与编辑 查看命令&#xff1a;vi 文件名 编辑命令&#xff1a;按键 i&…

CountDownLatch实战应用——批量数据多线程协调异步处理(主线程执行事务回滚)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; CountDownLatch实战应用——批量数据多线程协调异步处理(主线程执行事务…

图像分割模型及架构选型介绍(MMSegmentation|sssegmentation等)

参考&#xff1a; https://zhuanlan.zhihu.com/p/618226513 0. 图像分割概述 图像分割通过给出图像中每个像素点的标签&#xff0c;将图像分割成若干带类别标签的区块&#xff0c;可以看作对每个像素进行分类。图像分割是图像处理的重要组成部分&#xff0c;也是难点之一。随…

OpenGL 自学总结

前言&#xff1a; 本人是工作后才接触到的OpenGL&#xff0c;大学找工作的时候其实比较着急&#xff0c;就想着尽快有个着落。工作后才发现自己的兴趣点。同时也能感觉到自己当前的工作有一点温水煮青蛙的意思&#xff0c;很担心自己往后能力跟不上年龄的增长。因此想在工作之余…

3DCAT为华东师大设计学院打造元宇宙数字虚拟学院

6月11日&#xff0c;华东师范大学设计学院在chi K11美术馆举办了一场别开生面的 2023 年本科毕业设计暨项目实践教学现场演示展。其中&#xff0c;元宇宙数字虚拟学院&#xff08;一期&#xff09;的现场发布会引起了现场震撼&#xff0c;吸引了众多观众的目光和参与。 该元宇宙…

MYSQL 连接的使用

文章目录 前言连接介绍在命令提示符中使用 INNER JOINMySQL LEFT JOINMySQL RIGHT JOIN在PHP脚本中使用JOIN后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握…

【挑战业余一周拿证】二、在云中计算 - 第 1 节 - 模块2 简介

第 1 节 - 模块2 简介 无论你的企业是属于像医疗、保健、制造、保险等等行业 , 再或者 , 您的服务是向全世界的数百万用户提供视频、、图片或者文字服务,你也需要服务器来为您的业务和应用程序提供支持,服务器的作用是帮助您托管应用程序并提供满足您业务需求的计算能力. 当你使…

Vue框架学习笔记——计算属性

文章目录 前文提要代码需求描述插值语法实现methods实现 计算属性getter执行时间&#xff1a;setter 计算属性简写形式&#xff08;只读不改&#xff0c;才能如此简写&#xff09;slice截取元素&#xff0c;限制输入字符数量 前文提要 本人仅做个人学习记录&#xff0c;如有错…

【brpc学习实践九】mbvar及bvar可观测

概念、学习地址 mbvar中有两个类&#xff0c;分别是MVariable和MultiDimension&#xff0c;MVariable是多维度统计的基类&#xff0c;MultiDimension是派生模板类。也是主要用来多多线程计数用的。这里用到再详细去了解即可 https://github.com/luozesong/brpc/blob/master/do…

知识的分层:know-what/how/why

知识&#xff08;knowledge&#xff09;表示知道某些信息。通常而言&#xff0c;知识是正确的&#xff0c;但不一定是完备的。知识本身有自己的适用范围&#xff0c;特别是工程技术类问题。 根据知识的类型&#xff0c;可分为三类&#xff1a; know-whatknow-howknow-why kno…

Java多线程二-线程安全

1、线程安全问题 多个线程&#xff0c;同时操作同一个共享资源的时候&#xff0c;可能会出现业务安全问题。 2、实例&#xff1a;取钱的线程安全问题 2.1、场景 小明和小红是夫妻&#xff0c;他们有个共同账户&#xff0c;余额是十万元&#xff0c;如果两人同时取钱并且各自取…

Python 安装mysqlclient 错误 无法打开包括文件: “mysql.h”: 解决方法

解决方案&#xff1a;python最新3.12.0不支持mysqlclient 请下载 python3.9.9 版本 高速下载地址CNPM Binaries Mirror 官方下载地址Welcome to Python.org 下载完成后将python添加到环境变量 pycharm 虚拟环境下的python版本切换到你刚才下载的3.9.9的python版本 Avai…

C#文件操作File类vsFileInfo类和Directory类vsDirectoryInfo类

目录 一、File类vsFileInfo类 1.File类 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 2.FileInfo类 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 二、 Directory类vsDirectoryInfo类 1.Directory类 &#xff08;…

FilterChain攻击解析及利用

文章目录 BASE64解码和编码原理浅析EncodingDecoding Filterchain构造&#xff08;原理阐述&#xff09;回顾死亡代码特性一&#xff08;双重去杂&#xff09;特性二&#xff08;粘合性&#xff09; 任意字符构造工具一工具二 实战例题[NSSRound#7 Team]brokenFilterChain&…

运维01:云计算

云计算的类型 分类&#xff1a;公有云、私有云、混合云 云计算的服务模式 服务模式分3种&#xff1a; ①IaaS&#xff08;Infrastructure as a Service&#xff09;&#xff1a;基础设施即服务 ②PaaS&#xff08;Platform as a Service&#xff09;&#xff1a;平台即服务…

Java并发编程

一、基础知识 1. 为什么要使用并发编程 提升多核CPU的利用率&#xff1a;一般来说一台主机上的会有多个CPU核心&#xff0c;我们可以创建多个线程&#xff0c;理论上讲操作系统可以将多个线程分配给不同的CPU去执行&#xff0c;每个CPU执行一个线程&#xff0c;这样就提高了CP…

Portraiture2024最新Photoshop磨皮插件更新啦

Portraiture是一款由Imagenomic公司研发的Photoshop磨皮插件。该插件以其优秀的磨皮效果&#xff0c;成为了众多摄影师和化妆师使用的首选插件。Portraiture主要用于影楼、婚纱、时尚摄影等各个领域。其主要特点是能够轻松地模拟人眼的视觉感受&#xff0c;自然地修饰人像照片。…