Java 沉淀-2

一维数组

初始化:

动态初始化:数组声明且为数组元素分配空间与赋值操作分开进行

静态初始化:在定义数组的同时就为数组元素分配空间并赋值

数组元素类型

二维数组

数组中的数组

初始化

注意特殊学法情况:int[]x,y[]: x是一维数组,y是二维数组

多维数组不必都是规则矩阵形式

十大内部排序算法

选择排序:直接选择排序,堆排序

交换排序:冒泡排序,快速排序

插入排序:直接插入排序,折半插入排序,shell排序

归并排序

桶式排序

基数排序

Arrays工具类的使用

java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法

数组元素排序:

import java.util.Arrays;

Arrays.sort();

Java类及类的成员

对象的创建和使用

创建对象语法:类名 对象名 = new 类名();

使用 对象名.对象成员 的方式访问对象成员(包括属性和方法)

成员变量(属性)和局部变量的区别?

方法

方法是类或对象行为特征的抽象,用来完成某个功能操作,在某些语言中也称为函数或过程。

将功能封装为方法的目的是,可以实现代码重用,简化代码

Java里的方法不能独立存在,所有的方法必须定义在类里。

方法的声明格式:

其中:

修饰符:public,缺省,private,protected等

返回值类型:

        没有返回值:void

        有返回值:声明返回值的类型。与方法体中“return返回值”搭配使用

方法名:属于标识符,命中时遵循标识符命名规则和规范,“见名知意”

形参列表:可以包含零个,一个或多个参数。多个参数时,中间用“,”隔开

返回值:方法在执行完毕后返还给调用它的程序的数据

方法的分类

方法的重载

在同一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可。

特点:与返回值类型无关,只看参数列表,且参数列表必须不同,调用时,根据方法参数列表的不同来区别。

示例:

可变个数的形参

Java的实参值如何传入方法呢?

Java里方法的参数传递方法只有一种:值传递。即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。

        形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参

        形参是引用数据类型:将实参引用数据类型的变量的“地址值”传给形参

信息的封装和隐藏

Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:

        隐藏一个类中不需要对外提供的实现细节;

        使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;

        便于修改,增强代码的可维护性;

四种访问权限修饰符

对于class的权限修饰只可以用 public 和 default

        public 类可以在任意地方被访问

        dufault类只可以被同一个包内部的类访问。

构造器

特征:它具有与类相同的名称

        它不声明返回值类型。

        不能被static,final,synchronized,abstract,native修饰,不能有return语句返回值

作用:创建对象;给对象进行初始化

根据参数不同,构造器可以分为如下两类

        隐式无参构造器(系统默认提供)

        显式定义一个或多个构造器(无参、有参)

注意:

        Java语言中,每个类都有至少一个构造器;

        默认构造器的修饰符与所属类的修饰符一致;

        一旦显示定义了构造器,则系统不再提供默认构造器;

        一个类可以创建多个重载的构造器;

        父类的构造器不可以被子类继承。

UML类图

this关键字

this是什么?它的作用和其词义很接近

        它在方法内部使用,即这个方法所属对象的引用;

        它在构造器内部使用,表示该构造器正在初始化的对象。

this可以调用类的属性,方法和构造器

当在方法内需要用到该方法的对象时,就用this

例如:我们可以用this来区分属性和局部变量。this.name = name;

MVC设计模式

MVC是常用的设计模式之一,将程序分为三个层次:视图模型层,控制器层,数据模型层。

这种将程序输入输出、数据处理以及数据的展示分离开的设计模式使程序结构变得灵活而且清晰,同时也描述了程序各个对象间的通信方式,降低了程序的耦合性。

JDK中主要的包介绍

java.lang:包含一些java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能

java.net:包含执行与网络相关的操作的类的接口。

java.io:包含能提供多种输入/输出功能的类。

java.util:包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。

java.text:包含了一些java格式化相关的类

java.sql:包含了java进行JDBC数据库编程的相关类/接口

java.awt:包含了构成抽象窗口工具集的多个类(abstract window toolkits),被用来构建和管理应用程序的图形用户界面(GUI)

类继承

语法规则:

class Subclass extends SuperClass{ }

