Java学习之类和对象、内存底层

目录

表格结构和类结构

表格的动作和类的方法

与面向过程的区别

具体实现

对象和类的详解

类的定义

属性(field 成员变量)

方法

示例--编写简单的学生类

简单内存分析(理解面向对象)

构造方法(构造器 constructor)

声明格式:

四个要点

练习

构造方法的重载

测试

JVM虚拟机内存模型

参数传值机制

基本数据类型参数的传值

引用类型参数的传值

示例

垃圾回收机制(Garbage Collection)

原理和算法

通用的分代垃圾回收机制

JVM调优和Full GC

容易造成内存泄漏的操作

this关键字

用法

static关键字

特点

静态初始化块

注意事项

变量的分类和作用域

包机制(package、import)

两个要点

JDK中的主要包

导入类import

注意点

静态导入

使用

表格结构和类结构

面向对象中,类对应表的结构(表的field)

表格的动作和类的方法

动作---定义成方法

对象对应“表中的数据”

与面向过程的区别

  • 都是对软件分析、设计和开发的一种思想,C语言是一种典型的面向过程语言,Java是一种典型的面向对象语言。

  • 面向过程适合简单、不需要协作的事务,重点关注如何执行,是一种执行思维

  • 面向对象更契合人的思维模式,是一种设计者思维

面向对象可以帮助我们从宏观上把握,从整体上分析整个系统。但具体到微观操作,仍然需要面向过程的思路,它们搜索相辅相成的

具体实现

设计时,先从问题中找名词,确定哪些名词可以作为类,再根据问题需求确定类的属性和方法,确定类之间的关系。

对象和类的详解

类:class,对象:Object、instance(实例)。

  • 类可以看作一类对象的模板,对象可以看作该类的一个具体实例

  • 类用于描述同一类型的对象的一个抽象概念,定义了这一类对象所应具有的共同属性、方法

类的定义

每个源文件必须有且仅有一个public class,并且类名与文件名保持一致

一个Java文件可以定义多个class

对于一个类来说,有三种成员:

  • 属性(field)

  • 方法(method)

  • 构造器(constructor)

属性(field 成员变量)

属性用于定义该类或该类对象包含的数据或静态特征,作用范围是整个类体,定义成员变量时可对其初始化,如果不初始化,Java默认做初始化。

成员变量的默认值默认值
数据类型默认值
整型0
浮点型0.0
字符型'\u0000'
布尔型flase
所有引用类型null

定义格式:

[修饰符] 属性类型 属性名 = [默认值] ;

方法

用于定义该类或该类实例的行为特征和功能实现。是类和对象行为特征的抽象。

整个程序最基本的单位是类,方法从属于类和对象。

格式:

[修饰符] 方法返回值类型 方法名(形参列表) {

// n条语句

}

示例--编写简单的学生类
public class student {
    int id;
    int age;
    String name;
​
    public void study(){
      System.out.println("学习呢!");
    }
​
    public void play(){
      System.out.println("好玩爱玩!");
    }
​
    public static void main(String[] args) {
      student s = new student();    // 创建了一个对象
      System.out.println(s.id);
      System.out.println(s.name);
      System.out.println(s.age);
      s.name = "张三";
      s.age = 18;
      System.out.println(s.name);
      System.out.println(s.age);
​
      s.play();
      s.study();
    }
​
}

简单内存分析(理解面向对象)

栈(stack):main()的栈帧:args:null、s:堆中的值

堆(heep):id、age、name(属性--都是默认值),study()、play()两个方法

方法区:student类的信息:study()、play()代码;常量池;static属性和方法

创建对象四步:

  • 分配对象空间,并将对象成员变量初始化为0或空

  • 执行属性值的显式初始化

  • 执行构造方法

  • 返回对象的地址给相关的变量

构造方法(构造器 constructor)

用于对象初始化,不是创建对象

声明格式:

[修饰符] 类名(形参列表){

// n条语句

}

四个要点
  • 构造器通过关键字new调用

  • 构造器虽然有返回值,但不能定义返回值类型(返回值的类型肯定不是本类),不能在构造器里使用return返回某个值

  • 如果没有定义构造器,编译器会自动定义一个无参的构造方式。

  • 构造器的方法名必须和类名一致

