Java入门基础-07面向对象编程

Java入门基础-07面向对象编程

本章知识点总结于黑马程序员的视频课程:《Java入门基础课程》,是对上课做的笔记

Java入门基础课程视频地址

上一章: Java入门基础-06编程案例


前言

本章是Java入门基础的重点内容之一

一、深刻认识面向对象

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

1、面对对象编程的好处?

  • 符合人类思维习惯,编程更简单、更直观

如:汽车的数据,我们会找汽车这个对象来处理;手机的数据,我们会找手机这个对象来处理;学生的数据,我们会找学生这个对象来处理。

2、程序中的对象到底是个啥?如何得到?

  • 对象本质上是一种特殊的数据结构。
  • 对象是用类new出来的,有了类就可以创建出对象。
  • 格式:类名 对象名 = new 类名 () ;
  • public class 类名{
    1、变量,用来说明对象可以处理什么数据。
    2、方法,描述对象有什么功能,也就是可以对数据进行什么样的处理。

    }

在这里插入图片描述

3、对象是怎么出来的?

  • class也就是类,也称为对象的设计图(或者对象的模板)。

在这里插入图片描述

二、对象在计算机中的执行原理

1、对象在计算机中的执行原理是怎么回事?

  • 识别引用类型的变量:Student s1 = new Student ();
  • 每次new Student()= new Student (),就是在堆内存中开辟一块内存区域代表一个学生对象。
  • s1变量里面记住的是学生对象的地址。
  • s1变量中存储的是对象的地址,因此变量s1也称为引用类型的变量。

三、类和对象的一些注意事项

1、类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如:Student、Car…

2、类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为)。

3、成员变量本身存在默认值,在定义成员变量时,一般来说不需要赋初始值(没有意义)。

在这里插入图片描述

4、一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类名必须称为代码文件名。

在这里插入图片描述
在这里插入图片描述

5、对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响了。

类Student.Java 的代码:

package com.itheima.day09;

public class Student {
    String name; // 姓名
    double chinese; // 语文成绩
    double math; // 数学成绩
    public void printTotalScore(){
        System.out.println(name + "的各科学科总分为:" + (chinese + math));
    }

    public void printAverageScore(){
        System.out.println(name + "的各科学科平均分为:" + (chinese + math) / 2.0);
    }
}


测试 Test.java 的代码:

package com.itheima.day09;

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "小一";
        System.out.println("此时s1的名字为:" + s1.name);

        // 把学生类型的变量s1赋值给学生类型的变量s2
        Student s2 = s1;
        s2.name = "小二";

        System.out.println("此时s1的名字为:" + s1.name);
    }
}

运行结果为:
在这里插入图片描述

6、如果某个对象没有一个变量引用它,则该对象无法被操作了,该对象会成为所谓的垃圾对象。Java存在自动垃圾回收机制,会自动清除掉垃圾对象。

四、this

  • this就是一个变量,可以用在方法中,来拿到当前对象。

示例:

Student.java 代码:

package com.itheima.day09.This;

public class Student {
    public void printThis(){
        System.out.println(this);
    }
}

Test.java 代码:

package com.itheima.day09.This;

public class Test1 {
    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println(s1); // 打印的是地址
        s1.printThis();

        System.out.println("----------------");

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

运行结果:

在这里插入图片描述

**this应用场景:**this主要用来解决:变量名称冲突问题的。

示例:
Student.java 代码:

package com.itheima.day09.This02;

public class Student {
    String name;
    double score;

    public void checkPass(double score){
        if (this.score >= score){ // 此时this.score 拿的是s1 的成绩; 而后面的score拿的是我们放入checkPass(60)里面的。
            System.out.println(name + "恭喜您,及格了~");
        }else {
            System.out.println(name + "很遗憾,您没有及格~");
        }
    }
}


Test.java 代码:

package com.itheima.day09.This02;

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "小黑";
        s1.score = 67;
        s1.checkPass(60); // 输入判断的标准

        Student s2 = new Student();
        s1.name = "小白";
        s1.score = 57;
        s1.checkPass(60);
    }
}

运行结果:

在这里插入图片描述

this关键字是什么?

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

this关键字在实际开发中常用来干啥?

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

五、构造器

