类与对象的概述
把一类事物的特性提取出来 =》形成类(属性,行为)=》对象是类的具体化(具体事物)
如:把猫的特性提取出来 ===》形成猫类 ===》对象是(如大白猫,就是具体的一只猫)
注意:从猫类到对象,就是创建一个对象或称为实例化一个对象或称为把类实例化
类与对象的区别和联系
- 类是抽象的,概念的,代表一类事物,比如人类,猫类等,即它是数据类型(引用数据类型)
- 对象是具体的,实际的,代表一个具体的事物,即是实例
- 类是对象的模板,对象是类的一个个体,对应一个实例
快速入门代码
public class Object01 {
public static void main(String[] args) {
//入门代码:使用OOP面向对象解决
//实例化一只猫【创建一只猫对象】
//如: new Cat();创建一只猫,创建的对象空间(数据)才是真正的对象
//Cat cat1 = new Cat();把创建的猫赋给cat1,cat1代表就是一个对象,也就是对象的引用
//cat1是对象(对象引用)
Cat cat1 = new Cat();
cat1.age=18;
cat1.name="海康";
cat1.color="白色";
System.out.println(cat1.name+"\t"+cat1.age+"\t"+cat1.color);
}
}
class Cat {
public int age;//年龄
public String name;//名字
public String color;//颜色
}
在JVM
的内存中对象存在形式
在这里插入图片描述
**属性(属性可称为成员变量或字段)**是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,字符串,数组)
注意:字符串是在方法区的常量池中存储的
只要有数据就一定有地址
注意事项和细节说明
- 属性的定义语法同变量,示例:访问修饰符
(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 Object02_属性的注意事项 {
public static void main(String[] args) {
//new Person();是创建一个对象,在堆中
//person1是对象的引用(就是对象名称,代表一个对象)
Person person1 = new Person();
System.out.println("个人信息如下:");
//在没有赋值时,有默认值:int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null
System.out.println(person1.age+"\t"+person1.name+"\t"
+person1.salary+"\t" +person1.isPass);
/*
* 返回值:
* 个人信息如下:
* 0 null 0.0 false
* */
}
}
class Person{
//四个属性
public int age;
public String name;
public double salary;
public boolean isPass;
}
如果创建对象
-
先声明再创建
Cat cat;//声明对象cat cat = new Cat();//创建
-
直接创建
Cat cat = new Cat();
如何访问属性
基本语法:
对象名.属性名
如:
cat.name cat.age cat.color
类和对象的内存分配机制(重点必须掌握)
我们定义一个(Person)(字段field有:名字,年龄)
Person p1 = new person();
p1.age=10;
p1.name="小明";
Person p2 = p1;//同时让P2也指向P1
System.Out.println(p2.age);
请问:p2.age究竟是多少?并画出内存图:
类创建的顺序:
1.加载Person类信息(主要是1.属性信息,2.方法信息),不论创建多少次对象,加载类信息只加载一次
2.在堆中创建一个对象(就是开辟一块内存空间)并对象属性的值进行默认处理
3.将堆的地址赋给p1(也就是0X0011)
4.通过地址找到堆中的属性进行赋值
5.如果属性是引用数据类型,则会在常量池中开辟空间存放数据,并将地址赋给堆中的属性
JAVA内存的结构分析
- 栈:一般存放基本数据类型(局部变量)
- 堆:存放对象(Cat cat,数组等)
- 方法区:常量池(常量,比如字符串),类加载信息
JAVA创建对象的流程简单分析
Person p = new Person();
p.name="haikang";
p.age=10;
步骤:
1.先加载Person类信息(属性和方法信息,只会加载一次)
2.在堆中分配空间,进行默认被始化(int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null)
3.把堆中地址赋给p,p就指向该对象
4.进行指定初始化,如p.name="haikang",p.age=10
练习:并分析画出内存布局图,进行分析
分析一段代码,会输出什么信息
Person p = new Person();
a.age=10;
a.name="小明";
Person b;
b=a;
System.Out.println(b.name);//小明
b.age=200;
b.null;
System.Out.print(a.age);//200
System.Out.print(b.age);//抛出异常
注意:由于b=null
,再输出b.age时,由于b没有指向对象,直接抛出异常NullPointerException
public class Object03 {
public static void main(String[] args) {
Person a = new Person();
a.name="小明";
a.age=10;
Person b;
b=a;
System.out.println(b.name);
b.age=200;
b=null;
System.out.println(a.age);
System.out.println(b.age);
/**
* 返回值:
* 小明
* 200
* Exception in thread "main" java.lang.NullPointerException
*/
}
}
class Person{
public int age;
public String name;
}