练习

定义一个"点"(Point)类来表示二维空间中的点(有两个坐标),要求:

  • 可以生产具有特定坐标的点对象

  • 提供可计算该"点"距另外一点距离的方法

public class Point {
    double x,y;
​
    Point(double _x,double _y){
        x = _x;
        y = _y;
    }
​
    public double getDistance(Point p){
        return Math.sqrt((x-p.x) * (x-p.x) + (y-p.y) * (y- p.y));
    }
​
    public static void main(String[] args) {
        Point p1 = new Point(3.0,4.0);
        Point origin = new Point(0.0,0.0);
        System.out.println(p1.getDistance(origin));
    }
}
构造方法的重载
测试
public class user {
    int age;
    int id;
    String name;
​
    public user(){
    }
    public user(int id){
        this.id = id;
    }
​
    public user(int id,String name){
        this.id = id;
        this.name = name;
    }
​
    public user(int age, int id, String name) {
        this.age = age;
        this.id = id;
        this.name = name;
    }
​
    public static void main(String[] args) {
        user a = new user(1);
        user b = new user(2,"张三");
        user c = new user(18,3,"李四");
    }
}

快捷键生成构造器:右键--generate--constructor

JVM虚拟机内存模型

学习JVM虚拟机内存模型能够更好的理解面向对象

分为三个区域:

  • 栈(stack)

    • 描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧

    • JVM为每个线程创建一个栈,存放该线程执行方法的信息

    • 属于线程私有,不能实现线程间共享

    • 先进后出,后进先出

    • 由系统分配,速度快,是一个连续的内存空间

  • 堆(heap)

    • 用于存储创建好的对象和数组

    • JVM只有一个堆,所有线程共享

    • 是一个不连续的内存空间,分配灵活,速度慢

    • 在堆上的区域,会被垃圾回收器做进一步的划分,eg:新生代、老年代

  • 方法区(method area)

    • JAVA虚拟机规范,可有不同实现

      • JDK7以前是"永久代"

      • JDK部分去除“永久代”,静态变量,字符串场池都挪到了堆内存中

      • JDK8是“元数据空间”和堆结合起来

    • JVM只有一个方法区,被所有线程共享

    • 方法区实际也是堆,只是用于存储类、常量相关信息

    • 用来存放程序中永远不变或唯一的内容

    • 常量池主要存放常量:文本字符串、final常量值

参数传值机制

Java中,方法中所有参数都是"值传递",即我们得到的是"复印件",而不是"原件"。

基本数据类型参数的传值

传递的是值的副本,副本改变不会影响原件

引用类型参数的传值

传递的是值的副本,但引用类型指的是"对象的地址"。因此,副本和原参数指向同一个"地址",改变"副本指向地址对象的值",意味着原参数指向对象地址的值也会改变。

示例
public class Person {
    int age;
    String name;
​
    public void show(){
        System.out.println(name);
        System.out.println(age);
    }
​
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.age = 18;
        p1.name = "张三";
        p1.show();
​
        Person p2 = new Person();
        p2.age = 20;
        p2.name = "李四";
        p2.show();
​
        Person p3 = p1;  // 指向的是p1的对象地址
        Person p4 = p1;  // 指向的是p1的对象地址
        p4.age = 66;
        p4.show();
        System.out.println(p1.age);   // 66
    }
}

垃圾回收机制(Garbage Collection)

原理和算法
  • 内存管理

    • 堆中对象的管理对象空间的分配:使用new关键字创建对象即可

    • 对象空间释放:将对象赋值null

  • 垃圾回收过程

    • 发现无用的对象

    • 回收无用对象占用的内存空间

  • 相关算法

    • 引用计数法

    • 引用可达法(跟搜索算法)

通用的分代垃圾回收机制

堆内存模型:

  • 年轻代

所有新生成对象首先放在Eden区,存储从未被垃圾回收的新对象,有用的对象放入survivor区,循环存放小于15次,大于15次就放入Tenured区中

Minor GC:清理年轻代区域

  • 年老代

