Java进阶02 Array、内存分析、this、面向对象、继承、override、super、实例化、多态、向下转型、Object

文章目录

    • 一、数组(Array)
    • 二、数组的内存分析
    • 三、Array工具类
    • 四、面向对象的一些小知识
    • 五、进阶知识补充
      • 1. this关键字
      • 2.继承
      • 3.方法重写
      • 4.super关键字的使用
      • 5.子类对象实例化
      • 6.多态性的体现
      • 7.向下转型
      • 8.Object类

一、数组(Array)

数组:多个相同类型数据按照一定顺序排列的集合,用一个名字命名,通过编号的方式进行统一的管理
Java中的容器:数组、集合框架:在内存中对多个数据的存储

		//三种定义方式int[] arr1=new int[5];int[] arr2=new int[]{1,2,3};int[] arr3={1,2,3};//        二维数组的初始化int[][] a1= new int[][]{{1},{2}};//        静态初始化 new 中[][]不可以写数字int[][] a11= new int[][]{{1},{2}};int a22[][]=new int[2][];int[][] a3=new int[2][4];int[][] a4=new int[2][];

数组下标之所以要从0开始编号,因为这代表的是个偏移量,第一个元素与首地址一样,所以偏移量就是0,数组只有length属性,String有length()方法

二、数组的内存分析

在这里插入图片描述

区域名称作用
虚拟机栈用于存储正在执行的每个Java方法的局部变量表等。局部变量表存放了编译期可知长度
的各种基本数据类型、对象引用,方法执行完,自动释放。
堆内存存储对象(包括数组对象),new来创建的,都存储在堆内存。
方法区存储已被虚拟机加载的类信息、常量、(静态变量)、即时编译器编译后的代码等数据。
本地方法栈当程序中调用了native的本地方法时,本地方法执行期间的内存区域
程序计数器程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址

三、Array工具类

  • 数组元素拼接
    • static String toString(int[] a) :字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元素用字符 ", "(逗号加空格)分隔。形式为:[元素1,元素2,元素3。。。]
    • static String toString(Object[] a) :字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元素用字符 ", "(逗号加空格)分隔。元素将自动调用自己从Object继承的toString方法将对象转为字符串进行拼接,如果没有重写,则返回类型@hash值,如果重写则按重写返回的字符串进行拼接。
  • 数组排序
    • static void sort(int[] a) :将a数组按照从小到大进行排序
    • static void sort(int[] a, int fromIndex, int toIndex) :将a数组的[fromIndex, toIndex)部分按照升序排列
    • static void sort(Object[] a) :根据元素的自然顺序对指定对象数组按升序进行排序。
    • static void sort(T[] a, Comparator<? super T> c) :根据指定比较器产生的顺序对指定对象数组进行排序。
  • 数组元素的二分查找
    • static int binarySearch(int[] a, int key) 、static int binarySearch(Object[] a, Object key) :要求数组有序,在数组中查找key是否存在,如果存在返回第一次找到的下标,不存在返回负数。
  • 数组的复制
    • static int[] copyOf(int[] original, int newLength) :根据original原数组复制一个长度为newLength的新数组,并返回新数组
    • static T[] copyOf(T[] original,int newLength):根据original原数组复制一个长度为newLength的新数组,并返回新数组
    • static int[] copyOfRange(int[] original, int from, int to) :复制original原数组的[from,to)构成新数组,并返回新数组
    • static T[] copyOfRange(T[] original,int from,int to):复制original原数组的[from,to)构成新数组,并返回新数组
  • 比较两个数组是否相等
    • static boolean equals(int[] a, int[] a2) :比较两个数组的长度、元素是否完全相同
    • static boolean equals(Object[] a,Object[] a2):比较两个数组的长度、元素是否完全相同
  • 填充数组
    • static void fill(int[] a, int val) :用val值填充整个a数组
    • static void fill(Object[] a,Object val):用val对象填充整个a数组
    • static void fill(int[] a, int fromIndex, int toIndex, int val):将a数组[fromIndex,toIndex)部分填充为val值
    • static void fill(Object[] a, int fromIndex, int toIndex, Object val) :将a数组[fromIndex,toIndex)部分填充为val对象

四、面向对象的一些小知识

局部变量没有默认值初始化,需要显式赋值。

