JAVA基础篇——面向对象基础

七、面向对象基础

1. 概念

Object Oriented Programming(OOP)

先定义一个模板(类),开发一个个对象,把数据交给对象,调用对象的方法完成对数据的处理。new对象,赋值,调用方法。

面向对象遍程有啥好处?

万物皆对象——符合人类思维习惯、编程更简单、更直观

程序中的对象是什么?

对象本质上是一种特殊的数据结构——可以看成是一张表,数据就是值,方法就是用来处理这些数据的

对象是怎么出来的?

类,对象的设计图也就是对象的模板

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

在这里插入图片描述

问题:这里对象调用方法的时候,是将方法提到占内存?每个对象提一次?如果声明了static会怎样??

3. 类和对象的注意事项

类名首字母大写的驼峰命名法,且要有意义

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

成员变量本身存在默认值,定义时一般不需要赋初始值

一个代码文件中可以有多个class类,但只能有一个public修饰,且该类名必须是代码文件名——是要包含main方法嘛??不一定,别的类无public也能被调用

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

如果某个对象没有一个变量引用它,则该对象无法被操作,会成为垃圾对象——s1 = null——Java存在自动垃圾回收机制,自动清除垃圾对象

4. this关键字

是什么?

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

public class Test {
    public static void main(String[] args) {
        // 创建对象查看地址与this
        Student s1 = new Student();
        System.out.println(s1);  // com.itheima.thisemo.Student@3b07d329
        s1.printThis();  // com.itheima.thisemo.Student@3b07d329

        System.out.println("----");
        Student s2 = new Student();
        System.out.println(s2); // com.itheima.thisemo.Student@41629346
        s2.printThis();  // com.itheima.thisemo.Student@41629346
    }
}

应用场景?

主要用来解决变量名称冲突问题

this.

在这里插入图片描述

5. 构造器

认识:

方法名与类名一致且没有返回值

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

特点:

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

应用场景:

创建对象的同时完成对对象成员变量的初始化赋值——有参数构造器,避免一个一个成员变量的赋值操作

注意事项:

  • 类在设计时,如果不写构造器,JAVA会为类自动生成一个无参构造器
  • 定义了有参数构造器,JAVA不会自动生成无参数构造器,要自己手写!!

6. 封装

概念: 将数据或方法等集合在一个个单元中(类),被封装的东西通常被称为抽象数据类型

设计规范: 合理隐藏、合理暴露——对象安全可靠

7. 实体类JAVABean

概念: 成员变量都为私有,且每个成员变量对外都提供get、set方法,必须有一个公共的无参构造器,不存在其他方法

本质、特点: 保存数据的JAVA类

应用场景:

实现数据和数据操作分离

例:

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

    public Student() {
    }

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

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

8. 面向对象综合案例

电影系统:

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

Test.java

public class Test {
    public static void main(String[] args) {
        // 展示系统中的全部电影(每部电影展示:名称、价格)
        // 允许用户根据电影编号(id)查询出每个电影的详细信息
        // 定义电影类的数组
        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, "许宏字", "刘吴然", "10.8万人想看");
        // 定义电影操作类的数组
        MovieOperator operator = new MovieOperator(movies);
//        // 展示全部电影
//        operator.printAllMovies();
//        // 根据id值查找电影
//        operator.printAnyMovie(7);
        // 界面展示
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("=====电影信息系统=====");
            // 功能区
            System.out.println("1. 查询全部电影信息");
            System.out.println("2. 根据ID查询某个电影的详细信息");
            System.out.print("请输入您想要进行的操作:");
            // Scanner sc = new Scanner(System.in);  // 移到循环外面
            int command = sc.nextInt();
            switch (command) {
                case 1:
                    operator.printAllMovies();
                    break;
                case 2:
                    System.out.print("请输入要查询电影的ID:");
                    operator.printAnyMovie(sc.nextInt());
                    break;
                default:
                    System.out.println("暂未开通此功能,请重新输入!");
            }
        }
    }
}

Movie.java

public class Movie {
    private int num;
    private String name;
    private double price;
    private double score; // 评分
    private String director; // 导演
    private String actor;  // 演员
    private String info;  // 其他信息

    // 无参构造器
    public Movie() {
    }

    // 有参构造器
    public Movie(int num, String name, double price, double score, String director, String actor, String info) {
        this.num = num;
        this.name = name;
        this.price = price;
        this.score = score;
        this.director = director;
        this.actor = actor;
        this.info = info;
    }
// get、set方法

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

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

MoveOperator.java

public class MovieOperator {
    // 多部电影
    private Movie[] movies;

    // 无参构造器
    public MovieOperator() {
    }

    // 有参构造器
    public MovieOperator(Movie[] movies) {
        this.movies = movies;
    }

    // get、set
    public Movie[] getMovie() {
        return movies;
    }

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

    // 其他操作
    // 1. 展示系统中的全部电影
    public void printAllMovies() {
        System.out.println("-----系统中的全部电影信息如下:-----");
        for (int i = 0; i < this.movies.length; i++) {
            System.out.println("编号:" + movies[i].getNum());
            System.out.println("名称:" + movies[i].getName());
            System.out.println("评分:" + movies[i].getScore());

            System.out.println("===========================");
        }
    }

    // 2. 根据id展示某个电影的详细信息
    public void printAnyMovie(int id) {
        for (int i = 0; i < this.movies.length; i++) {
            if (movies[i].getNum() == id) {
                System.out.println("编号:" + movies[i].getNum());
                System.out.println("名称:" + movies[i].getName());
                System.out.println("评分:" + movies[i].getScore());
                return;  // 找到之后不执行后面的输出,如果时break后米娜还会输出,或者要再加个判断
            }
        }
        System.out.println("没有要查询的电影!");
    }
}

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

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

10. 总结

在这里插入图片描述

  • 21
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值