### 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());//取值
}
}