5.面向对象基础篇

什么是对象

可以理解为是一个表格

//设计一个刀剑对象(表格)
package com.fan.Oop;

import org.w3c.dom.Attr;

public class Sword {
    String name;
    double Dmg;
    public double Atk (double count) {
        if (count < 0) {
            return 0;
        }
        return (count * Dmg);
    }
}
//对刀剑对象执行攻击操作 (可以用Scanner接收数据,这里为了省事就直接定义了刀剑的属性)
package com.fan.Oop;

public class Atk {
    public static void main(String[] args) {
        Sword sword1 = new Sword();
        sword1.name = "尚方宝剑";
        sword1.Dmg = 9;
        System.out.println("本轮"+ sword1.name +"的攻击造成的伤害为:" + sword1.Atk(5));

        Sword sword2 = new Sword();
        sword2.name = "绣丸";
        sword2.Dmg = 12;
        System.out.println("本轮"+ sword2.name +"的攻击造成的伤害为:" + sword1.Atk(3));
    }
}

对象的执行原理

image-20260131011649030

  1. 类(clsss)存储在方法区
  2. main方法存储在栈内存
  3. 变量(图中的Student s1... 中的s1存储的是对象地址)存储在栈内存的main方法内
  4. 对象(表)存储在堆内存
  5. 执行流程为 栈内存(对象地址) --->堆内存【更新变量】(类地址)--->方法区【执行方法】

类与对象的注意事项

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

  2. 成员变量本身存在默认值,一般不用赋初始值

  3. 一个代码文件里面可以有多个class类,但只能用一个public修饰,且public修饰的类名必须是代码文件名

    //该代码文件名为 Sword.java
    package com.fan.Oop;
    
    public class Sword {...}
    class bow{...}
    class spear{...}
    
  4. 对象之间的数据具有独立性,但多变量指向同一个对象就破坏了这种独立性

image-20260131134637892

Student s2 = s1; //意思是将s1中所存储的对象地址赋值给s2

此时我们调用或修改s2,将会访问与s1相同的对象以及类

  1. 如果某个对象的对象地址没有被存储在任何该类的变量中(且没有变量去引用它),该对象就会成为“垃圾对象”

    会被Java的回收机制处理掉

This关键字

是什么

是一个变量,用在方法中,用来获取当前对象(的对象地址)

image-20260131141407528

应用场景

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

package com.fan.Oop.thisDemo;

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.score = 701;
        s1.Pass(700);
    }
}
package com.fan.Oop.thisDemo;

public class Student {
    double score;
    public void Pass(double score) {
        if (this.score > score){
            System.out.println("过线!");
        }else {
            System.out.println("努力!");
        }
    }
}

构造器

构造器语法

public class 类名{

​ public 类名(){...}

}

image-20260131151016862

构造器的应用

  • 创建对象时,可以指定对象调用哪一个构造器执行
  • 构造器常用于完成对象的初始化(常见于完成对象的成员变量的初始化赋值)

使用构造器的注意事项

  • 类在设计时,如果不写构造器,java会为类自动生成一个无参构造器
  • 一旦定义了有参构造器,java就不会自动为类生成无参构造器了,此时建议手写一个无参构造器,方便调用

封装

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

什么是封装

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

封装的设计规范

合理隐藏(private)、合理暴露(public

image-20260131154506032

上图中的学生成绩score是暴露的(public)

任何人可以随便访问,随便赋值,危险!

image-20260131155327471

上图对学生成绩score进行了隐藏(private)

只能通过对象中的方法赋值,进而我们可以在方法中对所赋值进行约束,避免有心人的恶意赋值,安全!

简而言之:成员变量一般选择隐藏,通过方法对成员变量进行赋值;

好处:安全!

实体JavaBean

实体类

  • 特殊形式的类
    1. 成员变量全部私有(ptivate),有对应的getxxx,setxxx方法
    2. 有一个公共的无参构造器

image-20260131161923827

应用场景

数据填表与数据处理分离

image-20260131163824799

练习:简单电影系统

主程序:负责收集数据并交给表格对象,负责编写运行框架

import java.util.Scanner;

public class main {
    public static void main(String[] args) {
        //填表
        Movies[] movies = new Movies[4];
        movies[0] = new Movies(1, "水门桥", 38.9, 9.8, "徐克", "吴京", "12万人想看");
        movies[1] = new Movies(2, "出拳吧", 39, 7.8, "唐晓白", "伍俩", "3.5万人想看");
        movies[2] = new Movies(3, "月球陨落", 42, 7.9, "罗兰", "贝瑞", "17.9万人想看");
        movies[3] = new Movies(4, "一点就到家", 35, 8.7, "许宏宇", "刘昊然", "10.8万人想看");
        moviesOperator operator = new moviesOperator(movies);
        //operator.showMovies();
        //operator.showMOviesById(2);
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("查询电影请按1");
            System.out.println("查询电影详情请按2");
            int command = sc.nextInt();
            switch (command) {
                case 1:
                    operator.showMovies();
                    break;
                case 2:
                    System.out.println("请输入电影Id:");
                    int id = sc.nextInt();
                    operator.showMOviesById(id);
                    break;
                default:
                    System.out.println("???");
            }
        }
    }
}

表格对象:负责整理来自主程序的数据,填入表格,并将填好的表格返回主程序(臆想,实际返回的是地址)

package com.fan.Oop.javaBean.Movies;

public class Movies {
    private int id;
    private String name;
    private double price;
    private double score;
    private String director;
    private String actor;
    private String info;

    public Movies() {
    }

    public Movies(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;
    }
}

操作程序:接收主程序的表格,并对表格数据进行处理(业务需求)

package com.fan.Oop.javaBean.Movies;

public class moviesOperator {
    private Movies[] movies;
    public moviesOperator(Movies[] movies){
        this.movies = movies;
    }
    public void showMovies(){
        System.out.println("所有电影简介如下:");
        for (int i = 0; i < movies.length; i++) {
            System.out.println("电影Id:" + movies[i].getId());
            System.out.println("电影名称:" + movies[i].getName());
            System.out.println("电影价格:" + movies[i].getPrice());
            System.out.println("------------------------------");
        }
    }
    public void showMOviesById(int id){
        for (int i = 0; i < movies.length; i++) {
            if (movies[i].getId() == id){
                Movies m = movies[i];
                System.out.println("该电影详情如下:");
                System.out.println("电影Id:" + 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("没有该电影!");
    }
}
posted @ 2026-02-01 01:23  Shadow001  阅读(4)  评论(0)    收藏  举报