Java(二)--面向对象

news2024/11/30 6:47:48

 十.封装

1.访问权限不用加

在c++中是访问权限: 属性/行为:

class Person{
	public:
		void speak(){
			cout<<"666";
		}
};

在Java中是访问权限 属性/行为:

class Person{
	public void speak(){
	    cout<<"666";
	}
};

2.和c++一样类中对象可以没有初始化

为什么要刻意强调这一点呢?因为与c++不同的是java方法中建立变量没有初始化会报错。但是类中对象没有初始化会像c++一样分配初始值。
整型的初始值是0。浮点型是0.0。布尔型是false。引用类型是null。

3.对象的创建

前面讲过java是通过new来创建对象的。

//无参构造
Student student1=new Student();
//有参构造
Student student2=new Student("张三",19);

补充:
Java中没有析构函数。
set和get方法可以通过IDEA的快捷键alt+insert进行快速生成。当然后期会使用lombok来简化书写。

4.this关键字

c++中是这么写的this->
java中是这么写的this.

5.静态成员

c++是这么调用的Person::m_A
Java是这么调用的Person.m_A

6.类的分类

【1】Java中专门用来描述一类事物的类就叫做Javabean类,简单说就是里面没有main方法。
【2】里面有main方法的类叫做测试类,因为有main方法,所以可以运行,主要用来测试本类和其他类的方法书写是否正确。
【3】专门提供方法让别人使用的就是工具类。最大的特点就是变量和方法都是静态的。

注:我们一般在类中添加main方法来测试该类的书写是否正确。

例如下面这个代码

public class JwtUtil {
    //有效期为
    public static final Long JWT_TTL =15*24* 60 * 60 *1000L;// 60 * 60 *1000  一个小时
    //设置秘钥明文
    public static final String JWT_KEY = "Zmx5aW5ncGln";//flyingpig

    public static String getUUID(){
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        return token;
    }

    /**
     * 生成jtw
     * @param subject token中要存放的数据(json格式)
     * @return
     */
    public static String createJWT(String subject) {
        JwtBuilder builder = getJwtBuilder(subject, null, getUUID());// 设置过期时间
        return builder.compact();
    }