年老代存放的都是一些生命周期较长的对象

Major GC:清理老年代区域

  • 永久代

Full GC:用于清理年轻代、年老代、永久代,成本高,会对系统性能造成影响

JVM调优和Full GC

以下原因可能导致Full GC:

  • 年老代(Tenured)被写满

  • 永久代(Perm)被写满

  • System.gc()被显式调用--通知虚拟机调用Full GC

  • 上一次GC后Heap的个各域分配策略动态变化

容易造成内存泄漏的操作

内存泄漏:由于某种原因程序未释放,造成内存浪费,导致运行速度慢或系统崩溃。

  • 创造大量无用对象

  • 静态集合类的使用

  • 各种连接对象(IO流对象、数据库连接对象、网络连接对象)未关闭

  • 监听器的使用

this关键字

this:当前对象本身(对象的地址)

用法
  • 普通方法中,this指向调用该方法的对象

  • 构造方法中,this指向正要初始化的对象

  • this()调用重载的构造方法中,避免相同的初始化代码,但只能在构造方法中用,并且必须位于构造方法第一句

  • this不能用于static方法中

  • this作为普通方法的"隐式参数",由系统传入方法中

public class testThis {
    int a,b,c;
​
    testThis(){
        System.out.println("正要初始化对象:" + this);
    }
    
    // 想调用testThis()的写法:
​
    testThis(int a,int b){
        this();  // 调用的是testThis(),且必须位于第一行
        // 不能写testThis()
        a = a;  // 这里指的是局部变量,而不是成员变量
        this.a = a;
        this.b = b;
    }
​
    testThis(int a,int b,int c){
        this(a,b); // 调用的是testThis(int a,int b)
        this.c = c;
    }
​
    void sing(){
​
    }
​
    void ha(){
        System.out.println("当前对象:" + this);
        this.sing();
        System.out.println("哈哈哈哈");
    }
​
    public static void main(String[] args) {
        testThis haha = new testThis(2,3);
        haha.ha();
    }
​
}

static关键字

static声明的熟悉或方法:静态变量(类变量)、静态方法(类方法)

特点
  • 为该类的公用变量,属于类,被该类的所有实例共享,在类载入时被初始化

  • static变量只有一份

  • 一般用"类名.类变量/方法"调用

  • 在static方法中不可直接访问非static的成员

public class testStatic {
    int id;
    String name;
​
    static String school = "成都信息工程大学";
    public testStatic(int id,String name){
        this.id = id;
        this.name = name;
    }
​
    public void login(){
        System.out.println(name);
    }
​
    public static void printSchool(){
       // login(); 无法调用非静态成员,会报错
        System.out.println(school);
    }
​
    public static void main(String[] args) {
        testStatic a = new testStatic(12,"张三");
        testStatic.printSchool();
        testStatic.school = "嘿嘿嘿";
        testStatic.printSchool();
    }
}

静态初始化块

  • 构造方法用于对象的普通初始化

  • 静态初始化块,用于类的初始化操作

  • 在静态初始化块中不能直接访问非static成员

注意事项

静态初始化块执行顺序:

  • 上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到类的静态初始化块为止

  • 构造方法执行顺序和上面顺序一样

public class TestStatic01 {
    static String school;
    static{
        System.out.println("111111");
        school = "2222";
        printSchool();
    }
​
    public static void printSchool(){
        System.out.println(school);
    }
​
    public static void main(String[] args) {
    }
}

变量的分类和作用域

三种类型:局部/成员/静态

核心区别:

类型声明位置从属于生命周期(作用域)
局部变量方法或语句块内部方法/语句块从声明处开始,到方法或语句块结束
成员变量类内部,方法外部对象对象创建,成员变量跟着创建,消失一样
静态变量类内部,static修饰类被加载,静态变量就有效

包机制(package、import)

包(package)相当于文件夹对于文件的作用。用于管理类、解决类的重名问题

两个要点
  • 通常是类的第一句非注释性语句

  • 包名:域名倒着写即可,再加上模块名,便于内部管理类

命名示例:

com.oracle.test;

com.dubai.zhang.test;

