当前位置: 首页 > news >正文

JavaSE (Java基础):面向对象(下)

8.7 多态

        什么是多态? 即同一方法可以根据发送对象的不同而采用多种不同的方式。

        一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。在句话我是这样理解的:

        在实例中使用方法都是根据他最开始将类实例化最左边的类型来定的,但是父类引用指向对象子类的话,如果子类有重写的方法(即方法名与父类相同的方法但是内容不一定相同),那么执行的子类所重写的方法,如果没有重写的方法,就执行父类的。在这句话中所说的“但可以指向对象的引用的类型有很多”,意思是一个父类可以有很多的子类,都可以使用他们的重写方法。

示例:

父类Person:

package com.oop.demo06;public class Person {public void run(){System.out.println("run");}}

子类Student:

package com.oop.demo06;public class Student extends Person {@Overridepublic void run() {System.out.println("son");}public void eat(){System.out.println("eat");}
}

 测试类:

import com.oop.demo06.Student;
import com.oop.demo06.Person;public class AppLication{public static void main(String[] args) {// 一个对象的实际类型是确定的// 可以指向的引用类型就不确定了:父类的引用指向子类// Student 能调用的方法都是自己的或者继承父类的!Student S1 = new Student();// Person是父类型的类,可以指向子类,但是不能调用子类独有的方法Person S2 = new Student();Object S3 = new Student();S2.run(); // 子类重写了父类的方法,执行子类的方法S1.run();// 对象能执行能执行哪些方法,主要看对象的左边类型,和右边关系不大!((Student) S2).eat(); //将S2的类型强制转换为Student,就可以调用方法了!S1.eat();}
}/*多态注意事项:1. 多态是方法的多态,属性没有多态2. 父类和子类要有联系    类型转换异常!     ClassCastException!3. 存在条件:    继承关系,方法需要重写,父类引用指向子类对象!1. static 方法,属于类,它不属于实例2. final 常量;3. private 方法*/


8.8 instanceof 和 类型转换

        instanceof 使用的方法格式:

        【实例的名称        instanceof        类的类型名称】,判断一个对象是什么类型,就是判读两个类型的对象是否有父子关系,有的话就返回Ture,没有就是返回False。

        使用 【实例的名称        instanceof        类的类型名称】时,能否编译看的是实例化对象的类型名,输出的结果看的是实例化对象时最右边的所实例的对象值。

首先父类是Person,其余的类:Student、Teacher是Person的子类。

import com.oop.demo06.Student;
import com.oop.demo06.Person;
import com.oop.demo06.Teacher;public class AppLication{public static void main(String[] args) {// Object > Person > Student// Object > Person > Tercher// Object > StringObject object = new Student();System.out.println(object instanceof Student);  // trueSystem.out.println(object instanceof Person);   // trueSystem.out.println(object instanceof Object);   // trueSystem.out.println(object instanceof Teacher);  // falseSystem.out.println(object instanceof String);   // falseSystem.out.println("=====================================");Person person = new Student();System.out.println(person instanceof Student);  // trueSystem.out.println(person instanceof Person);   // trueSystem.out.println(person instanceof Object);   // trueSystem.out.println(person instanceof Teacher);  // false
//        System.out.println(person instanceof String);   // 编译时就报错了System.out.println("=====================================");Student student = new Student();System.out.println(student instanceof Student);  // trueSystem.out.println(student instanceof Person);   // trueSystem.out.println(student instanceof Object);   // true
//        System.out.println(student instanceof Teacher);  // 编译时就报错
//        System.out.println(student instanceof String);   // 编译时就报错}
}

类型转换(关于对象的类型):

import com.oop.demo06.Student;
import com.oop.demo06.Person;
import com.oop.demo06.Teacher;public class AppLication{public static void main(String[] args) {// 类型之间的转化: 父   子// 高              低Person student = new Student();// student 将这个对象转换为Student的对象类型// 我们就可以使用这个对象类型中的方法了((Student) student).go(); // 这个是高转低需要强制转换// 如果是低转高,子类转换为父类不需要强制转换,可能会丢失一些方法!Student student1 = new Student();Person person = student1;}
}

 

8.9 static 关键字详解

        static修饰符有着静态的意思,使用他代表着这个方法或者元素在类中是与类一起加载的。

package com.oop.demo07;// static
public class Student {private static int age; // 静态变量     多线程private double score; // 非静态变量public static void main(String[] args) {Student s1 = new Student();System.out.println(s1.score);System.out.println(age);}
}

        在类中,还有着代码块这种东西,他的优先级比这个构造器还高。

package com.oop.demo07;public class Person {//    {
//        // 代码块(匿名代码块)
//    }
//
//    static {
//        // 静态代码块
//    }// 第二个执行,可以用来赋初始值{System.out.println("匿名代码块");}// 第一个执行,与类一起加载,只执行一次,不管你实例化多少个对象static {System.out.println("静态代码块");}// 第三个执行,构造器public Person(){System.out.println("构造方法");}public static void main(String[] args) {Person person = new Person();System.out.println("==============");Person person1 = new Person();}
}

        在Java中有许许多多的有用又有趣的类,在这些类中有着许多有用的静态方法,可以使用下面这个方法直接调用,想查看类的调用位置直接ctrl+左键就行。 

package com.oop.demo07;// 导入其他包中的类的静态方法
import static java.lang.Math.random; // 返回一个随机数(0,1)
import static java.lang.Math.PI;    // 圆周率
public class Test {public static void main(String[] args) {System.out.println(random());System.out.println(PI);}
}

需要注意的是:

        如果给这些东西使用了常量修饰符final,那么他将会是唯一的,无无法拥有子类。 

 


8.10 抽象类

        什么是抽象类?abstract 修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么就是抽象类。

        抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。

        抽象类,不能用new关键字来创建对象,它是用来让子类继承的。

        抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。

        子类继承了抽象类,那么他就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。

抽象父类:

package com.oop.demo08;//abstract 抽象类:类
public abstract class Action {// 约束~有人帮我们实现~// 这个就是抽象的方法,我们只定义了方法名字,他的具体功能由别人实现public abstract void doSomething();// 1.   不能new这个抽象类,只能靠子类去实现它;约束!// 2.   抽象类中可以写普通的方法// 3.   抽象方法必须在抽象类中// 抽象的抽象:约束~
}

 抽象父类的子类,他里面有重写父类的方法:

package com.oop.demo08;// 抽象类的所有方法,继承了他的子类,都必须要实现他的方法
public class A extends Action {@Overridepublic void doSomething() {}
}

 

 


8.11 接口的定义与实现

 

接口的作用:1.  约束2.  定义一些方法,让不同的人实现3.  public abstract4. public static final5. 接口不能实例化,接口中没有构造方法6. implements可以实现多个接口7. 必须要重写接口中的方法

接口UserService:

package com.oop.demo09;//interface 定义接口的修饰符(关键字),接口都需要有实现类
public interface UserService {// 接口中定义就是常量    public static finalint AGE = 9999;// 接口中的所有定义的方法其实都是抽象的   public abstractvoid add(String name);void delete(String name);void update(String name);void query(String name);
}

 接口TimeService:

package com.oop.demo09;public interface TimeService {void timer();
}

        每个接口都需要有实现类。我是这样理解的,每个接口就是定义一堆方法的名字与类型就是没有里面的内容,而他们需要有实现类来实现里面的内容,需要用到关键字implements:

package com.oop.demo09;// 类 可以实现接口 implements 接口
// 实现了接口的类,就需要重新接口中的方法// 利用接口实现多继承
public class UersServiceImpl implements UserService,TimeService{@Overridepublic void add(String name) {}@Overridepublic void delete(String name) {}@Overridepublic void update(String name) {}@Overridepublic void query(String name) {}@Overridepublic void timer() {}
}

 

 


8.12 N种内部类

package com.oop.demo10;public class Outer {private int id = 14203;public void out(){System.out.println("这是外部类的方法");}public class Inner{public void in(){System.out.println("这是内部类的方法");}// 内部类能够获得外部类的私有属性public void getID(){System.out.println(id);}}
}
import com.oop.demo10.Outer;import java.util.Optional;public class AppLication{public static void main(String[] args) {Outer outer = new Outer();// 通过这个外部类来实例化内部类Outer.Inner inner = outer.new Inner();inner.in();inner.getID();}
}

 局部内部类:

package com.oop.demo10;public class Outer {// 局部内部类,在方法里的属性也叫做局部变量public void method(){class Inner{}}
}

匿名内部类:

package com.oop.demo10;public class Test {public static void main(String[] args) {// 没有名字初始化类,匿名类// 不用将实例保存在对象中new Apple();new Apple().eat();// 甚至可以匿名一个接口new Userservice(){@Overridepublic void happle() {}};}
}class Apple{public void eat(){System.out.println("eat");}
}interface Userservice{void happle();
}

相关文章:

JavaSE (Java基础):面向对象(下)

8.7 多态 什么是多态? 即同一方法可以根据发送对象的不同而采用多种不同的方式。 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。在句话我是这样理解的: 在实例中使用方法都是根据他最开始将类实例化最左边的类型来定的&…...

Element中的日期时间选择器DateTimePicker和级联选择器Cascader

简述:在Element UI框架中,Cascader(级联选择器)和DateTimePicker(日期时间选择器)是两个非常实用且常用的组件,它们分别用于日期选择和多层级选择,提供了丰富的交互体验和便捷的数据…...

Construct公司 从 0 到 1 基于 Kitex+Istio 的微服务系统建设

本文根据 2024 年 5 月 25 日在上海举办的“云原生✖️AI 时代的微服务架构与技术实践”CloudWeGo 技术沙龙上海站活动中,Construct 服务端总监 Jason 的演讲《从 0 到 1 基于 Kitex Istio 的微服务系统建设》整理而来。 在微服务架构的浪潮中,企业面临…...

day04-组织架构

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.组织架构-树组件应用树形组件-用层级结构展示信息,可展开或折叠。 2.组织架构-树组件自定义结构3.组织架构-获取组织架构数据4.组织架构-递归转化树形…...

Web3 开发者入门手册:技能、工具和职业前景

原文:https://remote3.co/blog-post/how-to-become-a-web3-developer 作者:Paul Anderson 编译:TinTinLand Web3 是 2024 年科技领域最受瞩目的话题之一——Web3 令人激动的实用潜力可以跨越多个行业,早期采用者更有机会在未来…...

元宇宙虚拟实景展馆树立客户对企业的信任和好感

在数字化浪潮的推动下,企业迎来了前所未有的营销新机遇——3D数字展厅。3D数字展厅作为现代营销中的新型工具,不仅是企业与客户互动、传递信息的桥梁,更是企业展示实力、彰显品牌魅力的舞台。 辽宁3D数字展厅制作以其独特的设计理念和先进的制…...

【C语言】宏定义在 a.c 中定义,如何在 b.c 中使用?

宏定义的概念和使用原理 在 C 语言中,宏定义是一种预处理器指令,用于定义常量或者宏函数。宏在编译之前由预处理器展开,因此可以用来提高代码的可读性和维护性。宏定义使用 #define 指令,形式如下: #define 宏名 替换…...

vue3 滚动条滑动到元素位置时,元素加载

水个文 效果 要实现的思路就是,使用IntersectionObserver 检测元素是否在视口中显示,然后在通过css来进行动画载入。 1.监控元素是否视口中显示 const observer new IntersectionObserver((entries) > {entries.forEach((entry) > {if (entry.i…...

[Linux] 相对路径(Relative Path)与绝对路径(Absolute Path)

说明: 在编写shell脚本来管理系统或其他一般情况时,推荐使用绝对路径。因为在某些时候工作的环境或文件管理时发生变化可能导致某些绝对路径是有冲突的,这会产生一些问题。 比如在清华大学的第一教学楼里面有一个机器人实验室,文件…...

[ESP32] I2S播放wav文件

//代码&#xff1a;循环播放4首内置的wav音乐&#xff0c;I2S连接d类功放用NS4168芯片 //文件取样格式&#xff1a;Wave PCM 签字的 16bit, 采样频率:16KHz ,比特率705kbps //demo工程打包下载&#xff1a;https://download.csdn.net/download/wabil/89515015 #include <…...

YOLOv8

YOLOv8 设计快速、准确且易于使用&#xff0c;使其成为各种物体检测与跟踪、实例分割、图像分类和姿态估计任务的绝佳选择框架 1.安装YOLOv8 创建虚拟环境 conda create --name ros2 python3.10 激活虚拟环境 conda activate ros2 安装组件 pip install ultralytics -i h…...

协程调度模块

什么是协程和协程调度&#xff1f; 基本概念 协程 协程是一种比线程更轻量级的并发编程结构&#xff0c;它允许在函数执行过程中暂停和恢复执行状态&#xff0c;从而实现非阻塞式编程。协程又被称为用户级线程&#xff0c;这是由于协程包括上下文切换在内的全部执行逻辑都是…...

2024 最新docker仓库镜像,6月,7月

目前下面的docker仓库镜像源还能使用。 vi /etc/docker/daemon.json添加如下配置{"registry-mirrors": ["https://hub.uuuadc.top", "https://docker.anyhub.us.kg", "https://dockerhub.jobcher.com", "https://dockerhub.icu&…...

探索Vim的文本处理能力:精通查找与替换

探索Vim的文本处理能力&#xff1a;精通查找与替换 Vim&#xff0c;作为Linux终端下的王牌文本编辑器&#xff0c;以其强大的功能和灵活性深受开发者和系统管理员的喜爱。在Vim中进行查找和替换是文本编辑中的一项基础且重要的操作。本文将详细解释如何在Vim中执行查找和替换文…...

2024.7.4学习日报

1、ppt前三章 5日计划 1、至少做到实验 2、java...

享元模式(Flyweight Pattern)

享元模式&#xff08;Flyweight Pattern&#xff09; 定义 享元模式通过共享技术来支持大量细粒度的对象&#xff0c;以减少内存中的对象数量。其核心思想是将对象的状态分为内部状态和外部状态&#xff0c;内部状态是不变的&#xff0c;可以被多个对象共享&#xff1b;外部状…...

Oracle连接mysql

oracle使用的11g&#xff0c;在一台windows服务器&#xff1b;mysql使用的是5.7版本&#xff0c;在另一台windows服务器&#xff0c;这两个服务器之间的网络是互通的。做BI时&#xff0c;要获取不同数据源的数据&#xff0c;这些数据源可能是Oracle&#xff0c;也可能是sqlserv…...

golang 垃圾回收

gc不回收什么 GC 不负责回收栈中的内存栈是一块专用内存&#xff0c;专门为了函数执行而准备的&#xff0c;存储着函数中的局部变量以及调用栈栈中的数据可以通过简单的编译器指令自动清理&#xff0c;也就不需要通过 GC 来回收了 垃圾回收算法 主流的两类垃圾回收算法有两种&a…...

React 中如何使用 Monaco

Monaco 是微软开源的一个编辑器&#xff0c;VSCode 也是基于 Monaco 进行开发的。如果在 React 中如何使用 Monaco&#xff0c;本文将介绍如何在 React 中引入 Monaco。 安装 React 依赖 yarn add react-app-rewired --dev yarn add monaco-editor-webpack-plugin --dev yarn…...

开源RAG个人知识库项目开发分析

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;这个LLM开发基础阶段已经进入尾声了&#xff0c;本文中我们不介绍更多的理论与知识点&#xff0c;而是通过的分析开源项目的解决方案来帮助各位开发者理…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...