Java只支持单继承和多层继承,不允许多重继承:

        一个子类只能有一个父类

        一个父类可以派生出多个子类

方法的重写

在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。

要求:

        子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表;

        子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型;

        子类重写的方法的访问权限不能小于父类被重写的方法的访问权限;       

                子类不能重写父类中声明为private权限的方法

        子类方法抛出的异常不能大于父类被重写方法的异常

注意:

子类与父类中同名同参数的方法必须同时声明为非static的(重写),或者同时声明为static的(非重写),因为static方法是属于类的,子类无法覆盖父类的方法。

重写是一种多态性:同名的方法,用不同的对象来区分调用的是哪一个方法。

关键字super

在Java类中使用super来调用父类中的指定操作:

        super可用于访问父类中定义的属性

        super可用于调用父类中定义的成员方法

        super可用于在子类构造器中调用父类的构造器

注意:

        尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员

        super的追溯不仅限于直接父类

        super的用法和this相像,this代表本类对象的引用,super代表父类的内存空间的标识

调用父类的构造器

子类中所有的构造器默认都会访问父类中空参数的构造器

当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,同时,只能 二选一 ,且必须放在构造器的首行

如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错

this 和 super 的区别

子类对象的实例化过程

多态性

是面向对象中最重要的概念,在Java中的体现:

        对象的多态性:父类的引用指向子类的对象,可以直接应用在抽象类和接口上

Java引用变量有两种类型:编译时类型和运行时类型

        编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简称:编译时,看左边;运行时,看右边

若编译时类型和运行时类型不一致,就出现了对象的多态性

多态情况下:看左边:看的是父类的引用(父类不具备子类特有的方法)

                        看右边:看的是子类的对象(实际运行的是子类重写父类的方法)

一个引用类型变量如果声明为父类的类型,但实际引用的是子类的对象,那么该变量就不能再访问子类中添加的属性和方法

虚拟方法调用

当一个引用类型变量声明为父类的类型,但实际引用的是子类的对象时,通过该父类引用变量直接访问的确是无法访问子类特有的属性和方法的。这是因为编译时,编译器只能确认到该变量的声明类型,即父类类型,编译器并不知道运行时该变量实际引用的对象类型。

然而,这并不意味着不能通过该父类引用变量调用子类覆写(Override)的方法。这里就要谈到“动态绑定”了。动态绑定,也叫做晚期绑定,是指在程序运行时(而非编译时),根据对象的实际类型来调用对应的方法。这是多态性的一种表现。

多态性允许我们通过父类的引用来调用子类的实现,这样的设计使得我们可以编写更加通用和灵活的代码。具体到方法调用时,即使是通过父类的引用变量,只要该方法在子类中被覆写了,那么实际上调用的就是子类中的方法实现。这就是动态绑定的工作原理。

例如,考虑以下Java代码片段:

class Animal {
    void eat() {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
    void eat() {
        System.out.println("Dog is eating");
    }

    void bark() {
        System.out.println("Dog is barking");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal a = new Dog();
        a.eat(); // 动态绑定到Dog的eat()方法
        // a.bark(); // 编译错误,因为Animal类中没有bark()方法
    }
}

在上述代码中,尽管a被声明为Animal类型,但实际上它引用的是一个Dog对象。因此,当调用a.eat()时,由于存在动态绑定,所调用的实际是Dog类中覆写的eat()方法。然而,如果尝试调用a.bark(),则会在编译时发生错误,因为在Animal类中并不存在bark()方法。

总结一下,动态绑定允许我们在运行时根据对象的实际类型调用相应的方法,这是实现多态性的关键机制。尽管不能直接通过父类引用访问子类特有的属性和方法,但我们仍然可以通过动态绑定来调用覆写的方法,实现多态的效果。

重载和重写的对比

多态小结

多态的作用:提高了代码的通用性,常称作接口重用

前提:需要存在继承或者实现关系,有方法的重写

成员方法:

        编译时:要查看引用变量所声明的类中是否有所调用的方法

        运行时:调用实际new的对象所属的类中的重写方法

成员变量:

