Java基础补充--面向对象编程初级部分

面向对象编程初级部分

主要包含以下内容
在这里插入图片描述

1、类和对象

在这里插入图片描述

1.1 对象内存布局

在这里插入图片描述

Java 内存的结构分析

  1. 栈: 一般存放基本数据类型(局部变量)
  2. 堆: 存放对象(Cat cat , 数组等)
    3)方法区:常量池(常量,比如字符串), 类加载信息
  3. 示意图[Cat (name, age, price)]

Java 创建对象的流程简单分析

Person p = new Person();
p.name = “jack”;
p.age = 10

  1. 先加载Person 类信息(属性和方法信息, 只会加载一次)
  2. 在堆中分配空间, 进行默认初始化(看规则)
  3. 把地址赋给p , p就指向对象
  4. 进行指定初始化, 比如p.name =”jack” p.age = 10

1.2 实例

在这里插入图片描述

2、方法

2.1、方法调用机制图

在这里插入图片描述

2.2、 成员方法的传参机制

在这里插入图片描述

1、基本的数据类型,传递的是值(值拷贝),形参的任何改变不影响实参
在这里插入图片描述
2、引用数据类型(数组):引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!

数组
在这里插入图片描述
对象【其实把对象的地址赋值给了test200】
在这里插入图片描述
3、一些特例
p = null
这里需要注意的点:在test200中,将p置空,相当于图中地址的那条线断了,然后在main中,查找p.age 时还是主栈的对象,因此p.age = 10;
在这里插入图片描述
p = new person()
这个可以理解:在Test200就是相当于新开辟了一个空间,两个空间互不影响,因此p在哪里调用,就调用哪里的p的地址。
在这里插入图片描述
4、克隆对象
在这里插入图片描述

3、递归机制图

在这里插入图片描述

4、方法重载

概念:java 中允许同一个类中,多个同名方法的存在,但要求形参列表不一致!
在这里插入图片描述

4.1 可变参数

java 允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。

public class VarParameter01 {
//编写一个main 方法
	public static void main(String[] args) {
		HspMethod m = new HspMethod();
		System.out.println(m.sum(1, 5, 100)); //106
		System.out.println(m.sum(1,19)); //20
		}
}

class HspMethod {

	public int sum(int... nums) {
		//System.out.println("接收的参数个数=" + nums.length);
		int res = 0;
		for(int i = 0; i < nums.length; i++) {
			res += nums[i];
		}
		return res;
	}
}

在这里插入图片描述

4.2 重载练习题

在这里插入图片描述
方法的重载是指:
1、在同一个类中
2、方法名相同
3、方法的形参列表不同(具体的不同表现为:类型、个数、顺序的不同才可以构成重载)
4、#比较容易忽略的一点# 与方法的返回值类型与访问权限无关
B中的参数列表和题目的方法完全一样了。

5、作用域

在这里插入图片描述
在这里插入图片描述

6、构造方法/构造器

基本语法

[修饰符] 方法名(形参列表){方法体; }

  1. 构造器的修饰符可以默认, 也可以是public protected private
  2. 构造器没有返回值
    3)方法名和类名字必须一样
  3. 参数列表和成员方法一样的规则
  4. 构造器的调用, 由系统完成

构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化
它有几个特点:

  1. 方法名和类名相同
  2. 没有返回值
  3. 在创建对象时,系统会自动的调用该类的构造器完成对象的初始化。
    在这里插入图片描述

面试题

在这里插入图片描述
实际上对象是在堆中,p只是代表对象的一个引用【通俗理解:对象的名字】
在这里插入图片描述

7、this关键字

当前情况是自己给自己又赋值了一遍,跟全局变量(属性)没有关系
在这里插入图片描述

public Dog(String name, int age){//构造器
		//this.name 就是当前对象的属性name
		this.name = name;
		//this.age 就是当前对象的属性age
		this.age = age;
		System.out.println("this.hashCode=" + this.hashCode());
}	

this本质

根据下图可以理解为:this为对象中的一个属性,分别对应在对象地址中,然后指向本对象。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36317312/article/details/123472562