一篇文章带您了解面向对象(java)

1.简单理解面向过程编程和面向对象编程

面向过程编程:开发一个一个的方法,有数据需要处理,我们就可以调用方法来处理。

java 复制代码
package com.web.quictstart;

public class demo1 {
    public static void main(String[] args) {
        totalScore("张三", 65, 68, 35);
        averageScore("张三", 65, 68, 35);
    }

    public static void totalScore(String name, double chinese, double math, double english) {
        double total = chinese + math + english;
        System.out.println("姓名:" + name + ";" + "总分:" + total);
    }

    public static void averageScore(String name, double chinese, double math, double english) {
        double averageScore = (chinese + math + english) / 3;
        System.out.println("姓名:" + name + ";" + "平均分:" + averageScore);
    }
}

面向对象编程:开发一个一个的对象来处理数据,把数据交给对象,再调用对象的方法来完成对数据的处理。

java 复制代码
package com.web.quictstart;

public class student {
    String name;
    double chinese;
    double english;
    double math;

    public void totalScore() {
        double total = chinese + math + english;
        System.out.println(name + "总分:" + total);
    }

    public void averageScore() {
        double averageScore = (chinese + math + english) / 3;
        System.out.println(name + "平均分:" + averageScore);
    }
}
java 复制代码
package com.web.quictstart;

public class studentTest {
    public static void main(String[] args) {
        student student1 = new student();
        student1.name="张三";
        student1.chinese=90;
        student1.math=99;
        student1.english=92;

        student1.totalScore();
        student1.averageScore();
    }
}

2.面向对象编程的好处

我们可以理解世间万物都是对象。要什么功能去找谁就好了。比如要汽车的数据,去赵汽车这个对象就好了,这样更加能够符合人类的思维,让编程更加简单,更加直观。

3.对象在程序中长什么样呢?

注意:在这里,笔者借用了培训机构传智研究院的张泽华老师和徐磊老师的讲解思路,在此,笔者十分感谢两位老师的辛苦付出,帮助广大学子在编程的路上解决疑惑)其实我们可以把对象理解为一种特殊的表格,这张表格长成什么样子那就要看对象长成什么样子,我们去调用这个对象,就可以说是往这个对象里面填写表格。new 一个就有一张表格。那么这张表又从哪里来的呢?首先,我们需要先去设计这张表,类就是来设计这张表的,也就是说类是对象的设计图,类里面的变量用来说明可以处理什么数据,类里面的方法主要是用来描述对象有什么功能,也就是说对数据处理进行什么样的处理。

4.对象在计算机中的执行原理

先把类加载到方法区,执行main方法,main方法提取到栈内存中执行,new对象后,把类也加载到方法区,变量是放在方法里面的,所以会在main方法中开辟一块变量空间,new 出来的对象会放在堆内存,在堆内存里面开辟一块空间,用来代表该对象,也可以理解为这块空间是一张表。那么这个对象也就会有一个地址,然后按照类的变量和方法开辟变量空间,变量装的是默认值。除了这些还会有一个类的地址,类的地址会指向方法区的类,让后会把对象的地址交给栈内存的mian方法的对象。然后栈内存的对象按照这个地址去找栈内存的对象,然后把那些值赋值给那些默认值。

如果只是看这样的文字分析肯定是看不懂的,我们不如来画一张图来进行理解,我们用上面学生案例来进行画图。

注意:当堆内存中的对象,没有被任何变量引用(指向)时,他就会被判定为内存中的"垃圾"。

Java存在自动垃圾回收机制,会自动清除垃圾对象。

5.this

this是什么?

就是一个变量,可以用在方法中,用来指向当前对象。哪个对象调用方法,this就指向哪个对象,也就是拿哪个对象。

java 复制代码
package com.web.quictstart.this_demo;

public class Student {
    public void printThis(){
        System.out.println(this);
    }
}
java 复制代码
package com.web.quictstart.this_demo;

public class demo1 {
    public static void main(String[] args) {
        Student student1 =new Student();
        student1.printThis();
        System.out.println(student1);

        Student student2 = new Student();
        student2.printThis();
        System.out.println(student2);
    }
}

我们可以看到,this输出的地址值和调用它的对象的地址值是一样的。学生对象去调用方法的时候,它会把自己对象的地址传给这个方法的this接收,那么方法就会输出this输出的就是学生对象的地址了。

this的使用场景?

主要是用来解决:对象的成员变量与方法内部的变量名称一样的时候,导致访问冲突问题的。

java 复制代码
package com.web.quictstart.this_demo;

public class Book {
    private String name;
    private double price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

6.构造器

构造器语法:

java 复制代码
public class Student {
    /**构造器*/
    public Student(){
        ...
	}
}

构造器有什么特点?

创建对象时,对象会去调用构造器。

java 复制代码
package com.web.quictstart.constructor;

public class StudentTest {
    public static void main(String[] args) {
        Student student = new Student();

    }
}
java 复制代码
package com.web.quictstart.constructor;

public class Student {
    public Student() {
        System.out.println("无参数构造器被执行了。。。");
    }

