Java基础 - 6 - 面向对象(一)

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

82d030cc0de54b269c19f739257ec86e.png388a31a088f343dd84c4d19a7491ae8e.png

面向对象编程有啥好处?

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

程序中的对象到底是什么?如何得到?

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

        对象是用类new出来的,有了类就可以创建出对象(类名 对象名 = new 类名();)

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

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

2929074f10bc46099c244a3a52984002.png

一. 面向对象基础

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

        Student s1 = new Student();

        每次new Student(),就是在堆内存中开辟一块内存区域代表一个学生对象

        s1变量里面记住的是学生对象的地址,因此变量s1也称为引用类型的变量

        (变量里存储的是一个对象的地址,那么这个变量就是引用类型的变量)

2b9ec957a02e42248072be99ee8c2bdf.png

1.2 类和对象的一些注意事项

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

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

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

ef17470da71047dc9349177990e78f28.png

        · 一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类名必须称为代码文件名

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

    public static void main(String[] args) {
//        //两个变量分别指向不同的对象,不会有影响
//        Student bo1 = new Student();
//        bo1.name = "波妞";
//        Student bo2 = new Student();
//        bo2.name = "波仔";
//        System.out.println(bo1.name);

          //多个变量指向同一个对象,相互影响
          Student bo1 = new Student();
          bo1.name = "波妞";
          Student bo2 = bo1;
          bo2.name = "波仔";
          System.out.println(bo1.name);

    }

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

(当堆内存中的对象,没有被任何变量引用(指向)时,就会被判定为内存中的垃圾,Java存在自动垃圾回收机制,会自动清楚掉垃圾对象)

d0cb2c1981d54a00a604f5f592c4b0c0.png

1.3 this 

        this就是一个变量(保存当前对象的内存地址,指向对象本身),可以用在方法中,来拿到当前对象

35bfe90ff1814d6090aa035391d82f72.png

this的应用场景

        this主要用来解决对象的成员变量和方法的内部变量的名称一致时,导致访问冲突问题的

//demo
public class demo {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.score = 79;
        s1.isPass(60);
    }
}

//Student类
public class Student {
    String name;
    double score;

    public void isPass(double score){
        //如果不加this,第一个score也会代表形参里的score
        if(this.score > score){
            System.out.println("恭喜您通过了");
        }else{
            System.out.println("很遗憾没通过");
        }
    }
}

1.4 构造器

        构造器是一种特殊的方法,这个方法没有返回值类型,方法的名字必须要与所在的类名一模一样

        对象在创建的时候,可以指定对象去调用哪个构造器执行

8df0ee3d5fed4e85b249f7488afb027d.png

构造器的特点

        创建对象的时候,对象会自动去调用构造器 

构造器的常见应用场景

        创建对象时,完成对对象成员变量(属性)的初始化赋值

//demo
public class demo {
    public static void main(String[] args) {
        //创建对象的时候会触发构造器
        Student s = new Student();
        Student s1 = new Student("张三",98);
        System.out.println(s1.name+" "+s1.score);
    }
}

//Student类
public class Student {
    String name;
    double score;
    //构造器可以重载
    //无参数构造器
    public Student(){
        System.out.println("无参数构造器被触发执行");
    }
    //有参数构造器
    public Student(String name, double score){
        System.out.println("有参数构造器被触发执行");
        this.name = name;
        this.score = score;
    }
}

构造器的注意事项

        · 类在设计时,如果不写构造器,Java是会为类自动生成一个无参数构造器的

        · 一旦定义了有参数构造器,Java就不会帮我们的类自动生成无参数构造器了,此时建议自己手写一个无参数构造器出来

1.5 封装

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

什么是封装?

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

封装的设计规范

        合理隐藏 合理暴露

代码如何控制对象的成员公开或隐藏?

        公开成员,用public(公开)进行修饰;隐藏成员,用private(私有)进行修饰

//demo
public class demo {
    public static void main(String[] args) {
        Student s = new Student();
        s.setScore(99);
        System.out.println(s.getScore());
    }
}

//Student类
public class Student {
    //隐藏成员变量,通过暴露方法来对数据进行操作
    private double score;
    //接收数据
    public void setScore(double score){
        if(score>=0 && score<=100){
            this.score = score;
        }else{
            System.out.println("数据非法");
        }

    }
    //取数据
    public double getScore(){
        return score;
    }

