JAVA基础-面向对象基础

目录

1.面向对象入门

2.深刻认识面向对象

2.1 面向对象编程有什么好处?

2.2 程序中对象到底是个啥?

 2.3 对象是怎么出来的?

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

4. 类和对象的一些注意事项

5.this关键字

6.构造器

 7.封装性

 8.实体JavaBean

 9.面向对象综合案例

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


1.面向对象入门

现在假设我们需要处理的是学生的姓名、语文成绩、数学成绩这三个数据,要求打印输出这个学生的总成绩,和平均成绩。

遇到这样的需求,我们以前都会用定义方法来做:

定义好方法之后,我们调用方法的时候,需要给每一个方法传递实际参数

 上面的案例中,这种编程方式是一种面向过程的编程方式。所谓面向过程就是编写一个方法,有数据要进行处理就交给方法来处理。

但是实际上姓名、语文成绩、数学成绩三个数据可以放在一起,组合成一个对象,然后让对象提供方法对自己的数据进行处理。这种方式称之为面向对象编程。

 总结一下:所谓编写对象编程,就是把要处理的数据交给对象,让对象来处理。

2.深刻认识面向对象

2.1 面向对象编程有什么好处?

任何一个对象都可以包含一些数据,数据属于哪个对象,就由哪个对象来处理。

面向对象的开发更符合人类的思维习惯,让编程变得更加简单、更加直观。

2.2 程序中对象到底是个啥?

对象实质上是一种特殊的数据结构。这种结构怎么理解呢?

你可以把对象理解成一张表格,表当中记录的数据,就是对象拥有的数据。

 2.3 对象是怎么出来的?

上面的那张数据表是用类(class)来设计的,类可以理解成对象的设计图,或者对象的模板。

 对象可以理解成一张数据表,而数据表中可以有哪些数据,是由类来设计的。

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

按照我们之前讲的数组的执行原理,数组变量记录的其实数数组在堆内存中的地址。其实面向对象的代码执行原理和数组的执行原理是非常类似的。

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

  • Student s1表示的是在栈内存中,创建了一个Student类型的变量,变量名为s1

  • new Student()会在堆内存中创建一个对象,而对象中包含学生的属性名和属性值

    同时系统会为这个Student对象分配一个地址值0x4f3f5b24

  • 接着把对象的地址赋值给栈内存中的变量s1,通过s1记录的地址就可以找到这个对象

  • 当执行s1.name=“播妞”时,其实就是通过s1找到对象的地址,再通过地址找到堆内存中对象的name属性,再给对象的name属性赋值为播妞;

  • 执行方法时,由堆内存的类的地址指向方法区中的方法,然后再返回到栈内存中

4. 类和对象的一些注意事项

 第二条:对象与对象之间的数据不会相互影响,但是多个变量指向同一个对象会相互影响。

 如下图所示,s1和s2两个变量分别记录的是两个对象的地址值,各自修改各自属性值,是互不影响的。

 如下图所示,s1和s2两个变量记录的是同一个对象的地址值,s1修改对象的属性值,再用s2访问这个属性,会发现已经被修改了。

把s1对象赋值给s2,s1和s2在内存中存储的地址时一样的,都指向s1地址所指向的Student对象,所以在修改s2之后,s1中属性的值也会发生变化。

5.this关键字

this是什么呢?

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

我们看下图所示代码,通过代码来体会这句话到底是什么意思。哪一个对象调用方法方法中的this就是哪一个对象

上面代码的运行结果如下:

 this有什么用呢?

通过this在方法中可以访问本类对象的成员变量。我们看下图代码,分析打印结果是多少

 关于this关键字我们就学习到这里,重点记住这句话:哪一个对象调用方法方法中的this就是哪一个对象

6.构造器

什么是构造器?

构造器其实是一种特殊的方法,但是这个方法没有返回值类型方法名必须和类名相同。

如下图所示:下面有一个Student类,构造器名称也必须叫Student;也有空参数构造器,也可以有有参数构造器。

public class Student {
    //1.无参数构造器
    public Student(){
        System.out.println("==Student的无参数构造器被执行了==");
    }

    //2.有参数构造器
    public Student(String name){
        System.out.println("==Student的有一个参数构造器被执行了==");
    }

    public Student(String name,double score){
        System.out.println("==Student的有2个参数构造器被执行了==");
    }
}

 构造器的特点?

每次创建对象时,对象会立即调用构造器

也就是说 new Student()就是在执行构造器,当构造器执行完了,也就意味着对象创建成功。

Studen s = new Studnet();

new Student是用来创建学生对象的

()是用来匹配调用无参构造器

当执行new Student("播仔",99)创建对象时,就是在执行有参数构造器,当有参数构造器执行完,就意味着对象创建完毕了。

 关于构造器的特点,我们记住一句话:new 对象就是在执行构造方法