方法的重载overload 两同一不同(相同的类和方法名,参数个数和参数类型不同)

可变个数形参(jdk5.0) 格式 参数类型 … 参数名
个数可以是0个、1个或多个

    static void print(int... nums){System.out.println(Arrays.toString(nums));}

高内聚:类的内部数据操作细节自己完成,不允许外部干涉
低耦合:暴漏少量的方法给外部使用,尽量方便外部调用
修饰符 本类内部 本包内 其他包的子类 其他包非子类
在这里插入图片描述
在单例模式中,用private,避免在类的外部创建实例
java的引用类型有:类、数组、接口、注解、枚举、记录

五、进阶知识补充

1. this关键字

如果形参和属性名相同的时候,this就会发挥作用
有this修饰代表的是属性变量,没有this修饰则代表形参
this可以调用 成员变量,方法,构造器
this的理解,当前对象或当前正在创建的对象
但是不可以调用static修饰的方法
一般this省略,但是当出现同名了就需要this来区分
this(形参)调用构造器

2.继承

减少了代码冗余,提高代码复用性
继承的出现,有利于功能的拓展
一个父类可以有多个子类,一个子类只可以有一个父类

3.方法重写

override
重写的方法必须与父类方法的返回数据类型相同
不可以重写父类中private修饰的方法
继承之后,子类覆盖父类中同名同参数的方法

4.super关键字的使用

用于在子类重写的时候,对父类的被重写方法调用
区分子类和父类的同名属性(虽然继承了,但是属性不能覆盖)
super也是可以调用属性,方法,构造器
子类构造器的首行,没有this和super 那么就默认调用super()
子类的任何构造器 要么调用自己的构造器要么调用父类的构造器

在使用子类构造器创建对象时,一定在调用子类的时候直接或间接调用到父类的构造器,这样就会将父类的属性和方法加载到内存中,给子类对象使用

public class Father {private String info="TheFather";public void setInfo(String info){this.info=info;}public String getInfo(){return info;}
}
public class Son extends Father{private String info="TheSon";public void test(){System.out.println(this.getInfo());System.out.println(super.getInfo());}
}
        Father father = new Father();Son son = new Son();son.setInfo("hello");System.out.println(father.getInfo());//thefatherSystem.out.println(son.getInfo());//helloson.test();// hello hello

5.子类对象实例化

从过程角度看,子类构造器创建对象时,子类构造器会直接或间接调用父类的构造器,父类构造器同样会直接或简介调用父类的父类的构造器,直到调用Object类构造器为止
但是最后创建成功 内存中只会有一个对象 就是new的那一个

6.多态性的体现

多态性就是父类引用指向子类的对象
Person p=new man()
编译的时候看左边,运行的时候看右边
使用多态性的前提是,要有继承关系并且有方法的重写

利用这一点,可以根据同样的大类,进行自己的方法重写和调用
例如都是animal,传了dog 那就用dog重写的方法 传了cat 就用cat重写的方法

好处
极大得减少了代码的冗余,不需要定义多个重载的方法
即使增加了新的子类,方法也无需改变,提高了可拓展性,符合开闭原则(对拓展开放,对修改关闭)
弊端
在多态下,创建了子类的对象,加载了子类特有的属性和方法,但是声明的是父类的引用,所以没有办法直接调用子类的特有的属性和方法

7.向下转型

向下转型通过强转换来实现,向下转型可能会出现类型转换异常的问题
建议在向下转型之前用instanceof检查一下

8.Object类

任何一个类都直接或间接继承于Object类,所以叫根父类
Object类没有属性,构造器也是无参的
方法有11个

 clone()		实现对象的复制的另一种方法equals()任何引用类型都可以用 判断两个对象是否一样比较的是引用地址是否相同在StringFileDate和包装类中的equals方法都被重写了,用于比较内容是否一致==和equals的区别==是运算符 他的使用范围是基本数据类型和引用类型都可以,在基本数据类型上判断数据值是否相等,引用数据类型比较的是地址值equals是方法,使用范围只能使用在引用数据类型上。finalize()GC要回收的时候调用这个方法,重写之后可以在释放前做一些操作(System.gc()实现回收 回收null)可能会到导致出现循环引用,导致此对象不能回收getClass()获取当前的类hashCode()获取唯一标识哈希值notify()用于唤醒一个在此对象监视器上等待的线程notifyAll()唤醒在该对象上等待的所有线程toString()public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());}用sout打印变量的时候就是调用了对象的toString()方法,默认返回的是地址值wait()wait()wait()