构造器的样子:

	public class Student {
    /**
     构造器*/
    public Student(){
        
    }

构造器有什么特点?

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

Test.java代码:


	public class Test {
    public static void main(String[] args) {
        Student s = new Student("波仔", 78);

        Student s1 = new Student();
        s1.name = "潘妞";
        s1.score = 69;
    }
}

Student.java

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;
    }
}

运行结果:

在这里插入图片描述

构造器的常见应用场景: 创建对象时,同时完成对象成员变量(属性)的初始化值。

构造器在哪里调用?我们常用它来干嘛?

  • 对象创建时,我们可以指定对象去调用哪个构造器执行。
  • 构造器常用于完成对象初始化(常见的应用场景是完成对象的成员变量的初始化赋值)

构造器的注意事项:

  • 类在设计时,如果不写构造器,Java会为类自动生成一个无参构造器的。
  • 一旦定义了有参构造器,Java就不会帮我们的类自动生成无参构造器了,此时就建议自己手写一个无参构造器出来了。

六、封装

面向对象的三大特征:封装、继承、多态

什么是封装?

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

封装的设计规范:合理隐藏、合理暴露

  • 合理隐藏:不让外界直接访问,即对外隐藏,只有内部才能访问,一般用 private修饰符修饰,一般为成员变量。
  • 合理暴露:让外界直接访问,内部外部都可以调用,一般用 public修饰符修饰,一般为成员方法。
  • 成员变量是在类中定义的变量。局部变量是在方法中定义的变量。
  • 成员方法对应类中定义的方法。

代码示例
Student.java (类) 代码:

public class Student {
    private double score; // 对score进行合理隐藏

    /* 因为对score进行了私有化,所以外界无法调用与赋值,所以我们得设计getset方法,
       让外界调用这两个方法对score进行调用与赋值。
     */

    // set方法 ,可以在里面添加判断是否可以赋值的条件。
    public void setScore(double score){
        if (score >= 0 && score <= 100){
            this.score = score;
        }else {
            System.out.println("数据非法。");
        }
    }

    // get方法,用于外界调用score变量的值。
    public double getScore(){
        return score;
    }

}

Test.java 代码:

	public static void main(String[] args) {
        Student s1 = new Student();
        s1.setScore(-19);
        System.out.println(s1.getScore()); // 输出默认值 0.0

        Student s2 = new Student();
        s2.setScore(289);
        System.out.println(s2.getScore()); // 输出默认值 0.0

        Student s3 = new Student();
        s3.setScore(89);
        System.out.println(s3.getScore());
    }

运行结果:

在这里插入图片描述

七、实体JavaBean(实体类)

什么是实体类?

  • 就是一种特殊的类。
    特点:仅仅只是一个用来保存数据的Java类,可以用它创建对象,保存某个事物的数据。

要求:

  1. 这个类中的成员变量都要私有,并且要对外提供相应的getXXX,setXXX方法。
    2.类中必须要有一个公共的无参构造器。

实体类有啥应用场景?

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

快捷生成有参无参构造器,以及生成getset方法。
在这里插入图片描述

JavaBean示例:
Student.java :

public class Student {
    // 1. 这个类中的成员变量都要私有,并且要对外提供相应的getXXX,setXXX方法。
    private double score; 
    private String name;

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public String getName() {
        return name;
    }

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

    // 2.类中必须要有一个公共的无参构造器。

    public Student() {
    }

    public Student(double score, String name) {
        this.score = score;
        this.name = name;
    }

StudentOperator.java :

package com.itheima.day07.encapsulation;
    //        学生操作类
public class StudentOperator {
    private Student student;

    public StudentOperator(Student student) {
        this.student = student;
    }
    
    public void printPass(){
        if(student.getScore() >= 60){
            System.out.println(student.getName() + "学生成绩及格。");
        }else {
            System.out.println(student.getName() + "学生成绩不及格。");
        }
    }
}

Test.java :

    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setScore(79);
        s1.setName("小黑");
        System.out.println(s1.getName());
        System.out.println(s1.getScore());

        StudentOperator operator = new StudentOperator(s1);
        operator.printPass();
    }

运行结果:

在这里插入图片描述

八、面向对象编程综合案例-模仿电影信息系统

