目录

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

二、深刻认识面向对象

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

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

五、其他语法: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("您输入的命令有问题~");            }        }    }}

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

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