面向对象(二)——类和对象(上)

embedded/2024/12/5 3:25:33/

1 类的定义

做了关于对象的很多介绍,终于进入代码编写阶段。

本节中重点介绍类和对象的基本定义,属性和方法的基本使用方式。

【示例】类的定义方式

java">// 每一个源文件必须有且只有一个public class,并且类名和文件名保持一致!
public class Car { 
}
class Tyre { // 一个Java文件可以同时定义多个class
}
class Engine {
}
class Seat {
}

对于一个类来说,有三种成员:属性field、方法method、构造器constructor(下面说)。

1 属性(field 也叫成员变量)

属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。

在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化

在这里插入图片描述

属性定义格式

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

2 方法

**方法用于定义该类或该类实例的行为特征和功能实现。**方法是类和对象行为特征的抽象。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。

java">[修饰符] 方法返回值类型 方法名(形参列表) {// n条语句
}

编写简单的学生类

java">public class SxtStu {//属性(成员变量,静态数据)int id;String sname;int age;    //方法(动态行为)void study(){System.out.println("我正在学习!");}   //构造方法SxtStu(){}
}

2 构造方法(构造器 constructor)

构造器用于对象的初始化,而不是创建对象!

构造方法是负责初始化(装修),不是建房子

在这里插入图片描述

声明格式:

java">[修饰符] 类名(形参列表){ //n条语句}

构造器4个要点:

  • 构造器通过new关键字调用!!
  • 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值。
  • 如果我们没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已定义则编译器不会自动添加!
  • 构造器的方法名必须和类名一致!

3 构造方法的重载

java">public class User {int id; // idString name; // 账户名String pwd; // 密码public User() {}public User(int id, String name) {this.id = id;this.name = name;}public User(int id, String name, String pwd) {this.id = id;this.name = name;this.pwd = pwd;}public static void main(String[ ] args) {User u1 = new User();User u2 = new User(101, "xx");User u3 = new User(100, "xxx", "123456");        }
}

新手雷区

如果方法构造中形参名与属性名相同时,需要使用this关键字区分属性与形参。
this.id 表示属性id;   id表示形参id以后代码写多了,可以右键类名,选构造器快捷键直接生成,按shift多选

4 参数传值机制

在这里插入图片描述

Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。 也就是说,我们得到的是“原参数的复印件,而不是原件”。

· 基本数据类型参数的传值

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

· 引用类型参数的传值

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

java"> Person p3 = p1;Person p4 = p1;//址传递p4.age = 80;//相当于p1.age=80System.out.println(p1.age);//打印80

(*) JAVA虚拟机内存模型概念

学习内存模型是为了更好理解面向对象

堆和方法区只有一份,但一个线程对应一个栈

在这里插入图片描述

我们前面做过的内存分析过程:

在这里插入图片描述

Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。

虚拟机栈(简称:栈)的特点如下:

  1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
  2. JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
  3. 栈属于线程私有,不能实现线程间的共享!
  4. 栈的存储特性是“先进后出,后进先出
  5. 栈是由系统自动分配,速度快!栈是一个连续的内存空间!

堆的特点如下:

  1. 堆用于存储创建好的对象和数组(数组也是对象)
  2. JVM只有一个堆,被所有线程共享
  3. 堆是一个不连续的内存空间,分配灵活,速度慢!
  4. 堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。

在这里插入图片描述

方法区(也是堆)特点如下:

  1. 方法区是JAVA虚拟机规范,可以有不同的实现。
    • JDK7以前是“永久代”
    • JDK7部分去除“永久代”,静态变量、字符串常量池都挪到了堆内存中
    • JDK8是“元数据空间”和堆结合起来。
  2. JVM只有一个方法区,被所有线程共享!
  3. 方法区实际也是堆,只是用于存储类、常量相关的信息!
  4. 用来存放程序中永远是不变或唯一的内容。(类信息【Class对象,反射机制中会重点讲授】、静态变量、字符串常量等)
  5. 常量池主要存放常量:如文本字符串、final常量值。

