类与对象的相关知识

目录

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

相关推荐
极客先躯11 分钟前
高级java每日一道面试题-2025年3月22日-微服务篇[Nacos篇]-Nacos的主要功能有哪些?
java·开发语言·微服务
橙色小博29 分钟前
长短期记忆神经网络(LSTM)基础学习与实例:预测序列的未来
人工智能·python·深度学习·神经网络·lstm
不知名。。。。。。。。30 分钟前
C++__list
开发语言·c++·list
SsummerC31 分钟前
【leetcode100】每日温度
数据结构·python·leetcode
仙人掌_lz43 分钟前
机器学习ML极简指南
人工智能·python·算法·机器学习·面试·强化学习
船长@Quant44 分钟前
PyTorch量化进阶教程:第六章 模型部署与生产化
pytorch·python·深度学习·transformer·量化交易·sklearn·ta-lib
叫我王富贵i1 小时前
0基础入门scrapy 框架,获取豆瓣top250存入mysql
爬虫·python·scrapy
EverestVIP1 小时前
C++动态库对外接口通过接口方式实现
开发语言·c++
Swift社区1 小时前
Swift LeetCode 246 题解:中心对称数(Strobogrammatic Number)
开发语言·leetcode·swift
巷北夜未央1 小时前
Python每日一题(13)
开发语言·python·算法