目录
(2)修改Student类中的方法,然后Test类调用该方法
一、什么是java类
我们每次新建的就叫类,用class修饰的(xx.java)(源文件)
执行流程:

二、什么是java对象
java对象是堆里面的一块内存区域
1.创建对象
java
public class Test{
public static void main(String[] args){
Student s=new Student();//创建Student类的对象,对象名称叫做s
}
}
(1)第一个Student指的是数据类型,它规定数据在内存中的存储形式
(2)s是变量名/对象名,只是一个名字
(3)=:赋值操作,将堆内存中创建的内存空间的地址赋给s变量
(4)new是关键字,要求在堆内存中开辟内存空间
(5)Student()是构造器,在创建对象的时候给对象赋值
堆栈内存图

流程
(1)main入栈
(2)变量s
(3)new关键字在堆内存中开辟内存空间(这块内存空间的值的形式由当前构造器决定)
2.类与对象的关系
类与对象的关系:类是构建对象的模板
Student类
java
public class Student {
public int age=18;
public String name="张三";
public char sex='男';
public double height=170.5;
public void run(){
System.out.println("学生跑得很快");
}
public void flay(int num){
System.out.println("学生能飞"+num+"米");
}
}
Test类
java
public class Test {
public static void main(String[] args) {
Student s1=new Student();
Student s2=new Student();
String name1=s1.name;
System.out.println(name1);
String name2=s2.name;
System.out.println(name2);
}
}
输出:

现在只是写了name,换成其他变量,如age、sex等,他们两个的输出也都相同,可以得出:s1和s2这两个对象关于变量的值都是相同的,且这些值都来自Student这个类所决定,为什么?
因为类是构建对象的模板,一个类可以创建多个对象,每个对象的数据的最初来源来自类
修改Test类
java
public class Test {
public static void main(String[] args) {
Student s1=new Student();
Student s2=new Student();
s1.name="李四";
String name1=s1.name;
System.out.println(name1);
String name2=s2.name;
System.out.println(name2);
}
}
输出

原因
要想知道为什么就必须清楚类与对象的关系到底是什么,看执行流程:
类是模板,对象是真正意义上的实体
三、为什么java会设计对象
|------|---------|
| C语言 | 面向过程的语言 |
| java | 面向对象的语言 |
什么是面向过程,什么是面向对象
1.面向过程的语言--通过方法操作类里面的对象

2.面向对象的语言--方法操作对象中的数据

就是说:方法操作对象里面的数据并不能直接改变类当中的数据(不能改变类当中的数据,只能改变对象当中的数据)
3.(操作)改变数据的两种方案
Student类和Test类还是上面的两个类
(1)在Test类中直接改
java
s1.height=199;
但是这种方法仅限于height是public的情况下,用的多的还是下面这种方法
(2)修改Student类中的方法,然后Test类调用该方法
先把Student类中的flay()方法改一下:
java
public void flay(Double num){
height=num;
}
然后在Test类中调用这个方法
java
s1.flay(199.0);
4.为什么方法只改变对象中的值,不能改变类当中的数据
Student类
java
public class Student {
public double height=170.5;
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
}
Test类
java
public class Test {
public static void main(String[] args) {
Student s1=new Student();
s1.setHeight(188.0);
System.out.println(s1.getHeight());
Student s2=new Student();
System.out.println(s2.getHeight());
}
}
输出:

执行流程

可以看出操作来操作去,操作的都是s1这个对象中的数据
四、Java对象应该怎么用
程序执行第一步就是main方法入栈
1.Student类
java
public class Student {
public double height=170.5;
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
}
2.Test类
java
public class Test {
public static void main(String[] args) {
Student s1=new Student();
s1.setHeight(188.0);
System.out.println(s1.getHeight());
Student s2=new Student();
System.out.println(s2.getHeight());
}
}
3.流程


执行s1.setHeight(188.0)时,调用setHeight()方法就是setHeight()方法入栈,这里面有个变量height(局部变量),传的值是188.0

执行setHeigth()方法里的this.height=height

执行完setHeight()方法出栈,然后调用getHeight()方法并输出
五、程序的执行流程
1.Student类
java
public class Student {
public int flag;
public void run(){
if(flag==1){
System.out.println("flag=1");
}else{
System.out.println("flag=其他值");
}
}
}
2.Test类
java
public class Test {
public static void main(String[] args) {
Student s1=new Student();
Student s2=new Student();
s1.flag=1;
s2.flag=2;
s1.run();
s2.run();
}
}
3.输出

4.流程
程序执行第一步是main方法入栈,程序的执行流程就是方法的不断入栈出栈
main方法入栈,创建了s1和s2两个对象

然后执行s1.flag=1;

然后执行s2.flag=2;

然后执行s1.run();//方法操作的是对象当中的数据;输出flag=1,之后run()方法出栈
之后执行s2.run();调用0x2中的run()方法,输出flag=其他值