Java入门基础8:面向对象基础(类和对象、构造器、this关键字、封装、实体JavaBean、成员变量、局部变量)

面向对象的思想

面向:拿或者找

对象:东西

面向对象编程:拿或者找东西过来编程解决问题

面向对象:把现实世界中的事物全部看成一个个的对象来解决问题的

面向对象编程的好处:代码符合人类的思维习惯,编程程序更简单,看程序更容易理解

面向对象编程快速入门

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

类和对象

类(设计图):相同事物共同特征的描述

对象:对象是类的具体的实例。(对象==实例)

在java中必须先定义类,才能得到对象。

我们通过例子能够更好的理解:

我们需要创建两个类:

第一个类不需要创建main方法,他是用来实现对象需求的模板。

package com.itchinajie.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.0);
    }
}

 在创建一个类用来实现我们的需求的,我们每new一个新的student对象,就相当于一组新的数据,数据中包含student类中常见的的属性,我们为其属性赋值,就是在封装数据。

package com.itchinajie.object;

public class Test {
    public static void main(String[] args) {
        //目标:面向对象编程快速入门
        //1.创建一个学生对象,封装播妞的数据
        student s1 = new student();//这是创建的学生对象,创建格式:类名 对象名 = new 类名();

        s1.name = "播妞";//调用Student类中的属性用来存数据
        s1.chinese = 100;
        s1.math = 100;
        s1.printTotalScore();//这是调用类中的方法 对象名.方法名
        s1.printAverageScore();

        student s2 = new student();//这是创建的学生对象,创建格式:类名 对象名 = new 类名();

        s2.name = "播仔";//调用Student类中的属性用来存数据
        s2.chinese = 100;
        s2.math = 100;
        s2.printTotalScore();//这是调用类中的方法 对象名.方法名
        s2.printAverageScore();
    }
}

深刻认识面向对象

面向对象的好处

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

汽车的数据找汽车对象处理。
手机的数据找手机时象处理。
学生的数据找学生对时象处理。这就是对象。

程序中对象的本质

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

我们可以把刚刚例子中的每个学生数据看做一张表格,创建多个对象就是在创建多个表格。

对象是怎么出来的

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

根据上图,当我们创建了一个s1对象,他就会为我们创建s1的学生表,创建了s2的对象,就会再创建一个属于s2的学生表,new多少下就相当于创建了多少张表。

也就是说,对象使用类new出来的,有了类就可以创建出对象。

public class 类名{
        1、变量,用来说明对象可以处理什么数据
        2、方法,描述对象有什么功能,也就是可以对数据进行什么样的处理
}

定义类的格式

public class 类名 {
        1、成员变量(代表属性,一般是名词):数据类型名称:
        2、成员方法(代表行为,一般是动词)
        3、构造器
(后面几节学习)
        4、代码块(以后学习)
        5、内部类(以后学习)

}

类的具体写法

1、一般名词定义成成员变量(属性)

修饰符 数据类型 变量名称 = 初始值;

成员变量不建议给初始化值,存在默认值,默认值的规则:整型是0,浮点型是0.0 引用类型是null,布尔型是false。

2、一般动词定义方法(行为)

创建对象

类名   对象名 = new  类名 ();

对象怎么使用

对象名.成员变量

对象名.成员方法

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

还是以第一个例子解析:

首先是先回扫描(scan)class文件,加载进入方法区

然后在扫描文件内部的main方法,扫描后会在栈内存中创造一个main空间;

然后继续扫描第一节创造对象的话,然后就会在方法区创造一个Student.class类

接着创造出一个变量s1就会在栈内存中的main空间内创造一个变量s1;

然后发现有需要new出来的类,就会在堆内存中创造一个Student的s1空间,没有给他们赋值的时候他们的成员变量都是默认值;

然后就将类的地址值交给方法区的Student.class;

然后继续执行下面的代码,给成员变量赋值;

然后就改变(transform)Student的s1空间内的成员变量的值;