需求:

  • 展示系统中的全部电影(每部电影展示:名称、价格)
  • 允许用户根据编号(id)查询出某个电影的详细信息。

电影数据:
名称,价格,导演,主演,其他信息
1,“水门桥”, 38.9, 9.8, “徐克”, “吴京”, “12万人想看”
2,“出拳吧”, 38.9, 9.8, “唐晓白”, “田雨”, “3.5万人想看”
3,“月球陨落”, 38.9, 9.8, “罗兰”, “贝瑞”, “17.9万人想看”
4,“一点就到家”, 38.9, 9.8, “许宏宇”, “刘昊然”, “10.8万人想看”

Movie.java:

package com.itheima.day07.encapsulation;

public class Movie {
    private int id;
    private String name;
    private double price;
    private double score;
    private String director;
    private String actor;
    private String info;

    public Movie() {
    }

    public Movie(int id, String name, double price, double score, String director, String actor, String info) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.score = score;
        this.director = director;
        this.actor = actor;
        this.info = info;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public String getDirector() {
        return director;
    }

    public void setDirector(String director) {
        this.director = director;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
}

MovieOperator.java:

package com.itheima.day07.encapsulation;

public class MovieOperator {
    private Movie[] movies;

    public MovieOperator(Movie[] movies) {
        this.movies = movies;
    }

    /** 1.展示系统的全部电影信息*/
    public void printAllMovie(){
        System.out.println("=======系统全部电影信息如下========");
        for (int i = 0; i < movies.length; i++) {
            Movie m = movies[i];
            System.out.println("编号:" + m.getId());
            System.out.println("价格:" + m.getPrice());
            System.out.println("评分:" + m.getScore());
            System.out.println("---------------------------");
        }
    }

    /**2.允许用户根据编号(id)查询出某个电影的详细信息。*/
    public void searchMovie(int id){
        for (int i = 0; i < movies.length; i++) {
            Movie m = movies[i];
            if (m.getId() == id){
                System.out.println("该电影详情如下:");
                System.out.println("编号:" + m.getId());
                System.out.println("名称:" + m.getName());
                System.out.println("价格:" + m.getPrice());
                System.out.println("评分:" + m.getScore());
                System.out.println("导演:" + m.getDirector());
                System.out.println("主演:" + m.getActor());
                System.out.println("其他信息:" + m.getInfo());
                return;
            }
        }
        System.out.println("没有该电影信息");
    }
}

MovieTest.java:

package com.itheima.day07.encapsulation;

import java.util.Scanner;

public class MovieTest {
    public static void main(String[] args) {
        Movie[] movies = new Movie[4];
        movies[0] = new Movie(1,"水门桥", 38.9, 9.8, "徐克", "吴京", "12万人想看");
        movies[1] = new Movie(2,"出拳吧", 38.9, 9.8, "唐晓白", "田雨", "3.5万人想看");
        movies[2] = new Movie(3,"月球陨落", 38.9, 9.8, "罗兰", "贝瑞", "17.9万人想看");
        movies[3] = new Movie(4,"一点就到家", 38.9, 9.8, "许宏宇", "刘昊然", "10.8万人想看");

        MovieOperator operator = new MovieOperator(movies);

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("======电影信息系统======");
            System.out.println("1.查询全部电影信息");
            System.out.println("2.根据id查询某个电影的详细信息");
            System.out.println("请您输入操作指令:");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    operator.printAllMovie();
                    break;
                case 2:
                    System.out.println("请输入您查询电影的id:");
                    int id = sc.nextInt();
                    operator.searchMovie(id);
                    break;
                default:
                    System.out.println("您输入的指令不存在,请重新输入:");
            }
        }
    }
}

运行结果:

在这里插入图片描述
在这里插入图片描述

补充知识:成员变量、局部变量的区别

在这里插入图片描述

总结

以上就是今天要讲的内容,本章知识点有面向对象简单的介绍,对象在计算机中的执行原理,类和对象的一些注意事项,还有this的使用场景与方法,构造器,封装,实体类JavaBean,综合示例-模仿电影信息系统,以及最后的补充知识:成员变量、局部变量的区别。

下一章:Java入门基础-08常用API

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值