问题导入
张老太养了两只猫猫:一只名字叫小白,今年 3 岁,白色。还有一只叫小花,今年 100 岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示 张老太没有这只猫猫。
问题分析
使用现有技术解决 Object01.java
- 单独的定义变量解决
- 使用数组解决
现有技术解决的缺点分析
不利于数据的管理
效率低
===》 引出我们的新知识点 类与对象
类与对象的概述
- 类是抽象的,概念的,代表一类事物,比如人类,猫类…, 即它是数据类型.
- 对象是具体的,实际的,代表一个具体事物, 即 是实例.
- 类是对象的模板,对象是类的一个个体,对应一个实例
# 问题解决
public class Object01 {
public static void main(String[] args) {
//实例化一只猫【创建一只猫对象】
Cat cat1 = new Cat();
cat1.name = "小白"; //属性 也叫成员变量,也称field(字段)
cat1.age = 28;
cat1.color = "白色";
Cat cat2 = new Cat();
cat2.name = "小黑";
cat2.age = 100;
cat2.color = "黑色";
System.out.println("第一只猫的信息:"+ cat1.name +" " + cat1.age + " " + cat1.color);
System.out.println("第二只猫的信息:"+ cat2.name +" " + cat2.age + " " + cat2.color);
}
}
class Cat {
String name;
int age;
String color;
}
对象在内存中存在形式(重要!!!)
属性
基本介绍(属性的概念)
- 从概念或叫法上看: 成员变量 = 属性 = field(字段) (即 成员变量是用来表示属性的,授课中,统一叫 属性)
- 属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)。比如我们前面定义猫类 的 int age 就是属性
public class Object02 {
public static void main(String[] args) {
}
}
class Car {
String name;
double price;
String color;
String[] master; //属性可以是 基本数据类型,也可以是引用类型(对象,数组)
}
属性的注意细节
- 属性的定义语法同变量,示例:访问修饰符 属性类型 属性名;
这里老师简单的介绍访问修饰符: 控制属性的访问范围
有四种访问修饰符 public, proctected, 默认, private ,后面会详细介绍 - 属性的定义类型可以为任意类型,包含基本类型或引用类型
- ==属性如果不赋值,有默认值,规则和数组一致。==具体说: int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,
boolean false,String null
public class PropertiesDetail {
public static void main(String[] args) {
//创建Person对象
//p1 是对象名(对象引用)
//new Person() 创建的对象空间(数据) 才是真正的对象
Person p1 = new Person();
//对象的属性默认值,遵守数组规则:
//int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null
System.out.println("\n 当前这个人的信息");
System.out.println("age=" + p1.age + " name=" + p1.name + " sal=" + p1.sal + " isPass=" + p1.isPass) ;
}
}
class Person {
//四个属性
int age;
String name;
double sal; //薪水
boolean isPass; //是否通过
}
如何创建对象
两种方法:
如何访问属性
类和对象的内存分配机制(重要!!!)
看一个思考题
我们定义一个人类(Person)(包括 名字,年龄)。
public class Object03 {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "小明";
p1.age = 10;
Person p2 = p1; // 把p1 赋给了 p2, 或说 让p2指向 p1
System.out.println(p2.age); // 10
}
}
class Person {
String name;
int age;
}
总结-对象内存分配机制
- Java 内存的结构分析
- 栈: 一般存放基本数据类型(局部变量)
- 堆: 存放对象(Cat cat , 数组等)
- 方法区:常量池(常量,比如字符串), 类加载信息
- 示意图 [Cat (name, age, price)]
- Java 创建对象的流程简单分析
- 先加载 Person 类信息(属性和方法信息, 只会加载一次)
- 在堆中分配空间, 进行默认初始化(看规则)
- 把地址赋给 p , p 就指向对象