类与对象的相关知识

目录

一、什么是java类

二、什么是java对象

1.创建对象

堆栈内存图

流程

2.类与对象的关系

Student类

Test类

输出:​编辑

修改Test类

输出

原因

三、为什么java会设计对象

1.面向过程的语言--通过方法操作类里面的对象

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

3.(操作)改变数据的两种方案

(1)在Test类中直接改

(2)修改Student类中的方法,然后Test类调用该方法

4.为什么方法只改变对象中的值,不能改变类当中的数据

Student类

Test类

输出:

执行流程

四、Java对象应该怎么用

1.Student类

2.Test类

3.流程

五、程序的执行流程

1.Student类

2.Test类

3.输出

4.流程


一、什么是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=其他值

相关推荐
wjs20242 小时前
状态模式(State Pattern)
开发语言
我命由我123452 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
liulilittle2 小时前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
im_AMBER3 小时前
学习日志19 python
python·学习
励志要当大牛的小白菜4 小时前
ART配对软件使用
开发语言·c++·qt·算法
mortimer6 小时前
安装NVIDIA Parakeet时,我遇到的两个Pip“小插曲”
python·github
@昵称不存在6 小时前
Flask input 和datalist结合
后端·python·flask
爱装代码的小瓶子6 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
赵英英俊7 小时前
Python day25
python
东林牧之7 小时前
Django+celery异步:拿来即用,可移植性高
后端·python·django