类和对象的创建及使用
类和对象的使用(面向对象思想落地的实现):
1.创建类,设计类的成员
2.创建类的对象
3.通过“对象.属性”或“对象.方法”调用对象的结构
先创建一个类,再创建person类的对象,并且调用。
public class PersonTest {
public static void main(String[] args) {
//2. 创建Person类的对象
Person p1 = new Person();//过程是固定的
//Scanner scanner = new Scanner(System.in);这一种也是叫做创建类的对象
//总结:创建类的对象 = 类的实例化 = 实例化类
//调用对象的结构:属性、方法
//调用属性:“对象.属性”
p1.name = "Tom";//给变量赋值
p1.isMale = true;
System.out.println(p1.name);//调用值。
//调用方法:“对象.方法”
p1.eat();//在这里就可以调用eat方法
p1.sleep();
p1.talk("Chinese");//这里的Chinese传给了方法中的talk,即language会变成Chinese输出。
}
}
//1.创建类,设计类的成员
class Person{
//属性
String name;
int age = 1;
boolean isMale;
//方法
public void eat(){
System.out.println("人可以吃饭");
}
public void sleep(){
System.out.println("人可以睡觉");
}
public void talk(String language){
System.out.println("人可以说话,使用的是:" + language);
}
}
类的多个对象的关系
public class PersonTest {
public static void main(String[] args) {
//2. 创建Person类的对象
Person p1 = new Person();
//Scanner scanner = new Scanner(System.in);
//调用对象的结构:属性、方法
//调用属性:“对象.属性”
p1.name = "Tom";
p1.isMale = true;
System.out.println(p1.name);
//调用方法:“对象.方法”
p1.eat();
p1.sleep();
p1.talk("Chinese");
//*******************************
Person p2 = new Person();
System.out.println(p2.name);//此处输出的是null,因为又新建了一个对象,所以在堆空间中有两个对象。
System.out.println(p2.isMale);
//*******************************
Person p3 = p1;
//将p1变量保存的对象地址值赋给p3,导致p1和p3指向了堆空间中的同一个对象实体。
System.out.println(p3.name);//所以此时输出的是Tom
p3.age = 10;
System.out.println(p1.age);//输出的是10,修改p3,其实就是修改p1
}
}
//1.创建类,设计类的成员
class Person{
//属性
String name;
int age = 1;
boolean isMale;
//方法
public void eat(){
System.out.println("人可以吃饭");
}
public void sleep(){
System.out.println("人可以睡觉");
}
public void talk(String language){
System.out.println("人可以说话,使用的是:" + language);
}
}
总结:如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)
意味着:如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。
JVM内存结构与对象的内存解析:
编译完源程序后,生成一个或多个字节码文件。
我们使用JVM中的类和解释器对生成的字节码文件进行
堆(Heap):
此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
通常所说的栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。方法执行完,自动释放。
方法区(MethodArea):
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
方法中的变量都是局部变量
对象的内存解析
内存解析的说明:
引用类型的变量,只可能储存两类值:null 或地址值(含变量的类型)
用上面的部分代码举例说明:
Personp1=newPerson();p1.name = "Tom";
p1.isMale =true;
Person p2 =new Person();sysout(p2.name);//null
Person p3 = p1;p3.age = 10;
第一行代码内存解析:
第二、三行代码
第四行代码
第五行输出的是null
第六行代码
第七行代码
匿名对象
1、引用类型的变量,没有显示的赋值给一个变量。即为匿名对象
2、特征:匿名对象只能用一次