JAVA SE基础《八》 ---- 面对对象编程

目录

一、面向对象编程快速入门

二、深刻认识面向对象

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

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

五、其他语法:this

六、其他语法:构造器

七、其他语法:封装

八、其他语法:实体JavaBean

九、面向对象编程综合案例

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

 

前言

 

 Student类

package com.ctgu.object;

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

Test类

package com.ctgu.object;

public class Test {
    public static void main(String[] args) {
        // 目标:面向对象编程快速入门
        // 1、创建一个学生对象,封装波妞的数据
        Student s1 = new Student();
        s1.name = "波妞";
        s1.chinese = 100;
        s1.math = 100;
        s1.printTotalScore();
        s1.printAverageScore();

        // 2、再创建一个学生对象,封装波仔的数据
        Student s2 = new Student();
        s2.name = "波仔";
        s2.chinese = 59;
        s2.math = 100;
        s2.printTotalScore();
        s2.printAverageScore();
    }
}

 一、面向对象编程快速入门

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

 

二、深刻认识面向对象

1、面向对象编程有啥好处?

  •  汽车的数据 找汽车对象处理
  • 手机的数据 找手机对象处理
  • 学生的数据 找学生对象处理
  • 符合人类思维习惯,编程更简单、更直观

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

  • 对象本质上是一种特殊的数据结构

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

 总结

1、面对对象编程有啥好处?

  • 凡事找对象的编程思路,更加符合人类思维习惯,编程也会更直观。

2、对象是啥?如何得到?

  • 对象是一种特殊的数据结构。
  • 对象是用类new出来的,有了类就可以创建出对象。

 3、面向对象编程这种套路是咋回事?

  • 祖师爷认为万物皆对象,谁的数据谁处理。

 

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

多个对象在计算机中的执行原理

 总结

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

  • Student s1 = new Student();
  • 每次new Student(),就是在堆内存中开辟一块区域代表一个学生对象。
  • s1变量里面记住的是学生对象的地址。

 

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

类和对象的一些注意事项

  • 类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如:Student、Car...
  • 类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为)。
  • 成员变量本身存在默认值,同学们在定义成员变量时一般来说不需要赋初始值(没有意义)。

  •  一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类名必须成为代码文件名。
  • 对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响了。
  • 如果某个对象没有一个变量引用它,则该对象无法被操作了,该对象会成为所谓的垃圾对象。

如果某个对象没有任何变量指向它,需要注意说明?

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

java存在自动垃圾回收机制,会自动清除掉垃圾对象,程序员不用操心。

 

五、this

this是什么

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

Student类

package com.ctgu.thisdemo;

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

Test类

package com.ctgu.thisdemo;

public class Test {
    public static void main(String[] args) {
        // 目标:认识this,掌握this的应用场景。
        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有啥应用场景呢?

  • this主要用来解决:变量名称冲突问题的
package com.ctgu.thisdemo;

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

    public void printPass(double score){
        if(this.score > score){
            System.out.println("恭喜您,您成功考入了哈弗大学了~~");
        }else{
            System.out.println("落选了");
        }
    }
}

总结

1、this关键字是什么?

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

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

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

 

多学一招:方法里的this到底是如何拿到调用它的对象的

 

六、构造器

关于构造器,需要同学们掌握的目标

 构造器是什么样子?

 构造器有什么特点?

  • 创建对象时,对象会去调用构造器。
Student s = new Student();

构造器的常见应用场景

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

Student类

package com.ctgu.constructor;

public class Student {
    String name;
    double score;

    // 无参构造器
    public Student(){
        System.out.println("无参数构造器被触发执行了~");
    }
    // 有参构造器
    public Student(String name,double score){
        System.out.println("有参数的构造器被触发执行了~");
    }
}

Test类

package com.ctgu.constructor;

public class Test {
    public static void main(String[] args) {
        // 目标:认识构造器,并掌握构造器的特点,应用场景,注意事项
        Student s1 = new Student();
        s1.name = "波妞";
        s1.score = 100;

        Student s2 = new Student("小黑",59);
        System.out.println(s2.name);
        System.out.println(s2.score);
    }
}

构造器的注意事项

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

总结

1、构造器长什么样子?

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

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

3、构造器在使用时,有哪2个注意事项?

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

 

七、封装

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

什么是封装?

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

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

 Student类

package com.ctgu.encapsulation;


public class Student {
    private double score;

    private void printPass(){
        System.out.println(score >= 60 ? "成绩及格" : "成绩不及格");
    }

    public void setScore(double score) {
        if(score >= 0 && score <= 100) {
            this.score = score;
        }else{
            System.out.println("数据非法");
        }
    }

    public double getScore() {
        return score;
    }
}

Test类

package com.ctgu.encapsulation;

public class Test {
    public static void main(String[] args) {
        // 目标:掌握封装的设计规范:合理隐藏、合理暴露。
        Student s1 = new Student();
        s1.setScore(-99);
    }
}

总结

1、什么是封装?

  • 就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。
  • 面向对象三大特征:封装、继承、多态。

2、封装的设计规范是什么样的?