    public Student(String name,double score){
        System.out.println("有参数构造器被执行了");
    }
}
java 复制代码
package com.web.quictstart.constructor;

public class StudentTest {
    public static void main(String[] args) {

        Student student = new Student("张三",99.8);

    }
}

构造器的常见应用场景?

创建对象时,同时完成对对象成员变量(属性)的初始化赋值。

java 复制代码
package com.web.quictstart.constructor;

public class Student {
    String name;
    double score;

    public Student() {
        System.out.println("无参数构造器被执行了。。。");
    }

    public Student(String name, double score) {
        System.out.println("有参数构造器被执行了");
        this.name = name;
        this.score = score;
        System.out.println("姓名:" + name + ":" + "成绩:" + score);
    }
}
java 复制代码
package com.web.quictstart.constructor;

public class StudentTest {
    public static void main(String[] args) {

        Student student = new Student("张三",99.8);
        
    }
}

类在设计的时候,如果没有写构造器,java会为类自动生成一个无参构造器的。

但是,如果我们定义了有参构造器,java就不会帮我们的类自动生成无参构造器了,但是还是建议写一个无参构造器。

7.封装

什么是封装?

就是说,用类设计对象处理某一个事物的数据的时候,应该把要处理的数据,以及处理这些这些数据的方法,设计到一个对象中。

封装的设计规范

合理的隐藏(private),合理的暴露(public)。

代码演示:

java 复制代码
package com.web.quictstart.constructor;

public class Student {
    private String name;
    private double score;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        if (score >= 0 && score <= 100) {
            this.score = score;
        } else {
            System.out.println("传入的分数不在范围内");
        }
    }
}
java 复制代码
package com.web.quictstart.constructor;

public class StudentTest {
    public static void main(String[] args) {

        Student student = new Student();
        student.setName("张三");
        student.setScore(-5);

        System.out.println(student.getName());
        System.out.println(student.getScore());
    }

}

8.JavaBean实体类

什么是实体类?

就是一种特殊的类,这个类的所有变量都需要私有,并且都需要对外提供相对应的get和set方法。类中必须要有一个公共的无参构造器。

java 复制代码
package com.web.quictstart.javabean;

public class Student {
    //成员变量必须私有的
    private String StudentName;
    private Integer age;
    private char sex;
    private double score;

    //必须要有一个公开的无参构造器
    public Student() {
    }

    public Student(String studentName, Integer age, char sex, double score) {
        StudentName = studentName;
        this.age = age;
        this.sex = sex;
        this.score = score;
    }

    public String getStudentName() {
        return StudentName;
    }

    public void setStudentName(String studentName) {
        StudentName = studentName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}
java 复制代码
package com.web.quictstart.javabean;

public class StudentTest {
    public static void main(String[] args) {
        Student student = new Student();
        student.setStudentName("张三");
        student.setAge(19);
        student.setScore(99.3);
        student.setSex('男');
        System.out.println(student.getStudentName());
        System.out.println(student.getAge());
        System.out.println(student.getScore());
        System.out.println(student.getSex());
    }
}

实体类的应用场景?

实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。

9.成员变量和局部变量的区别

区别 成员变量 局部变量
类中的位置不同 类中、方法外 常见于方法中
初始化值不同 有默认值,不需要初始化赋值 没有默认值,使用之前必须完成赋值
内存位置不同 堆内存 栈内存
作用域不同 整个对象 在所归属的大括号中
生命周期不同 与对象共存亡 随着方法的调用而生,随着方法的运行结束而亡

注意:本文章是笔者的学习笔记,因为笔者的能力有限,如果您在浏览或者运行代码的时候发现了问题,还请您在评论区留言,笔者在看到后会在第一时间解决,谢谢。

相关推荐
程序猿麦小七16 分钟前
今天给在家介绍一篇基于jsp的旅游网站设计与实现
java·源码·旅游·景区·酒店
Dontla27 分钟前
Rust泛型系统类型推导原理(Rust类型推导、泛型类型推导、泛型推导)为什么在某些情况必须手动添加泛型特征约束?(泛型trait约束)
开发语言·算法·rust
张某布响丸辣29 分钟前
SQL中的时间类型:深入解析与应用
java·数据库·sql·mysql·oracle
喜欢打篮球的普通人34 分钟前
rust模式和匹配
java·算法·rust
java小吕布1 小时前
Java中的排序算法:探索与比较
java·后端·算法·排序算法
慢生活的人。1 小时前
SpringSecurity+jwt+captcha登录认证授权总结
java·认证·rbac·权限·验证
Neophyte06081 小时前
C++算法练习-day40——617.合并二叉树
开发语言·c++·算法
向阳12181 小时前
LeetCode40:组合总和II
java·算法·leetcode
慕容复之巅1 小时前
基于MATLAB的条形码的识别图像处理报告
开发语言·图像处理·matlab
云空1 小时前
《InsCode AI IDE:编程新时代的引领者》
java·javascript·c++·ide·人工智能·python·php