(*) 程序执行过程内存分析

java">public class Person {String name;int age;public void show(){System.out.println(name);}
public static void main(String[ ] args) {// 创建p1对象Person p1 = new Person();p1.age = 24;p1.name = "张三";p1.show();// 创建p2对象Person p2 = new Person();p2.age = 35;p2.name = "李四";p2.show();Person p3 = p1;Person p4 = p1;p4.age = 80;System.out.println(p1.age);}
}

在这里插入图片描述

1 加载类——>类的信息,方法,常量池,static属性和方法

2 main 函数入口——>main方法——>调用栈帧(三个局部变量)

3 Person p1 = new Person();——>new Person();调用构造方法创建对象,对象放堆里

在这里插入图片描述

4 栈执行完消失,把对象地址0x11给怕p1

5 p1.age = 24; p1.name = “张三”;执行这两步

在这里插入图片描述

6 p1.show——>方法调用栈帧,无参方法但是默认有this,(为了无参方法里面的(name))

在这里插入图片描述

7 同样的步骤,把对象0x12地址赋给p2


http://www.ppmy.cn/embedded/143070.html

相关文章

增删改查文档

列表 : 列表包含 : 模糊查找 分页 列表jsp页面 : 一 :导入外部文件 (举例 : 用户点进来就可以看到菜单,这是预加载属于,使用文档就绪函数实现) 二 : body 上 ① : 文档就绪函数 ${ function() //获取条件查询的字段 //组装对象 //调用文档就绪函数 } ② : 封装ajax方…

两个用来刷新Windows环境变量让会话即时生效的刷新脚本分享

环境变量刷新脚本:RefreshEnv.bat 和 RefreshEnv.ps1 在Windows系统中,环境变量对于程序的正常运行至关重要。当安装新软件或修改系统设置后,环境变量可能会发生变化,但这些变化通常需要重启命令提示符或PowerShell会话才能生效。为了解决这个问题,我们提供了两个脚…

Qt 面试题复习10~12_2024-12-2

Qt 面试题 28、Qt 如果一个信号的处理方法一直未被执行有哪些可能性29、Qt 三大核心机制30、虚函数表31、什么是Qt事件循环 ?32、纯虚函数和普通的虚函数有什么区别33、Qt 的样式表是什么?34、描述Qt的TCP通讯流程35、自定义控件流程36、什么是Qt的插件机…

Elasticsearch 进阶

核心概念 索引(Index) 一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母),并且当我们要对这个索…

早鸟票开启:2025年计算机应用、图像处理与视觉算法国际学术会议(CAIPVA2025)

#学术会议早知道##早鸟价优惠# 2025年计算机应用、图像处理与视觉算法国际学术会议(CAIPVA2025) 2025 International Conference on Computer Applications, Image Processing, and Vision Algorithms 重要信息 会议地点:中国昆明 会议时…

Java 单例模式:深度解析与应用

在软件开发领域,设计模式是解决常见设计问题的有效方案,而单例模式作为创建型设计模式中的一员,其重要性不容小觑。它能够确保一个类仅有一个实例,并提供全局访问点,这一特性在资源管理、配置信息读取、线程池管理以及…

数据结构:链表进阶

链表进阶 1. ArrayList的缺陷2. 链表2.1 链表的概念及结构2.2 链表的实现 3.链表面试题4.LinkedList的使用5.1 什么是LinkedList4.2 LinkedList的使用 5. ArrayList和LinkedList的区别 1. ArrayList的缺陷 通过源码知道,ArrayList底层使用数组来存储元素&#xff1…

CentOS7 虚拟机 双网卡绑定

一、网卡绑定模式 模式类型特点mode0round-robin(平衡轮询策略)基于per packet方式,轮询往每条链路发送报文。提供负载均衡和容错的能力,当有链路出问题,会把流量切换到正常的链路上。交换机端需要配置聚合口。mode1a…