对象内存分析及局部变量,成员变量

文章详细介绍了Java对象在内存中的分布,包括栈存储基本类型和对象引用,堆存储对象数据。提到了构造代码块的作用以及与构造方法的关系。此外,讲解了成员变量和局部变量的区别,强调了封装在面向对象编程中的重要性,包括使用private修饰属性,以及通过set和get方法来访问和修改属性值。
摘要由CSDN通过智能技术生成


### 1.对象的内存分析
| 区域的名字 | 作用                                                   |
| ---------- | ------------------------------------------------------ |
| 寄存器     | 给CPU使用的,和开发没有关系                            |
| 本地方法栈 | JVM在执行操作系统的时候会使用,和咱们没有关系          |
| 方法区     | 存储的是字节码文件   class文件                         |
| 堆区域     | 存储对象或者数组的数据,凡是 new的东西和堆有关         |
| 栈区       | 存储的是八大基本数据类型的数据和对象的引用(内存地址) |

栈:存储的是八大基本数据类型的数据和对象的引用(内存地址)

​	int a = 20;    a   20  都存在栈区了

​	Peson person = new Person();   栈 存的是dog的内存地址

堆:

​	对象的真实的数据    二哈     12



[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S6xnBPhd-1680353604112)(1.png)]

### 	2.构造代码块【开发不用】

> 现在开发不用了,以后会讲一个叫静态代码块的
>
> 构造代码块的目的:也是可以对对象的属性进行赋值。功能是和构造方法是一样的
>
> 语法格式:
>
> ```
> {
> 	语句体
> }
> ```
>
> 1.写在实体类中
>
> 2.只要实例化一个对象 以后,就会先执行构造代码块,然后再执行构造方法