注意:

  • 写项目都要加包,不要使用默认包

  • com.zhang 和 com.zhang.san是两个完全独立的包,没有包含关系

JDK中的主要包
表JDK中的主要包
Java中的常用包说明
java.lang包含一些Java语言的核心类,如:String、Math、Integer、System、Thread
java.awt包含了构成抽象窗口工具集(abstract window toolkits)的多个类,被用来构建和管理应用程序的图形用户界面(GUI)
java.net包含执行与网络相关的操作的类
java.io包含能提供多种输入/输出功能的类
java.util包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数

导入类import

如果要使用其他包的类,需使用import,从而在本类中直接通过类名调用。

package com.lisi.test;
​
import com.zhangsan.test.Test01;
​
public class apple {
    
//     不import  Test01想要调用的写法:
//    com.zhangsan.test.Test01 apple = new com.zhangsan.test.Test01();
    
//    import 后的写法:
    Test01 banana = new Test01();
    
}
注意点
  • Java会默认导入java.lang包下所有的类

  • 如果导入两个同名的类,只能用包名+类名来显示调用相关类

eg:java.util.Date Date = new java.util.Date();

  • 导入一个包下所有的类,加号,eg:import java.util.*

静态导入

static import,JDK1.5新增加的功能,作用:导入指定类的静态属性和方法。

使用
package com.zhangsan.test;
​
import static java.lang.Math.*; // 导入Math类的所有静态属性
import static java.lang.Math.PI; // 导入Math类的PI属性
​
public class Staticimport {
    public static void main(String[] args) {
      System.out.println(PI); // 不用再 Math.PI
    }
}

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

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

相关文章

深入探究Shrio反序列化漏洞

Shrio反序列化漏洞 什么是shrio反序列化漏洞环境搭建漏洞判断rememberMe解密流程代码分析第一层解密第二层解密2.1层解密2.2层解密 exp 什么是shrio反序列化漏洞 Shiro是Apache的一个强大且易用的Java安全框架,用于执行身份验证、授权、密码和会话管理。使用 Shiro 易于理解的…

FittenChat:程序员写代码的最好辅助利器,没有之一

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师,大模型,爬虫、ACM算法 💒 公众号&#xff…

如何评估基于指令微调的视觉语言模型的各项能力-MMBench论文解读

1. 传统基准的固有局限 VQAv2:视觉问题回答数据集,主要用于评估视觉理解与推理能力。COCO Caption:图像描述生成数据集,用于评估模型对图像内容的理解与描述能力。GQA:结合常识的视觉问题回答数据集。OK-VQA:需要外部知识的视觉问题回答数据集。TextVQA:图像中包含文本的…

Linux系统网络的实时性评估

目录 1.使用 cyclictest 测试系统实时性2.测试系统通信实时性2.1 PingPlotter2.2 使用 ping 测试通讯实时性 3. 使用 iperf 测试带宽4.网络性能测试 1.使用 cyclictest 测试系统实时性 安装cyclictest sudo apt-get update sudo apt-get install rt-testscyclictest -p 99 -i…

TS学习01 基本类型、编译选项、打包ts代码

TS学习 TypeScript00 概念01 开发环境搭建02 基本类型基本使用⭐类型 03 编译选项tsconfig.jsoncompilerOptions语法检查相关 04 webpack打包ts代码错误解决 05 babel TypeScript BV1Xy4y1v7S2学习笔记 00 概念 以 JavaScript 为基础构建的语言 一个 JavaScript 的超集 Type…

如何使用KST指标进行多头交易,Anzo Capital一个条件设置

在之前的文章中,我们进行分享了以下知识:什么是KST指标,以及如何进行计算KST指标。有聪明的投资者就在后台进行咨询Anzo Capital昂首资本了,我们知道这些知识有什么用呢? 当然有用了,只要理解背后的逻辑知…

三层架构实验--对抗遗忘

交换配置顺序: channel vlan Trunk stp svi vrrp dhcp 绑定channel [sw1]interface e [sw1]interface Eth-Trunk 0 [sw1-Eth-Trunk0]int g 0/0/22 [sw1-GigabitEthernet0/0/22]eth-trunk 0 [sw1-GigabitEthernet0/0/23]eth-trunk 0 [sw2]interface Eth…

