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

news2024/12/23 13:58:22

文章目录

    • 一、数组(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());//thefather
        System.out.println(son.getInfo());//hello
        son.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;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

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

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

相关文章

基于 SpringBoot 2.7.x 使用最新的 Elasticsearch Java API Client 之 ElasticsearchClient

1. 从 RestHighLevelClient 到 ElasticsearchClient 从 Java Rest Client 7.15.0 版本开始&#xff0c;Elasticsearch 官方决定将 RestHighLevelClient 标记为废弃的&#xff0c;并推荐使用新的 Java API Client&#xff0c;即 ElasticsearchClient. 为什么要将 RestHighLevelC…

大喜国庆,聊聊我正式进入职场的这三个月...

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Thymeleaf 内联语法使用教程

1 表达式内联 Thrmeleaf标准方言允许使用标签属性(th:)来实现很多的功能&#xff0c;但在有些场景之下&#xff0c;需要将表达式直接写入我们HTML 代码中和CSS代码中及JavaScript代码中【代码和html文件在一起&#xff0c;分能不开&#xff0c;待验证】&#xff0c;称为内联…

[Unity][VR]Oculus透视开发图文教程1-Passthrough应用XR项目设置

Oculus现在已向开发者公布了如何使用自己的设备Camera,本系列课程就来手把手地告诉你如何在Unity中使用这个特性。 第一步,既然用的是Quest的特性,那就需要先引入Quest的Unity开发SDK。并且完成基本的VR开发项目设置。 新建Unity项目后,在编辑器界面先点击Window,打开资…

【实验记录】一些小疑问

1.为什么要选择基于“外观”这一特性来作为回环检测的方案&#xff1f; 朴素思路复杂度高&#xff0c;不利于实时性&#xff1b;基于“里程计”的方案需要知道相机处于何位置下才能发生检测&#xff0c;这与我们需要知道的准确位置相矛盾 基于“外观”的方案与前端和后端均无关…

计算机图形学、贝塞尔曲线及绘制方法、反走样问题的解决(附完整代码)

贝塞尔曲线 1. 本次作业实现的函数及简单描述&#xff08;详细代码见后&#xff09;2. 与本次作业有关的基础知识整理3. 代码描述&#xff08;详细&#xff09;4. 完整代码5. 参考文献 &#xff08;本篇为作者学习计算机图形学时根据作业所撰写的笔记&#xff0c; 如有同课程请…

进程的状态与转换以及组织方式

1.进程的状态 三种基本状态&#xff1a;运行态&#xff0c;就绪态&#xff0c;阻塞态。 1.运行状态 如果一个进程此时在CPU上运行&#xff0c;那么这个进程处于“运行态”。 CPU会执行该进程对应的程序&#xff08;执行指令序列) 2.就绪状态 当进程创建完成后&#xff0c;…

【论文阅读】(CVPR2023)用于半监督医学图像分割的双向复制粘贴

目录 前言方法BCPMean-teacher and Traning StrategyPre-Training via Copy-PasteBidirectional Copy-Paste ImagesBidirectional Copy-Paste Supervisory Signals Loss FunctionTesting Phase 结论 先看这个图&#xff0c;感觉比较清晰。它整个的思路就是把有标签的图片和无标…

动态规划算法(1)--矩阵连乘

目录 一、动态数组 1、创建动态数组 2、添加元素 3、删除修改元素 4、访问元素 5、返回数组长度 6、for each遍历数组 二、输入多个数字 1、正则表达式 2、has.next()方法 三、矩阵连乘 1、什么是矩阵连乘&#xff1f; 2、动态规划思路 3、手推m和s矩阵 4、完…

AI伦理与机器道德:人工智能的道德挑战

文章目录 什么是AI伦理和机器道德&#xff1f;1. 隐私保护2. 歧视和不平等3. 透明度和解释性4. 安全性5. 社会影响 AI伦理和机器道德的重要性1. 保护个人权利2. 避免不平等和歧视3. 保持透明和责任4. 促进创新 AI伦理挑战和解决方案1. 隐私保护2. 歧视和不平等3. 透明度和解释性…

P1541 [NOIP2010 提高组] 乌龟棋(4维背包问题)

[NOIP2010 提高组] 乌龟棋 题目背景 小明过生日的时候&#xff0c;爸爸送给他一副乌龟棋当作礼物。 题目描述 乌龟棋的棋盘是一行 N N N 个格子&#xff0c;每个格子上一个分数&#xff08;非负整数&#xff09;。棋盘第 1 1 1 格是唯一的起点&#xff0c;第 N N N 格是…

Nginx简介与Docker Compose部署指南

Nginx是一款高性能的开源Web服务器和反向代理服务器&#xff0c;以其卓越的性能、可伸缩性和灵活性而闻名。它在全球范围内广泛用于托管Web应用程序、负载均衡、反向代理和更多场景中。在本文中&#xff0c;我们将首先介绍Nginx的基本概念&#xff0c;然后演示如何使用Docker C…

Apollo自动驾驶系统概述(文末参与活动赠送百度周边)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

数据结构之美:如何优化搜索和排序算法

文章目录 搜索算法的优化1. 二分搜索2. 哈希表 排序算法的优化1. 快速排序2. 归并排序 总结 &#x1f389;欢迎来到数据结构学习专栏~数据结构之美&#xff1a;如何优化搜索和排序算法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x…

阿里云ECS服务器无法发送邮件问题解决方案

这篇文章分享一下自己把项目部署在阿里云ECS上之后&#xff0c;登录邮件提醒时的邮件发送失败问题&#xff0c;无法连接发送邮箱的服务器。 博主使用的springboot提供的发送邮件服务&#xff0c;如下所示&#xff0c;为了实现异步的效果&#xff0c;新开了一个线程来发送邮件。…

【Vim 插件管理器】Vim-plug和Vim-vbundle的区别

- vundle是一款老款的插件管理工具 - vim-plug相对较新&#xff0c;特点是支持异步加载&#xff0c;相比vundle而言 Vim-plug 是一个自由、开源、速度非常快的、极简的 vim 插件管理器。它可以并行地安装或更新插件。你还可以回滚更新。它创建浅层克隆shallow clone最小化磁盘…

【数据结构初阶】六、线性表中的队列(C语言 -- 链式结构实现队列)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】五、线性表中的栈&#xff08;C语言 -- 顺序表实现栈&#xff09;_高高的胖子的博客-CSDN博客 1 . 队列&#xff08;Queue&#xff09; 队列的概念和结构&#xf…

如何利用niceGUI构建一个流式单轮对话界面

官方文档 参考文档 import asyncio import time import requests from fastapi import FastAPI from nicegui import app, uiclass ChatPage:temperature: ui.slider Nonetop_p: ui.slider Noneapi_key: ui.input Nonemodel_name: ui.input Noneprompt: ui.textarea None…

番外5:下载+安装+配置Linux

任务前期工作&#xff1a; 01. 电脑已安装好VMware Workstation软件&#xff1b; 02.提前下载好Rhel-8.iso映像文件&#xff08;文件较大一般在9.4GB&#xff0c;建议采用迅雷下载&#xff09;&#xff0c;本人使用的以下版本&#xff08;地址ed2k://|file|rhel-8.4-x86_64-dvd…

Tomcat启动后的日志输出为乱码

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…