JavaSE从入门到放弃.面向对象


JavaSE从入门到放弃.面向对象

面向对象入门

所谓面向对象编程,就是把要处理的数据交给对象,让对象来处理。

面向对象编程的好处

Java的祖师爷,詹姆斯高斯林认为,在这个世界中 万物皆对象! 任何一个对象都可以包含一些数据,数据属于哪个对象,就由哪个对象来处理。
面向对象的开发更符合人类的思维习惯,让编程变得更加简单、更加直观。

程序中对象到底是个啥

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

对象其实就是一张数据表,表当中记录什么数据,对象就处理什么数据。数据表中可以有哪些数据,是有类来设计的。

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

其实Student s1 = new Student();这句话中的原理如下

  • Student s1表示的是在栈内存中,创建了一个Student类型的变量,变量名为s1
  • new Student()会在堆内存中创建一个对象,而对象中包含学生的属性名和属性值,同时系统会为这个Student对象分配一个地址值
  • 接着把对象的地址赋值给栈内存中的变量s1,通过s1记录的地址就可以找到这个对象
  • 当执行s1.name="chd"时,其实就是通过s1找到对象的地址,再通过对象找到对象的name属性,再给对象的name属性赋值为chd;

类和对象的一些注意事项

  1. 一个代码文件中,可以写多个class类,但是只能有一个是public修饰,且public修饰的类必须和文件名相同。
  2. 对象与对象之间的数据不会相互影响,但是多个变量指向同一个对象会相互影响。

this关键字

  • this就是一个变量,用在方法中,可以拿到当前类的对象。
  • 通过this在方法中可以访问本类对象的成员变量。
  • 哪一个对象调用方法方法中的this就是哪一个对象。

构造器

构造器其实是一种特殊的方法,但是这个方法没有返回值类型,方法名必须和类名相同。
构造器就是用来创建对象的。可以在创建对象时给对象的属性做一些初始化操作。

new 对象就是在执行构造方法

  • 在创建对象时,会调用构造器。也就是说 new Student()就是在执行构造器,当构造器执行完了,也就意味着对象创建成功。
  • 当执行new Student("chd",99)创建对象时,就是在执行有参数构造器,当有参数构造器执行完,就意味着对象创建完毕了。

构造器的注意事项?

  1. 在设计一个类时,如果不写构造器,Java会自动生成一个无参数构造器。
  2. 一定定义了有参数构造器,Java就不再提供空参数构造器,此时建议自己加一个无参数构造器。

封装性

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

封装的设计规范用8个字总结,就是:合理隐藏、合理暴露

封装在代码中的体现

一般我们在设计一个类时,会将成员变量隐藏,然后把操作成员变量的方法对外暴露。
这里需要用到一个修饰符,叫private,被private修饰的变量或者方法,只能在本类中被访问。

private double score; 就相当于把score变量封装在了Student对象的内部,且不对外暴露,你想要在其他类中访问score这个变量就,就不能直接访问了;

如果你想给Student对象的score属性赋值,得调用对外暴露的方法setScore(int score),在这个方法中可以对调用者传递过来的数据进行一些控制,更加安全。

当你想获取score变量的值时,就得调用对外暴露的另一个方法 getScore()

实体JavaBean

实体类中除了有给对象存、取值的方法就没有提供其他方法了。所以实体类仅仅只是用来封装数据用的。

在实际开发中,实体类仅仅只用来封装数据,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。

案例

定义电影类

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

定义电影操作类

前面我们定义的Movie类,仅仅只是用来封装每一部电影的信息。为了让电影数据和电影数据的操作相分离,我们还得有一个电影操作类(MovieOperator)。

因为系统中有多部电影,所以电影操作类中MovieOperator,需要有一个Movie[] movies; 用来存储多部电影对象;

同时在MovieOperator类中,提供对外提供,对电影数组进行操作的方法。如printAllMovies()
用于打印数组中所有的电影信息,searchMovieById(int id)方法根据id查找一个电影的信息并打印。

public class MovieOperator {
    //因为系统中有多部电影,所以电影操作类中,需要有一个Movie的数组
    private Movie[] movies;

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

    /** 1、展示系统全部电影信息 movies = [m1, m2, m3, ...]*/
    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; // 已经找到了电影信息,没有必要再执行了
            }
        }
        System.out.println("没有该电影信息~");
    }
}

定义测试类

public class Test {
    public static void main(String[] args) {
        //创建一个Movie类型的数组
        Movie[] movies = new Movie[4];
        //创建4个电影对象,分别存储到movies数组中
        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, "许宏宇", "刘昊然", "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.printAllMovies();
                    break;
                case 2:
                    // 根据id查询某个电影的详细信息展示
                    System.out.println("请您输入查询的电影id:");
                    int id = sc.nextInt();
                    operator.searchMovieById(id);
                    break;
                default:
                    System.out.println("您输入的命令有问题~~");
            }
        }
    }
}

声明:Rock 版权所有,内容均为原创,欢迎转载。

转载:转载请注明原文链接 - JavaSE从入门到放弃.面向对象


我是一个程序员,致力于网页开发,我还很年轻,什么也不懂。