  • 合理隐藏,合理暴露。

3、代码层面如何控制对象的成员公开或隐藏?

  • 公开成员,可以使用public(公开)进行修饰。
  • 隐藏成员,使用private(私有,隐藏)进行修饰。

 

八、实体JavaBean

什么是实体类?

  • 就是一种特殊形式的类。

get、set快捷生成

  • 右键Generate..,再点击Getter and Setter,选择成员变量。

有参、无参构造器快捷生成

  • 右键Generate..,再点击Constructor,选择参数。

Student类

package com.ctgu.javabean;

public class Student {
    // 1、必须私有成员变量,并为每个成员变量都提供get、set方法。
    private String name;
    private double score;

    // 2、必须为类提供一个公开的无参构造器
    public Student(String name, double score) {
        this.name = name;
        this.score = score;
    }

    public Student() {
    }

    public String getName() {
        return name;
    }

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

    public double getScore() {
        return score;
    }

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

Test类

package com.ctgu.javabean;


public class Test {
    public static void main(String[] args) {
        // 目标:掌握实体类的书写要求,特点,应用场景。
        Student s1 = new Student();
        s1.setName("波妞");
        s1.setScore(99);
        System.out.println(s1.getName());
        System.out.println(s1.getScore());

    }
}

StudentOpreator类

package com.ctgu.javabean;


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() + "学生成绩不及格");
        }
    }
}

 

实体类有啥应用场景?

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

 

总结

1、什么是实体类?有啥特点?

  • 成员变量必须私有,且为他们提供get、set方法;必须有无参数构造器。
  • 实体类仅仅只是一个用来保存数据的java类,可以用它创造对象,保存某个事物的数据。

2、实体类有啥应用场景?

  • 实体类对应的是软件开发里比较流行的开发方式,数据和数据的业务处理相分离。

 

 

 

九、面向对象编程综合案例

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

需求 

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

目标

  • 使用所学的面向对象编程实现以上2个需求。

 实训

 

 movie类

package com.ctgu.demo;


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

    /**
     * 获取
     * @return id
     */
    public int getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return price
     */
    public double getPrice() {
        return price;
    }

    /**
     * 设置
     * @param price
     */
    public void setPrice(double price) {
        this.price = price;
    }

    /**
     * 获取
     * @return score
     */
    public double getScore() {
        return score;
    }

    /**
     * 设置
     * @param score
     */
    public void setScore(double score) {
        this.score = score;
    }

    /**
     * 获取
     * @return director
     */
    public String getDirector() {
        return director;
    }

    /**
     * 设置
     * @param director
     */
    public void setDirector(String director) {
        this.director = director;
    }

    /**
     * 获取
     * @return actor
     */
    public String getActor() {
        return actor;
    }

    /**
     * 设置
     * @param actor
     */
    public void setActor(String actor) {
        this.actor = actor;
    }

    /**
     * 获取
     * @return info
     */
    public String getInfo() {
        return info;
    }

    /**
     * 设置
     * @param info
     */
    public void setInfo(String info) {
        this.info = info;
    }


}

MovieOperator类

package com.ctgu.demo;

public class MovieOperator {

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

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

            
        }
    }
    /**2、根据电影的编号查询出该电影的详细信息并展示 */
    public void searchMovieById(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; //已经找到了电影信息,没有必要再执行看
            }else{
                System.out.println("查询无果");
            }
        }
    }
}

Test类

package com.ctgu.demo;


import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        // 1、设计一个电影类 Movie
        // 2、设计一个电影的操作类 MovieOperator
        // 3、准备 全部电影数据
        Movie[] movies = new Movie[4];
        movies[0] = new Movie(1,"水门桥",38.9,9.8,"徐克","吴京","12万人想看");
        movies[1] = new Movie(2,"出拳吧",39,7.8,"唐晓白","田雨","3.5万人想看");
        movies[2] = new Movie(3,"月球陨落",42,7.9,"罗兰","贝瑞","17.9万人想看");
        movies[3] = new Movie(4,"一点就到家",35,8.7,"徐宏宁","刘昊然","18.8万人想看");

        // 4、创建一个电影操作类的对象,接受电影数据,并对其进行业务处理
        MovieOperator operator = new MovieOperator(movies);
        operator.printAllMovies();
        operator.searchMovieById(3);

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("==电影信息系统==");
            System.out.println("1、查询全部电影信息");
            System.out.println("2、根据id查询某个电影的详细信息展示");
            int commend = sc.nextInt();
            switch (commend){
                case 1:
                    // 展示全部电影信息
                    operator.printAllMovies();
                    break;
                case 2:
                    // 根据id查询某个电影的详细信息展示
                    System.out.println("请您输入查询的电影id:");
                    int id = sc.nextInt();
                    operator.searchMovieById(id);
                    break;
                default:
                    System.out.println("您输入的命令有问题~");
            }
        }
    }
}

 

 

 

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

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

 

热门相关:有个人爱你很久   未来兽世:买来的媳妇,不生崽   拒嫁豪门,前妻太抢手   未来兽世:买来的媳妇,不生崽   买妻种田:山野夫君,强势宠!