        不具备多态性,只看引用变量所声明的类

instanceof 操作符

检验x是否为类A的对象,返回值为boolean

要求x所属的类与类A必须是子类和父类的关系,否则编译出错

如果x属于类A的子类B,x instanceof A 值也为True

基本类型,包装类和String类间的转换

-128~127的整数对象会被缓存,直接使用

6

关键字:static

类属性、类方法的设计思想

类属性作为该类各个对象之间的共享的变量。在设计类时,分析哪些属性不因对象的不同而改变,这些属性设置为类属性,相应的方法设置为类方法

如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用

static

使用范围:

        在Java类中,可用static修饰属性、方法、代码块、内部类

被修饰后的成员具备以下特点:

        随着类的加载而加载

        优先于对象存在

        修饰的成员,被所有对象所共享

        访问权限允许时,可不创建对象,直接被类调用

因为不需要实例就可以访问static方法,所以static方法内部不能有this,super

static修饰的方法不能被重写

单例设计模式

应用场景

代码块

代码块(或初始化块)的作用:

        对Java类或对象进行初始化

分类:一个类中代码块若有修饰符,只能被static修饰,为静态代码块;没被修饰的,为非静态代码块

        static代码块通常用于初始化static的属性

程序中成员变量赋值的执行顺序

声明成员变量的默认初始化——显式初始化、多个初始化块依次被执行——构造器再对成员进行初始化操作——通过“对象.属性”或“对象.方法”的方式,可以多次给属性赋值

final关键字

表示 最终的

final标记的类不能被继承,提高安全性,程序可读性

        String类、System类

final标记的方法不能被子类重写

        比如:Object类的getClass()。

final标记的变量即称为常量。名称大写,且只能被赋值一次

        final标记的成员变量必须在声明时或在每个构造器中或代码块中显示赋值,然后才能使用

        final double MY_PI = 3.14

抽象类与抽象方法

用abstract关键字来修饰一个类,这个类叫做抽象类

用abstract来修饰一个方法,这个方法叫抽象方法