    private void printIsPass(){
        System.out.println((score>=60)?"pass":"fail");
    }
}

1.6 实体JavaBean

什么是实体类?

        这是一种特殊形式的类。

            1. 这个类中的成员变量都要私有,并且要对外提供相应的getXxx、setXxx方法

            2. 类中必须要有一个公共的无参的构造器

实体类应用场景:

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

//demo
public class demo {
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("张三");
        s.setScore(99);
        System.out.println(s.getName());
        System.out.println(s.getScore());

        StudentOperator sor = new StudentOperator(s);
        sor.printPass();
    }
}

//Student
public class Student {
    //实体类要求:
        //隐藏成员变量,对外提供相应的get和set方法
        //必须为类提供一个公开的无参数构造器

    private String name;
    private double score;
    //如果不写构造器,Java默认提供一个无参数构造器
    //如果写了有参数构造器,则需要再写一个无参数构造器(Java不提供无参构造器)

    //自动生成无参数构造器 右键->生成->构造函数->取消选择
    public Student() {
    }

    //自动生成有参数构造器 右键->生成->构造函数->选择参数
    public Student(String name, double score) {
        this.name = name;
        this.score = score;
    }

    //自动生成get和set方法,右键->生成->getter and setter->->选择参数
    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;
    }
}

//StudentOperator
public class StudentOperator {
    private Student student;

    public StudentOperator(Student student) {
        this.student = student;
    }

    public void printPass(){
        System.out.println((student.getScore() >= 60)?student.getName()+"Pass":student.getName()+"Fail");
    }
}

1.7 面向对象编程综合案例

ab24b96243d94d389444e531b1cb691d.png

//demo
public class demo {
    public static void main(String[] args) {
        Movie[] arr_m = new Movie[3];
        arr_m[0] = new Movie(10000,"少年",30,8.7,"张三");
        arr_m[1] = new Movie(10001,"三个锅",95.96,9.4,"陈五");
        arr_m[2] = new Movie(10002,"长",52.52,8.0,"赵四");

        MovieOperator mo = new MovieOperator(arr_m);
//        mo.showAll();    //系统全部电影信息……
//        mo.showById(01);   //系统中无此编号
//        mo.showById(10000);   //编号:10000 名称:少年 价格:30.0 评分:8.7 主演:张三

        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("电影信息系统");
            System.out.println("1.查看全部电影信息");
            System.out.println("1.根据id查看某部电影信息");
            System.out.println("----------------------------");
            System.out.println("请输入您选择的操作(1 or 2):");

            int x = sc.nextInt();
            switch (x){
                case 1:
                    mo.showAll();
                    break;
                case 2:
                    System.out.println("请输入id:");
                    int user_choose_id = sc.nextInt();
                    mo.showById(user_choose_id);
                    break;
                default:
                    System.out.println("无此操作");
                    break;
            }
        }

    }
}

//Moive
public class Movie {
    private int id;         //编号
    private String name;    //名称
    private double price;   //价格
    private double score;   //评分
    private String star;    //主演

    public Movie() {
    }

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

    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 getStar() {
        return star;
    }

    public void setStar(String star) {
        this.star = star;
    }
}

//MovieOperator
public class MovieOperator {
    private Movie[] movies;

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

    //展示全部电影信息
    public void showAll(){
        System.out.println("-----系统全部电影信息-----");
        for (int i = 0; i < movies.length; i++) {
            Movie m = movies[i];
            System.out.println("名称:"+m.getName()+" 价格:"+m.getPrice()+" 评分:"+m.getScore());
        }
    }

    //根据编号id搜索展示详情
    public void showById(int id){
        boolean flag = false;
        for (int i = 0; i < movies.length; i++) {
            if(movies[i].getId() == id){
                flag = true;
                Movie m = movies[i];
                System.out.println("编号:"+m.getId()+" 名称:"+m.getName()+" 价格:"+m.getPrice()+" 评分:"+m.getScore()+" 主演:"+m.getStar());
                break;
            }
        }
        if(flag == false){
            System.out.println("系统中无此编号");
        }
    }

}

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

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

 Java基础 - 6 - 面向对象(二)-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值