    /**
     * 生成jtw
     * @param subject token中要存放的数据(json格式)
     * @param ttlMillis token超时时间
     * @return
     */
    public static String createJWT(String subject, Long ttlMillis) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间
        return builder.compact();
    }

    private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey();
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if(ttlMillis==null){
            ttlMillis=JwtUtil.JWT_TTL;
        }
        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);
        return Jwts.builder()
                .setId(uuid)              //唯一的ID
                .setSubject(subject)   // 主题  可以是JSON数据
                .setIssuer("flyingpig")     // 签发者
                .setIssuedAt(now)      // 签发时间
                .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
                .setExpiration(expDate);
    }

    /**
     * 创建token
     * @param id
     * @param subject
     * @param ttlMillis
     * @return
     */
    public static String createJWT(String id, String subject, Long ttlMillis) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间
        return builder.compact();
    }

    public static void main(String[] args) throws Exception {
      String jwtKey = "flyingpig";
        String encodedKey = Base64.getEncoder().encodeToString(jwtKey.getBytes());
        System.out.println(encodedKey);
    }

    /**
     * 生成加密后的秘钥 secretKey
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }
    //解析JWT令牌
    public static Claims parseJwt(String jwt) {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }
}

然后我们就可以直接通过类名.方法的格式直接对里面的方法为其他类提供服务。

十一.继承

【1】语法:

public class Student extends Person{}

【2】Java中所有的继承都是公有继承,即公有的仍然是公有,私有的还是私有。

【3】子类和父类同名成员

访问子类同名成员--son.m_A或者this.m_A
访问父类--super.m_A

c++中是类名::变量名,而Java中用son和this代表子类,super代表父类。

【4】Java中无多继承

【5】方法重写

    @Override
    public Integer getIdByTeacherName(String teacherName) {
        Integer teacherId=teacherMapper.getIdByName(teacherName);
        return teacherId;
    }

与c++一个很大的区别是重写方法前面要加上一个@Override注解。什么是注解呢?Override注解又有什么用呢?

注释是给程序员看的,而注释是给虚拟机和电脑看的。
@Override是重写注解,是放在重写后的方法上,如果重写的方法语法错误,就会有红色波浪线。

【6】java使用super()调用父类的构造方法

十二.多态

1.什么是多态?

多态,顾名思义就是多种形态。
首先要明确父类或者子类的对象都可以赋值给父类引用。
而当用父类的引用调用一个方法,会根据当前父类的引用或指针指向什么类型去调用对应的实现,然后执行不同的过程,就类似变换多种形态。
举个例子,动物类都有叫这个方法,如果将狗类对象赋值给动物类引用,则执行的叫是狗的汪汪叫,如果赋值的是猫类对象,则是猫叫,赋值的是老鼠类对象,则是老鼠叫。
为什么只说方法,不说变量,因为多态只会对方法起作用。 通过多态,我们可以提高代码的复用性。

2.多态的实现

多态是通过抽象的父类+子类继承实现的(在c++中的关键字是virtual,在Java中是abstract)

【1】抽象的父类

//抽象类
public abstract class Animal {
    public void printName(){
        System.out.println("Animal");
    }
    //抽象方法
    public abstract void speak();
}

格式为public abstract class 类名{};的类称为抽象类。
格式为public abstract 返回值类型 方法名(参数列表);的方法成为抽象方法。

注:(1)如果一个类中存在抽象方法,那么该类就必须声明为抽象类。例如上面的Animal 类,使用abstract关键字声明抽象类。抽象类不一定有抽象方法,但有抽象方法一定是抽象类。
(2)抽象类中定义的抽象方法无实现。

【2】子类继承

子类继承后一定要重写父类抽象类中的所有抽象方法,要不然子类也得定义为抽象类。

重写抽象方法:

public class Cat extends Animal{
    public void speak() {
        System.out.println("喵喵喵");
    }
}
public class Dog extends Animal{
    public void speak() {
        System.out.println("汪汪汪");
    }
}
public class Person extends Animal{
    public void speak() {
        System.out.println("666");
    }
}

除非继续定义为抽象类:

public abstract class Person extends Animal{
}

【3】多态的使用--就是使用子类对象赋值给父类引用,那么调用父类引用的方法就会使用其对应子类的实现。

public class Main {
    public static void main(String[] args){
        Animal animal=new Dog();
        animal.speak();
        animal=new Cat();
        animal.speak();
        animal=new Person();
        animal.speak();
    }
}

十三.接口

接口是什么,就是一种特殊的抽象类,类中所有的方法都是抽象方法。
关键字是interface和implements。

1.接口的实现

【1】定义接口:就是将abstract class换成interface

public interface Animal {
    void speak();
}

【2】继承接口:就是将extend换成implements

public class Cat implements Animal{
    public void speak() {
        System.out.println("喵喵喵");
    }
}
public class Dog implements Animal{
    public void speak() {
        System.out.println("汪汪汪");
    }
}
public class Person implements Animal{
    public void speak() {
        System.out.println("666");
    }
}

【3】使用和多态一样

​public class Main {
    public static void main(String[] args){
        Animal animal=new Dog();
        animal.speak();
        animal=new Cat();
        animal.speak();
        animal=new Person();
        animal.speak();
    }
}

2.接口的特点

【1】接口支持多继承,一个类可以实现多个接口。
【2】接口不能实例化,不能new对象。
【3】接口没有构造方法
【4】接口成员变量的默认修饰符是public static final
接口成员方法的默认修饰符是public abstract
所以这些修饰符可以省略不写,还有出这些之外的修饰符也不能写。

3.接口的意义

那么接口有什么特殊意义呢?为什么要把只有抽象函数的抽象类特意的提出来,叫做接口,并刚给它特殊的关键字和定义方法?

接口的意义主要是定义规范和规则。接口的特点就是所有继承它的类都要去实现其中的所有抽象方法。
比如当你是架构师,你不用编写所有的代码,只需要编写接口,那么让其他程序员继承这个接口,他就需要去实现其中的所有方法。
又比如同一套api在不同的环境下有不同的实现,比如java操作数据库的jdbc的api,数据库类型有很多,mysql,Oracle等。
所以java公司它只是规定接口,规定要实现哪些方法和功能,至于具体的实现交给各个数据库公司提供。这就是制定规范。

十四.包装类

Java 中的包装类指的是一组用于封装基本数据类型(如 int、float、boolean 等)的类,使得这些基本数据类型具有面向对象的特性和功能。每个基本数据类型都有对应的包装类,例如 Integer、Float、Boolean 等。

包装类提供了将基本数据类型转换成对象的功能,这样就可以在面向对象的环境中使用这些基本数据类型,并且可以对它们进行一些操作。另外,通过使用包装类,可以将基本数据类型存储到集合类等数据结构中,这些数据结构要求使用对象而不是基本数据类型。

除了提供基本数据类型的封装之外,包装类还包含一些方法和常量,比如 compareTo() 方法可以用于比较两个包装类对象的值大小,MAX_VALUE 和 MIN_VALUE 常量可以用于获取某个基本数据类型的取值范围等。

Java 中的包装类主要有以下几个:

Integer 对应于 int
Float 对应于 float
Double 对应于 double
Boolean 对应于 boolean
Character 对应于 char

这些包装类都位于 java.lang 包中,因此在 Java 编程中可以直接使用,无需额外导入。

十五.数据结构类

熟悉List(链表),Queue(队列),Stack(栈)等类,不仅以后刷算法题需要用到,List在开发中也经常用到。

初始化都是这种格式:

List<Integer> integerList=new List<>();
Queue<Integer> integerQueue=new Queue<>();
Stack<Integer> integerStack=new Stack<>();

例:List常见api:add,remove等

Queue和Stack常见api:
push()【插入元素】
pop()【移除元素,队列先进先出,栈后进先出】
peek()【栈顶的元素和队首的元素,简单说就是如果执行移除操作要移除的元素是什么】
empty()【检查是否为空】

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

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

相关文章

管理类联考——数学——汇总篇——知识点突破——代数——数列

⛲️ 一、考点讲解 1.数列的定义 按一定次序排列的一列数称为数列。 一般形式&#xff1a; a 1 &#xff0c; a 2 &#xff0c; a 3 &#xff0c; … &#xff0c; a n &#xff0c; … &#xff0c; a_1&#xff0c;a_2&#xff0c;a_3&#xff0c;…&#xff0c;a_n&#xf…

ICCV 2023 | 沉浸式体验3D室内设计装修,基于三维布局可控生成最新技术

文章链接&#xff1a; https://arxiv.org/abs/2307.09621 360场景布局可控合成&#xff08;360-degree Image Synthesis&#xff09;目前已成为三维计算机视觉领域一个非常有趣的研究方向&#xff0c;在虚拟三维空间中沉浸式的调整和摆放场景对象&#xff0c;可以为用户带来身临…

线性代数的本质(八)——内积空间

文章目录 内积空间内积空间正交矩阵与正交变换正交投影施密特正交化实对称矩阵的对角化 内积空间 内积空间 三维几何空间是线性空间的一个重要例子&#xff0c;如果分析一下三维几何空间&#xff0c;我们就会发现它还具有一般线性空间不具备的重要性质&#xff1a;三维几何空…

Java项目-苍穹外卖-Day12-Apache POI及Excel数据报表

文章目录 前言工作台需求分析代码导入功能测试 Apache POI介绍入门案例写入excel文件内容读取excel文件 导出运营数据Excel表需求分析代码开发功能测试 前言 最后一天&#xff0c;主要就是数据怎么从后端导出到excel表格&#xff0c;以及工作台内容的开发 工作台 需求分析 代…

中秋国庆双节邮件营销怎么做?看这里!

今年的国庆节恰逢中秋节&#xff0c;因此国家假日办安排国庆中秋连放8天。对于打工人来说&#xff0c;超长的假期是外出旅游、回家探亲好时机&#xff0c;可是对于企业来说&#xff0c;却是一次仅次于春节的营销大战。这个时候企业营销人员当然是要借助各种营销手段来获取流量和…

高阶导数的概念与公式

目录 高阶导数的概念 常用的高阶导数的公式 隐函数补充 反函数补充 高阶导数的概念 高阶导数是指一阶或二阶及以上的导数。这些导数可以通过连续进行一阶导数的计算来得到。然而&#xff0c;实际计算高阶导数时&#xff0c;存在一些问题&#xff0c;例如对抽象函数高阶导数…

测试-----selenuim webDriver

文章目录 1.页面导航2.元素定位3. 浏览器操作4.获取元素信息5. 鼠标的操作6. 键盘操作7. 元素等待8.下拉框9.弹出框10.滚动条11.frame处理12.验证码处理&#xff08;cookie&#xff09; 1.页面导航 首先是导入对应的包 :from selenium import webdriver然后实例化:driver web…

为什么大家都在用 WebP?

WebP 是谷歌在 2010 年提出的一种新型的图片格式&#xff0c;放到现在来讲&#xff0c;已经不算是“新”技术了&#xff0c;毕竟已经有了更新的 JPEG XL 和 AVIF 。但是在日常工作中&#xff0c;大家时常会碰到保存下来的图片的后缀是 .webp。那么 WebP 到底有什么魔力&#xf…

Explain 性能分析

目录 1. 能干什么 2. 如何分析 3. 各字段解释 1. 能干什么 使用 explainsql 的方式&#xff0c;分析查询语句的性能瓶颈。 ① 表的读取顺序&#xff1b; ② 数据读取操作的操作类型&#xff1b; ③ 哪些索引可以使用&#xff1b; ④ 哪些索引被实际使用&#xff1b; ⑤ 表之…

Latex之在作者名字后面加上OCRID的图标

\usepackage{orcidlink} \author{Bob\textsuperscript{\orcidlink{0000-0000-0000-0000}}}效果如图

Java8实战-总结27

Java8实战-总结27 用流收集数据分区分区的优势将数字按质数和非质数分区 用流收集数据 分区 分区是分组的特殊情况&#xff1a;由一个谓词(返回一个布尔值的函数)作为分类函数&#xff0c;它称分区函数。分区函数返回一个布尔值&#xff0c;这意味着得到的分组Map的键类型是B…

浅谈C++|STL初识篇

一.STL的诞生 长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西。 .C的面向对象和泛型编程思想&#xff0c;目的就是复用性的提升 大多情况下&#xff0c;数据结构和算法都未能有一套标准,导致被迫从事大量重复工作 为了建立数据结构和算法的一套标准&#xff0c;诞…

linux入门---命名管道

如何创建命名管道 使用mkfifo函数就可以在程序里面创建管道文件&#xff0c;该函数的声明如下&#xff1a; 该函数需要两个参数&#xff0c;第一个参数表示要在哪个路径下创建管道文件并且这个路径得待上管道文件的名字&#xff0c;因为每个文件都有对应的权限&#xff0c;所…

基于springboot+vue的网络海鲜商城

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

【Spatial-Temporal Action Localization(二)】论文阅读2017年

文章目录 1. ActionVLAD: Learning spatio-temporal aggregation for action classification [code](https://github.com/rohitgirdhar/ActionVLAD/)[](https://github.com/rohitgirdhar/ActionVLAD/)摘要和结论引言&#xff1a;针对痛点和贡献相关工作模型框架思考不足之处 2.…

Windows下防火墙端口配置

在电脑或者服务器上部署某个应用后&#xff0c;如果需要对外提供服务可能就需要在主机防火墙上设置开启需要的端口&#xff0c;那么具体怎样操作呢 1.打开windows防火墙 2.设置防火墙入站规则 如下图“高级安全Windows Defender 防火墙”页面&#xff0c;点击左侧“入站规则”…

5.10.WebRTC接口宏

那今天呢&#xff1f;我给大家介绍一下web rtc的接口宏&#xff0c;那之所以在现成的章节中要介绍接口宏。是由于接口在调用的过程中啊&#xff0c;会发生线程的切换&#xff0c;所以把接口宏这部分知识我们放在线程这一章还算比较合适的。 那另外呢&#xff0c;我们对于接口…

【Linux-day11-线程的创建与同步】

Linux 线程的创建与同步 线程的概念 线程是进程内部的一条执行序列或执行路径&#xff0c;一个进程可以包含多条线程。 进程与线程的区别 进程是资源分配的最小单位&#xff0c;线程是 CPU 调度的最小单位进程有自己的独立地址空间&#xff0c;线程共享进程中的地址空间进…

ODC解读:数据脱敏在数据库协同开发的关键作用

肖杨 OceanBase生态产品研发工程师 OceanBase 生态产品研发工程师&#xff0c;山地骑行爱好者&#xff0c;ODC 团队核心成员&#xff0c;负责数据安全合规和系统集成&#xff0c;对 Java EE、 AI 大模型、MCU 芯片 等技术有着浓厚兴趣。 在数据库协同开发领域&#xff0c;敏感…

Spring MVC 七 - Locale 本地化

Spring各模块都支持国际化&#xff0c;SpringMVC也同样支持。DispatcherServlet通过Locale Resovler自动根据客户端的Locale支持国际化。 request请求上来后&#xff0c;DispatcherServlet查找并设置Locale Resovler&#xff0c;我们可以通过RequestContext.getLocale()获取到…