【语言信号增强算法研究-1】维纳滤波(Wiener Filter)

1 语音增强方法分类 2 维纳滤波的局限性 对于非线性和非高斯噪声的处理效果不佳; 对于信号和噪声的统计特性要求比较高,需要准确地了解信号和噪声的分布规律(说明自适应很差); 在处理复杂信号时,需要进行多…

副业赚钱攻略:给工资低的你6个实用建议,闷声致富不是梦

经常有朋友向我咨询,哪些副业比较靠谱且能赚钱。实际上,对于大多数打工族而言,副业不仅是增加收入的途径,更是利用业余时间提升自我、实现价值的重要方式。 鉴于此,今天我想和大家分享六个值得尝试的副业,…

sql注入---Union注入

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 学习目标 了解union注入过程中用到的关键数据库,数据表,数据列sql查询中group_concat的作用使用union注入拿到靶机中数据库里的所有用户名和密码 一. 获得数据库表名和列…

CDN流量清洗

CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率,因此CDN也用到了负载均衡技术。…

57、FreeRTOS/串口通信和DMA ADC PWM相关20240401

一、使用PWMADC光敏电阻完成光控灯的实验。(根据测得的光敏电阻大小,控制灯的亮度) 代码: /* USER CODE BEGIN 2 */HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);//打开定时器的PWM通道3HAL_TIM_PWM_Start(&htim3,TIM_CHANN…

如何写好面向新人的开发文档

前言 大家在进入公司的时候,或多或少会接触到公司或者来自前辈的文档。文档水平层次不齐,好的事无巨细,层次清晰,拉跨的可能就像正确的废话,正确的说了正确的话。文档形式也是多种多样,word、markdown、云…

【学习笔记】java项目—苍穹外卖day06

文章目录 苍穹外卖-day06课程内容1. HttpClient1.1 介绍1.2 入门案例1.2.1 GET方式请求1.2.2 POST方式请求 2. 微信小程序开发2.1 介绍2.2 准备工作2.3 入门案例2.3.1 小程序目录结构2.3.2 编写和编译小程序2.3.3 发布小程序 3. 微信登录3.1 导入小程序代码3.2 微信登录流程3.3…

详解ExecutorService 和 Executors

代码示例: ExecutorService 表⽰⼀个线程池实例. Executors 是⼀个⼯⼚类, 能够创建出⼏种不同⻛格的线程池. ExecutorService 的 submit ⽅法能够向线程池中提交若⼲个任务. ExecutorService pool Executors.newFixedThreadPool(10);pool.submit(new Runnable() {Overri…

算法系列--递归,回溯,剪枝的综合应用(1)

💕"对相爱的人来说,对方的心意,才是最好的房子。"💕 作者:Lvzi 文章主要内容:算法系列–递归,回溯,剪枝的综合应用(1) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(1) 1.全排…

Multisim14.2仿真参数的修改

本内容讲述Multisim14.2仿真参数的修改,以放大倍数修改为例说明。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易! 目录: 1、三极管放大倍数的修改 2、Uc的电压计算 1、三极管放大倍数的修改 在仿真…

2024第16届成都实验室装备展6月1日举办

2024第16届成都实验室装备展6月1日举办 邀请函 主办单位: 中国西部教体融合博览会组委会 承办单位:重庆港华展览有限公司 博览会主题:责任教育 科教兴邦 展会背景 现代高新技术与基础科学实验研究对科学仪器的先进性、稳定性、性价比等…

【BlossomRPC】接入注册中心

文章目录 NacosZookeeper自研配置中心 RPC项目 配置中心项目 网关项目 这是BlossomRPC项目的最后一篇文章了,接入完毕注册中心,一个完整的RPC框架就设计完成了。 对于项目对注册中心的整合,其实我们只需要再服务启动的时候将ip/port/servic…

2024阿里云服务器ECS u1实例性能测评_CPU内存_网络_存储

阿里云服务器u1是通用算力型云服务器,CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器,ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…