构造器的应用场景?

其实构造器就是用来创建对象的。可以在创建对象时给对象的属性做一些初始化操作。创建对象时,同时为对象赋值如下图所示:

 构造器的注意事项?

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

 7.封装性

1. 什么是封装呢?

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

比如:在设计学生类时,把学生对象的姓名、语文成绩、数学成绩三个属性,以及求学生总分、平均分的方法,都封装到学生对象中来。

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

比如,设计一辆汽车时,汽车的发动机、变速箱等一些零件并不需要让每一个开车的知道,所以就把它们隐藏到了汽车的内部。

把发动机、变速箱等这些零件隐藏起来,这样做其实更加安全,因为并不是所有人都很懂发动机、变速箱,如果暴露在外面很可能会被不懂的人弄坏。

在设计汽车时,除了隐藏部分零件,但是还是得合理的暴露一些东西出来,让司机能够操纵汽车,让汽车跑起来。比如:点火按钮啊、方向盘啊、刹车啊、油门啊、档把啊... 这些就是故意暴露出来让司机操纵汽车的。

2. 封装在代码中的体现

知道什么是封装之后,那封装在代码中如何体现呢?一般我们在设计一个类时,会将成员变量隐藏,然后把操作成员变量的方法对外暴露。

这里需要用到一个修饰符,叫private,被private修饰的变量或者方法,只能在本类中被访问

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

公开是public它修饰的成员可以在任意地方直接访问

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

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

 8.实体JavaBean

1. 什么是实体类?

实体类就是一种特殊的类,它需要满足下面的要求:

 接下来我们按照要求,写一个Student实体类;

快捷键:右键 + generate + getter and setter完成所有的get和set方法

右键 + generate + constructor完成有参和无参的构造器

2. 实体类的应用场景

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

实体类的对象只负责数据的存和取,对于数据的业务处理应该交给另一个类的对象来处理分层思想

在实际应用中,会将类作为一种数据类型使用。如下图所示,在StudentOperator类中,定义一个Student类型的成员变量student,然后使用构造器给student成员变量赋值

然后在Student的printPass()方法中,使用student调用Student对象的方法,对Student对象的数据进行处理。

 9.面向对象综合案例

1.定义电影类

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

    public Movie() {
    }

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

    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 String getActor() {
        return actor;
    }

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

    public int getId() {
        return id;
    }

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

 2. 第二步:定义电影操作类

import java.util.Scanner;

public class MovieOperator {
    //1.获取到全部电影对象
    private Movie[] movies;//接一个电影类型的数组(引用类型)private int id;
    //使用构造器接收一个Movie类型的数组movies
    public MovieOperator(Movie[] movies){
        this.movies = movies;
    }
    //2.提供方法,展示全部电影,根据id查询对象
    public void showALLMovies() {
        System.out.println("==全部电影信息如下==");
        for (int i = 0; i < movies.length; i++) {
            Movie m = movies[i];
            System.out.println(m.getId() + "\t" + m.getName() + "\t" + m.getPrice() + "\t" + m.getActor());
        }
    }

    public void getMovieById() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您要查询的电影id:");
        int id = sc.nextInt();
        System.out.println("您要查询的电影信息如下:");
        for (int i = 0; i < movies.length; i++) {
            Movie m = movies[i];
            if(m.getId() == id) {
                System.out.println(m.getId() + "\t" + m.getName() + "\t" + m.getPrice() + "\t" + m.getActor());
                return;
            }
        }
        System.out.println("查无此电影");
    }

}

3. 第三步:定义测试类

public class Test {
    public static void main(String[] args) {
        //掌握电影信息的开发
        //1.每个电影是一个电影对象,首先要设计电影类,用于创建电影对象,封装电影数据
        //2.准备电影对象数据(电影信息)
        Movie[] movies = new Movie[5];//装五个电影对象 movies = [null,null,null,null,null]
        movies[0] = new Movie(1,"热辣滚烫",46.5,"贾玲");//直接new一个电影对象存入数组,实际上数组中存的是电影对象的地址
        movies[1] = new Movie(2,"飞驰人生",49.9,"沈腾");
        movies[2] = new Movie(3,"非诚勿扰",9.9,"葛优,舒淇");
        movies[3] = new Movie(4,"第二十条",87.4,"雷佳音,赵丽颖");
        movies[4] = new Movie(5,"熊出没",35.5,"光头强");

        //3.把电影对象数据交给电影操作对象进行业务处理
        //声明一个名为operator的变量,其类型为MovieOperator
        // 这种设计遵循了职责分离的原则,分层原则
        MovieOperator operator = new MovieOperator(movies);
        operator.showALLMovies();
        operator.getMovieById();


    }
}

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

 如下图所示,成员变量在类中方法外,而局部变量在方法中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值