```Java
package com.qf.test;

class Dog {

	String name;
	int age;

	// 构造代码块
	{
		System.out.println("嘻嘻");
		this.name = "佩琪";
		this.age = 12;
	}

	// 无参构造方法
	public Dog() {
		this.name = "乔治";
		this.age = 10;
	}
	//有参的构造方法
	public Dog (String name, int age) {
		this.name = name;
		this.age = age;
	}
	

}

public class Demo2 {
	public static void main(String[] args) {
		// 只要实例化一个对象 以后,就会先执行构造代码块,然后再执行构造方法
		Dog dog = new Dog();
		System.out.println(dog.name);
		System.out.println(dog.age);
		
		Dog dog1 = new Dog("老八", 28);
		System.out.println(dog1.name);
		System.out.println(dog1.age);
	}
}

3.成员变量和局部变量

3.1局部变量

变量的作用域的问题, 方法a中一个变量,能不能再方法b中使用? 不能

package com.qf.test;

public class Demo3 {
	public static void main(String[] args) {
		//int i = 20;
		for (int i = 0; i < args.length; i++) {//int i = 0;  局部变量
			System.out.println(i);
			for (int j = 0; j < args.length; j++) {//{}是作用域
				
			}
			for (int j = 0; j < args.length; j++) {
				
			}
		}
		//System.out.println(i);
	}
	
	public  static void test () {//
		int i = 10;
		int a;//先声明变量 没有赋值的
		System.out.println(i);
		//System.out.println(a);//局部变量在使用的时候要赋值的
	}
	public  static void test1 () {
		int i = 10;
		System.out.println(i);
	}
	
}

3.2成员变量

定义在实体类中的大括号的里面,也叫属性

package com.qf.test;

class Person1 {
	
	//属性====》 成员变量  作用域是 整个类都可以使用的
	String name;
	int age;
	public Person1() {
		System.out.println(name);//null   成员变量可以先不赋值,提供一个默认值
	}
	
	public void test () {
		System.out.println(age);//0
	}
	
	
}
public class Demo4 {
	public static void main(String[] args) {
		Person1 person1 = new Person1();
		person1.test();
		
	}
}

3.3成员变量和局部变量区别
区别成员变量局部变量
定位位置类的大括号的后面 也叫属性定义在方法体中
作用描述一个类的属性或者特征的在方法体中保存变量的值的
初始化的值有默认的初始值String=>null int ==>0没有默认的值使用的时候一定要赋值
作用域作用整个类只能在当前方法中使用

回顾

1.对象内存分析
	栈中存的是  八大基本数据类I型和对象的引用(内存地址)
	堆中存的是  对象的真实的值
	
2.构造代码块
	{
	
	}
	构造代码块先于构造方法执行
3.成员变量和局部变量
	

4.封装【重点】

Java是面向对象的三大特征 ,就是把对象的属性和操作(服务) 结合起来变成一个整体,并尽可能的去隐藏内部的信息

Java封装 对属性的封装, 对方法的封装 , 对类的封装

今天主要讲属性的封装:

之前写的属性 String name; int age;。只需要通过对象.name 赋值和取值即可,这样的话存在一定隐患的。

现在咱们对属性进行封装:

​ 1.为每个属性加上一个修饰符 private (私有的)

​ 2.在实体类中,书写相对应的set方法和get方法 进行操作

package com.qf.test;


class People {
	//对象属性进行封装  加private关键字
	private String name;
	private int age;
	
	//借助于set(设置)方法对属性进行赋值
	//有一定规则的:  set方法 (设置值的时候) 没有返回值的  void
	//setName  为啥叫?setName    set+ 变量的名字 作为咱们方法的名字 采用小驼峰的命名规则
	public void  setName (String name) {//此时 name = "黑蛋儿"
		this.name = name;// this.name = "黑蛋儿";
	}
	//借助于get(得到)方法对属性进行取值  得有返回值的
	public String getName () {
		return this.name;
	}
	
	public void setAge (int age) {
		this.age = age;
	}
	
	public int getAge () {
		return age;
	}
	
	
	
	
}
public class Demo5 {
	public static void main(String[] args) {
		People people = new People();
		//结果发现报错了   私有的变量只能在本类中使用,出了这个类无法使用  咋办?
	
		people.setName("黑蛋儿");//会赋值给 第12行的方法的形参name
		//以上代码已经将"黑蛋儿"  赋值给对象的name
		people.setAge(18);
		//取值
		System.out.println("people的名字为:"+people.getName());
		System.out.println("people的年龄为:"+people.getAge());
	}
}

package com.qf.test;


class Student {
	private String name;
	private int age;
	
	public void setName (String name) {
		this.name = name;
	}
	
	public String getName () {
		return name;
	}
	
	//看年龄
	public void setAge (int age) {//age 是 student1.setAge(12);  12 是实参赋值给形参 age
		if (age > 0 && age <=120 ) {
			this.age = age;
		} else {
			this.age = 0;
		}
	}
	public int getAge () {
		return age;
	}
	
}
public class Demo6 {
	public static void main(String[] args) {
		Student student1 = new Student();
		student1.setAge(130);
		System.out.println(student1.getAge());
	}
}

set方法和get方法可以使用快捷键

package com.qf.test;


class Teacher {
	private String name;//名字
	private int age;//年龄
	private char sex;//性别
	private double salary;//月薪
	private double height;//身高
	private double weight;//体重
	
	
	 //快捷键  右键-》source->Generate Getters and Setters...
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public char getSex() {
		return sex;
	}
	public void setSex(char sex) {
		this.sex = sex;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	
	
}
public class Demo7 {
	public static void main(String[] args) {
		Teacher teacher = new Teacher();
		teacher.setName("骚磊");
		System.out.println(teacher.getName());
	}
}

案例:

一个类中要对属性进行封装

要求有有参构造方法

要求有set和get方法

对属性进行赋值 和取值

想一个问题: 有参构造方法是对属性进行赋值的,但是set方法也是赋值的 用哪个?想用谁用谁

package com.qf.test;

class BeautifulGirl {
	//成员变量    用来存储数据
	private String name;//姓名
	private int age;//年龄
	private double weight;//体重
	private double height;//身高
	private String color;//肤色
	
	//无参构造  创建对象的时候 可以借助于无参构造方法
	public BeautifulGirl() {
		
	}
	//有参构造  建对象的时候 可以借助于有参构造方法    对属性(成员变量)进行赋值
	public BeautifulGirl(String name, int age, double weight, double height, String color) {
		this.name = name;
		this.age = age;
		this.weight = weight;
		this.height = height;
		this.color = color;
	}
	//get方法   对变量进行取值
	public String getName() {
		return name;
	}
	//set方法  对变量进行赋值的
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	
	
	
	
}
public class Demo8 {
	public static void main(String[] args) {
		//要么使用有参的进行赋值
		BeautifulGirl bg = new BeautifulGirl("刘亦菲", 28, 280, 280, "yellow");
		//要么使用set方法进行赋值
		bg.setName("蔡徐坤");
		System.out.println(bg.getName());//取值
		
	}
}

练习:

​ 声明一个产品

​ 属性: 产品名字 产品 价格 产品图片 产品类别 产品促销价

​ 要求 私有话成员变量 提供一个无参构造 提供一个有参构造

​ 使用有参构造方法进行赋值,然后通过get方法取值所有 要求打印在一行

​ 不能使用快捷键

作业:

1.今天的东西务必要吃透特别是封装  要会自己手写 set和get方法 并理解代码执行
2.总结
3.两篇博客

8 {
public static void main(String[] args) {
//要么使用有参的进行赋值
BeautifulGirl bg = new BeautifulGirl(“刘亦菲”, 28, 280, 280, “yellow”);
//要么使用set方法进行赋值
bg.setName(“蔡徐坤”);
System.out.println(bg.getName());//取值

}

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值