clone创建对象的使用

package org.example;import java.lang.reflect.Array;
import java.util.Arrays;
public class App 
{public static void main( String[] args ){Father father1=new Father("hello");try{Father father2= (Father) father1.clone();System.out.println(father2.toString());}catch (Exception e){e.printStackTrace();}}
}
package org.example;public class Father implements Cloneable{private String info="TheFather";public Father(String info) {this.info = info;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}

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

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

相关文章

Qt应用开发(基础篇)——视图基类 QAbstractItemView

一、前言 QAbstractItemView类继承于QWidget&#xff0c;为全部视图类提供了基本的功能。 QAbstractItemView类是一个抽象类&#xff0c;不能被实例化使用&#xff0c;它是QtWidget框架中树视图QTreeView、列表视图QListView、表格视图QTableView、单列视图QColumnView和标题头…

nginx 反向代理 负载均衡 动静分离

一样东西的诞生通常都是为了解决某些问题&#xff0c;对于 Nginx 而言&#xff0c;也是如此。 比如&#xff0c;你出于无聊写了一个小网站&#xff0c;部署到 tomcat 之后可以正常访问 但是后来&#xff0c;你的这个小网站因为内容很诱人逐步的火了&#xff0c;用户越来越多&a…

深度学习笔记_1、定义神经网络

1、使用了PyTorch的nn.Module类来定义神经网络模型;使用nn.Linear来创建全连接层。(CPU) import torch.nn as nn import torch.nn.functional as F from torchsummary import summary# 定义神经网络模型 class Net(nn.Module):def __init__(self):super(Net, self).__init__()…

赋能工业数字化转型|辽宁七彩赛通受邀出席辽宁省工业互联网+安全可控先进制造业数字服务产业峰会

2023年9月25日下午&#xff0c;由软通动力信息技术&#xff08;集团&#xff09;股份有限公司主办的“工业互联网安全可控先进制造业数字服务产业峰会”在辽宁沈阳顺利举办。省市区各级政府、科研院所领导、技术专家、企业高管以及生态合作伙伴代表等齐聚一堂&#xff0c;共同探…

【JVM】第五篇 垃圾收集器G1和ZGC详解

导航 一. G1垃圾收集算法详解1. 大对象Humongous说明2. G1收集器执行一次GC运行的过程步骤3. G1垃圾收集分类4. G1垃圾收集器参数设置5. G1垃圾收集器的优化建议6. 适合使用G1垃圾收集器的场景?二. ZGC垃圾收集器详解1. NUMA与UMA2. 颜色指针3. ZGC的运作过程4. ZGC垃圾收集器…

【ShaderLab罪恶装备卡通角色_二次元风格_“Sol Badguy“_角色渲染(第二篇)】

罪恶装备背德之炎卡通角色_二次元风格_Unity 角色渲染 角色初始效果&#xff1a;基础渲染SimpleBas 资源分析模型顶点颜色&#xff1a; 贴图资源SOL_base_基础色块效果&#xff1a;其中SOL_base_A通道的效果&#xff1a; SOL_ilm&#xff1a;如下SOL_ilm模型上区域分布- 左到右…

python-切换镜像源和使用PyCharm进行第三方开源包安装

文章目录 前言python-切换镜像源和使用PyCharm进行第三方开源包安装1. 切换镜像源2. 使用PyCharm进行第三方开源包安装 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每…

python爬取百度图片

1.查询数据 打开网页。 https://cn.bing.com/images/search?q%E7%99%BE%E5%BA%A6%E5%9B%BE%E7%89%87&formHDRSC2&first1&cw1585&ch924 我们右键查看网页源代码,发现能找到我们需要的img衔接,但是这是一个动态网页。我们每次向下滑动网页&#xff0c;会发现图…

RHEL8.0安装+基础命令练习+discuz(lamp)论坛搭建

上课练习环境&#xff1a; RHEL8.0系统镜像下载&#xff1a; 链接1&#xff1a;https://pan.baidu.com/s/1wX2j-aTO1VRcHQYpCDYnEg 提取码&#xff1a;6buv 链接2&#xff1a;https://ws28.cn/f/32i4oq8p5r1 &#xff08;下载完2个文件后只需要解压001&#xff0c;推荐压缩…

Ubuntu服务器安全性提升:修改SSH默认端口号

在Ubuntu服务器上&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种至关重要的远程连接工具。它提供了一种安全的方式来远程连接和管理计算机系统&#xff0c;通过加密通信来确保数据的保密性和完整性。SSH协议广泛用于计算机网络中&#xff0c;用于远程管理、文件传…

打包python模块代码到pypi

python中&#xff0c;我们会在自己业务中&#xff0c;重复性的使用某些功能。我们可以把这些公用的模块&#xff0c;打包上传&#xff0c;然后给需要的人使用&#xff0c;pypi给我们提供了这个机会 本期目录 一、准备工作 二、编写文件 三、上传下载 一、准备工作 1、需要git…

妙不可言的Python之旅----(一)

初识Python python的起源 1989年&#xff0c;为了打发圣诞节假期&#xff0c;Gudio van Rossum吉多 范罗苏姆&#xff08;龟叔&#xff09;决心开发一个新的解释程序&#xff08;Python雏形&#xff09; 1991年&#xff0c;第一个Python解释器诞生 Python这个名字&#xff…

ubuntu 18.04 LTS安装opencv 3.4.16 + opencv_contrib 3.4.16

1.下载 opencv 3.4.16 opencv_contrib 3.4.16 其中&#xff0c;opencv_contrib解压后的多个文件夹复制到opencv内、合并 2.安装 参考博文&#xff1a; https://zhuanlan.zhihu.com/p/650792342 https://zhuanlan.zhihu.com/p/87197806 其中 &#xff08;1&#xff09;cmake前…

Redis与分布式-哨兵模式

接上文 Redis与分布式-主从复制 1.哨兵模式 启动一个哨兵&#xff0c;只需要修改配置文件即可&#xff0c; sentinel monitor lbwnb 1247.0.0.1 6001 1先将所有服务关闭&#xff0c;然后修改配置文件&#xff0c;redis Master&#xff0c;redis Slave&#xff0c;redis Slave…

基于大语言模型扬长避短架构服务

秘诀&#xff1a; 扬泛化之长&#xff0c; 避时延之短

最新AI智能创作系统ChatGPT商业源码+详细图文搭建部署教程+AI绘画系统

一、AI系统介绍 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&am…

Python学习之索引与切片

Python学习之索引与切片 s “0abcdefghijklmnopqrstuvwxyz”&#xff0c;第一个元素‘0’&#xff0c;索引号为0&#xff0c;最后一个元素‘z’&#xff0c;索引号为26 1. s[0]获取索引号为0的元素 2. s[1:3]获取索引号为1的元素&#xff0c;直到但不包括索引号为3的元素。即…

西门子S7-1200使用LRCF通信库与安川机器人进行EthernetIP通信的具体方法示例

西门子S7-1200使用LRCF通信库与安川机器人进行EthernetIP通信的具体方法示例 准备条件: PLC:S7-1200 1214C DC/DC/DC 系统版本4.5及以上。 机器人控制柜:安川YRC1000。 软件:TIA V17 PLC做主站,机器人做从站。 具体方法可参考以下内容: 使用的库文件为西门子 1200系列…

源码编译安装systemtap

目录 编译环境 编译步骤 编译环境 阿里云ubuntu20.04 编译步骤 1 先安装elfutils&#xff0c;参见我的前一篇博客 源码编译elfutils_金色熊族的博客-CSDN博客 2 下载systemtap源码 3 解压 解压后的文件夹与elfutils的文件夹应该是平行的&#xff0c;如下图&#xff1a…

网页一直跳转到国家反诈中心页面

很明显&#xff0c;我进入的是vscode的官方下载地址。 但是一直会出现反诈中心的拦截 我们需要在控制面板中&#xff0c;找到网络&#xff0c; 将Internet 协议版本 4 (TCP/IPv4)的属性改成 使用下面的DNS 服务地址(E)&#xff1a;8.8.8.8 这样就可以正常访问相关的页面了