        抽象方法,只有方法的声明,没有方法的实现,以分号结束。比如public abstract void talk();

含有抽象方法的类必须被声明为抽象类

抽象类不能被实例化,抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体,若没有重写全部的抽象方法,扔为抽象类

不能用abstract修饰变量、代码块、构造器

不能用abstract修饰私有方法、静态方法、final方法、final类(不能继承)

接口

接口interface 是抽象方法和常量值定义的集合

特点:

接口和抽象类的对比

内部类

面向对象内容总结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库范式拆分实战

函数依赖 如果给定一个X,能唯一确定一个Y,就称X确定Y,或者说Y依赖于X,例如Y X*X函数。 X -> Y(X确定Y,Y依赖于X) 部分函数依赖 A可确定C,(A,B&#xff09…

[金三银四] 操作系统上下文切换系列

图源: https://zhuanlan.zhihu.com/p/540717796 文章目录 2.11 cpu 的上下文切换2.12 协程的上下文切换2.13 线程的上下文切换2.14 进程的上下文切换2.15 中断上下文切换2.16 什么时候会发生进程的上下文切换2.17 什么时候会发生线程的上下文切换2.18 什么时候会发生…

程序汪保姆教程在linux上部署运行一套SpringBoot内容管理系统

❝ 程序汪已经分享了很多开源项目了,发现一个痛点很多人拿到开源项目了不会部署运行,光看代码很多人看不下去的(程序汪也是这样),程序汪建议拿到开源项目了,一定要想办法把项目运行起来跑跑,然后…

树的遍历方式DFS和BFS

DFS(depth first search) 深度优先遍历 从图中一个未访问的顶点V开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路走到底…不断递归重复这个过程,直到所有的顶点都遍历完成。前序遍历&#xff0c…

【Postman】工具使用介绍

一、postman工具介绍 1.什么是postman postman是谷歌开发的一款网页调试和接口测试工具,能够发送任何请求类型的http请求,支持GET/POST/PUT/DELETE等方法。postman简单易用,可以直接填写URL,header,body就可以发送一…

OpenHarmony开发自测试执行框架

OpenHarmony为开发者提供了一套全面的开发自测试框架OHA-developer_test,开发者可根据测试需求开发相关测试用例,开发阶段提前发现缺陷,大幅提高代码质量。 本文从基础环境构建,用例开发,编译以及执行等方面介绍OpenH…

双向链表

目录 单向链表 双向链表 特点 缺点 双向链表的封装 单向链表 只能从头遍历到尾或者从尾遍历到头(一般从头到尾)。也就是链表相连的过程是单向的. 实现的原理是上一个链表中有一个指向下一个的引用 单向链表有一个比较明显的缺点: 我们可以轻松的到达下一个节点,但是回到…

Docker 入门使用说明

Docker 入门使用说明 Docker 安装 Docker 官网:Docker Docker 安装说明:Docker 安装说明 这里由于 Docker 在实时更新,所以每次安装 Docker 用来导入 key 的链接可能会有变化,这里就参考官方的安装方法即可 Docker 常用命令说…

OSCP靶场--Clue

OSCP靶场–Clue 考点(文件读取读取配置中的密码rce认证后利用sudo 提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.163.240 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-14 08:44 EDT Nmap scan report for 192…

网络通信VLAN学习篇

拓扑图 如上图,pc3,pc5同一网络,pc4,pc6同一网络,vlan的划分就是虚拟局域网,局域网的理解就是同一vlan下的设备可以相互通信,不同vlan不可以通信(通过三层交换机可以实现通信的&…

缓存穿透、缓存击穿、缓存雪崩及其解决方法

缓存穿透、缓存击穿、缓存雪崩是redis的三大问题。 在介绍这三大问题之前,我们需要先了解Redis作为一个缓存中间件,在项目中是如何工作的。首先看一下在没有缓存中间件的时候的系统数据访问的架构图: 客户端发起一个查询请求的时候&#xff…

面试算法-98-随机链表的复制

题目 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节…

深入理解 Docker 镜像

1. Docker 镜像的底层原理 1.1 分层的镜像 以我们的pull 命令为例,在下载的过程中我们可以看到docker的镜像好像是一层一层的在下载。 1.2 UnionFS(联合文件系统) 联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次…

马斯克AI大模型Grok开源了!

2024年3月18日,马斯克的AI创企xAI兑现承诺,正式发布了此前备受期待大模型Grok-1。 代码和模型权重已上线GitHub: https://github.com/xai-org/grok-1 截止目前,Grok已经在GitHub上获得了35.2k颗Star,还在不断上升中。 Grok官方博…

202446读书笔记|《夜风颂》——生命的内核是过往和希望 有情在朝暮 长聚长相思

202446读书笔记|《夜风颂》——生命的内核是过往和希望 有情在朝暮 长聚长相思 序现代诗古体诗 《夜风颂》作者王锴,前段时间加入书架的书,前边有几首现代诗挺惊艳,蛮喜欢的,后边古体诗稍逊色些。值得一读的一本小诗集。 序 海鸥之…

蓝桥杯(2):python基础算法【上】

时间复杂度、枚举、模拟、递归、进制转换、前缀和、差分、离散化 1 时间复杂度 重要是看循环,一共运行了几次 1.1 简单代码看循环 #时间复杂度1 n int(input()) for i in range(1,n1):for j in range(0,i):pass ###时间复杂度:123....nn(1n)/2 所以…

Ambari——编译——解决替换yarn 版本后 系mvn 打包找不到yarn 文件问题

您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 报错原因: [ERROR] Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.4:yarn (yarn install) on project amb…

python综合实战案例-数据分析

Python是进行数据分析的好工具,今天就是借助一个案例给大家进行数据分析讲解。 本例设计一个log.txt⽂件,该文件记录了某个项⽬中某个 api 的调⽤情况,采样时间为每分钟⼀次,包括调⽤次数、响应时间等信息,⼤约18万条数…

基于Java中的SSM框架实现快餐店线上点餐系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现快餐店线上点餐系统演示 摘要 随着计算机互联网的高速发展。餐饮业的发展也加入了电子商务团队。各种网上点餐系统纷纷涌现,不仅增加了商户的销售量和营业额,而且为买家提供了极大的方便,足不出户,就能订…

备战蓝桥杯---牛客寒假算法基础集训6

1.并查集数学 分析: 首先我们知道算数基本定理,如果两个数有大于1的质因子,那么我们就需要把他们放在同一个集合,因此我们可以用欧拉刷出1e6范围内的素数,然后依次看输入的数。 拿202*2*5举例子,我们在求…