最后在运行调用的成员方法,在控制台打印输出,在接着运行下面的创造对象,又会在栈中的main空间内开辟一个s2空间,接着在堆内存中创造一个Student的s2空间,然后继续运行下去,改变Student的s2空间内的成员变量的值,调用成员方法打印输出。

s1变量中存储的是对象的地址,因此变量51也称为引用类型的变量。

类和对象的一些注意事项

*类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如:Student、Car…

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

*成员变量本身存在默认值,同学们在定义成员变量时一般来说不需要赋初始值(没有意义)。

修饰符 数据类型 变量名称 = 值;

*一个代码文件中,可以写多个clss类,但只能一个用public修饰,且public修饰的类名必须成为代码文件名。

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

*如果某个对象没有一个变量引用它,则该对象无法被操作了,该对象会成为所谓的垃圾对象。

构造器

构造器格式

构造器特点

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

对象创建时,我们可以指定对象去调用哪个构造器执行。

构造器常用于完成对象初始化(常见的应用场景是完成对象的成员变量的初始化赋值)。

构造器的作用

初始化一个类的对象,并返回这个对象的地址。

构造器的分类

无参数构造器

初始化一个类的对象,并返回这个对象的地址,里面的数据都是默认值。

有参数构造器

初始化一个类的对象,并返回这个对象的地址,并且可以同时为对象赋值。

在一Intellij idea中,我们可以通过快捷键快熟创建构造器Alt + Ins 键 -> 构造函数(Constructor)

调用构造器:类名 对象名 = new 构造器;

构造器的注意事项

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

this关键字

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

this主要是用来解决:变量名称冲突问题的。

下面这段代码中,就区分了类中的变量和方法中的变量。

package com.itchinajie.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("落选了~");
        }
    }
}

详解请参考:JAVA中的类和对象之this的详解-CSDN博客

面向对象三大特征之一:封装

面向对象三大特征分别是:封装、继承、多态

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

我们可以用封装对变量合理隐藏,合理暴露:

公开成员,可以使用public(公开)进行修饰。
隐藏成员,使用private(私有,隐藏)进行修饰(后面会详讲)。

实体JavaBean

实体类就是一种特殊形式的类。

1、这个类中的成员变量都要私有,并且要对外提供相应的getXxx,setXxx方法。
2、类中必须要有一个公共的无参的构造器。

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

快速创建getter setter方法也有快捷键 Alt + Ins -> Getter&Setter

案例练习

需求:
展示系统中的全部电影(每部电影展示:名称、价格)。
允许用户根据电影编号(id)查询出某个电影的详细信息。
目标:
使用所学的面向对象编程实现以上2个需求。

参考答案:

创建Movie框架,用来记住电影数据

package com.itchinajie.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(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 Movie() {
    }

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

 注意:一个完整的框架一般都具备有参构造器,无参构造器和getter、setter方法。

 创建操作系统,给用户展示的

package com.itchinajie.Demo;

public class MovieOperator {
    private Movie[] movies;
    public MovieOperator(Movie[] movies){
        this.movies = movies;
    }
    //展示系统全部电影信息movies = [m1,m2,m3,m4,...]
    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("没有该电影信息~");
    }
}

 这是控制台,用来执行命令的:

package com.itchinajie.Demo;

import java.util.Scanner;

public class Text {
    /*目标:完成电影信息展示功能;根据电影id查询该电影详情。
    电影数据:
        1,"水门桥" ,38.9,9.8,"徐克","吴京","12万人想看"
        2,"出拳吧",39,7.8,"唐晓白","田雨","3.5万人想看"
        3,"月球陨落",42.8,7.9,"罗兰","贝瑞","17.9万人想看"
        4,"一点就到家",35,8.7,"许宏宇","刘昊然","10.8万人想看"
     */
    public static void main(String[] args) {
        //1.设计一个电影类
        //2.设计一个电影操作类
        //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.8,7.9,"罗兰","贝瑞","17.9万人想看");
        movies[3] = new Movie(4,"一点就到家",35,8.7,"许宏宇","刘昊然","10.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查询某个电影的详细信息展示");
            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("您输入的命令有问题~~");
            }
        }
    }
}

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值