【JAVA基础】面向对象基础(上)

简介: 一、设计对象并使用1.定义类,创建对象并使用2.定义类的补充注意事项二、对象内存图1.多个对象的内存图2.两个变量指向同一个对象内存图3.垃圾回收三、面向对象编程案例购车系统模拟

一、设计对象并使用



1.定义类,创建对象并使用


在Java中,必须先设计类,才能获得对象。


类(设计图):是对象共同特征的描述; 对象:是真实存在的具体实例。






如何定义类


public class 类名 {


1、成员变量(代表属性,一般是名词)


2、成员方法(代表行为,一般是动词)


3、构造器 (后面学习)


4、代码块 (后面学习)


5、内部类 (后面学习)}


public class Car { }
String name;
double price;
// 属性 (成员变量)
// 行为(方法)
public void start(){
}
public void run(){
}

如何得到类的对象


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

Car c = new Car();

如何使用对象


访问属性: 对象名.成员变量


访问行为: 对象名.方法名(…)


2.定义类的补充注意事项


成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值; 一般无需指定初始化值,存在默认值。


类名首字母建议大写,且有意义,满足“驼峰模式”。


一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。 实际开发中建议还是一个文件定义一个class类。


对象的成员变量的默认值规则


数据类型 明细 默认值


基本类型 byte、short、char、int、long 0


float、double 0.0


boolean false


引用类型 类、接口、数组、String null


二、对象内存图



1.多个对象的内存图


1.对象放在哪个位置?


堆内存中


2. Car c = new Car(); c变量名中存储的是什么?


存储的是对象在堆内存中的地址。


3. 成员变量(name、price)的数据放在哪里,存在于哪个位置?


对象中,存在于堆内存中。


2.两个变量指向同一个对象内存图




public class base {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "小明";
        s1.sex = '男';
        s1.hobby = "游戏、睡觉、听课";
        s1.study();
        System.out.println("-------------------");
// 把学生类型的s1变量赋值给学生类型的s2变量
        Student s2 = s1;
        s2.hobby = "爱提问";
        System.out.println(s2.name);
        System.out.println(s2.sex);
        System.out.println(s1.hobby);
        s2.study();
        System.out.println("-------------------");
        s1.study();
    }
}

由此可见:


s2.hobby = "爱提问"; 改变了堆内存的值,导致:


s1.study();和第一次输出的不一样



3.垃圾回收


注意:当堆内存中的类对象或数组对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。


Java存在自动垃圾回收器,会定期进行清理。


三、面向对象编程案例




购车系统模拟


需求


模拟购物车模块的功能,需要实现添加商品到购物车中去,同时需要提供修改商品的购买数量,结算商品价格功能(请使用面向对象编程来解决)


分析


购物车中的每个商品都是一个对象,需要定义一个商品类。

购物车本身也是一个对象:可以使用数组对象代表它。

完成界面架构,让用户选择操作的功能。

商品类

public class Goods {
    int id;
    String name;
    double price;
    int  buyNumber;
}
import java.util.Scanner;
public class base {
    public static void main(String[] args) {
        Goods[] goods=new Goods[100];
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("请输入你的操作:add(添加商品) query(查询购物车) update(修改购物车) pay(支付)");
            System.out.println("-----------------------------------");
            String command = scanner.next();
            switch (command){
                case "add":
                    //添加
                    add(goods,scanner);
                    break;
                case "query":
                    //查询
                    query(goods,scanner);
                    break;
                case "update":
                    //修改
                    update(goods,scanner);
                    break;
                case "pay":
                    //支付
                    pay(goods,scanner);
                    break;
                default:
                    System.out.println("你输入的命令有误");
                    break;
            }
        }
    }
    private static void pay(Goods[] goods, Scanner scanner) {
        double money=0;
        for (int i = 0; i < goods.length; i++) {
            Goods g = goods[i];
            if (g!=null){
                money+=(g.price*g.buyNumber);
            }
            else break;
        }
        System.out.println("购物车商品价格为:"+money);
    }
    private static void update(Goods[] goods, Scanner scanner) {
        System.out.println("请输入要修改的商品编号");
        int id = scanner.nextInt();
        Goods date = getupdate(goods, id);
        if (date==null){
            System.out.println("没有找到改商品");
        }else {
            System.out.println(date.name+"修改后的数量:");
            date.buyNumber=scanner.nextInt();
            System.out.println("修改成功");
            query(goods,scanner);
        }
    }
    private static Goods getupdate(Goods[] goods,int id){
        for (int i = 0; i < goods.length; i++) {
            Goods g=goods[i];
            if (g!=null){
                if (g.id==id){
                    return g;
                }
            }
            return null;
        }
        return null;
    }
    private static void query(Goods[] goods, Scanner scanner) {
        System.out.println("-----------------------------------");
        System.out.println("编号\t\t名称\t\t价格\t\t数量");
        for (int i = 0; i < goods.length; i++) {
            Goods g=goods[i];
            if (g!=null){
                System.out.print(g.id+"\t\t");
                System.out.print(g.name+"\t\t");
                System.out.print(g.price+"\t\t");
                System.out.println(g.buyNumber+"\t\t");
            }else {
                break;
            }
        }
    }
    private static void add(Goods[] goods, Scanner scanner) {
        Goods g = new Goods();
        System.out.println("侵害输入商品的编号");
        g.id=scanner.nextInt();
        System.out.println("请输入商品的名称");
        g.name=scanner.next();
        System.out.println("请输入商品的价格");
        g.price=scanner.nextDouble();
        System.out.println("请输入商品的数量");
        g.buyNumber=scanner.nextInt();
        for (int i = 0; i < goods.length; i++) {
           if (goods[i]==null){
               goods[i]=g;
               System.out.println(g.name + "添加成功");
               break;
           }
        }
    }
}


相关文章
|
19天前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
19 1
|
1月前
|
JavaScript 前端开发 Java
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。如果你从我的文章中受益,欢迎关注我,我将持续更新更多优质内容。你的支持是我前进的动力!🎉🎉🎉
24 0
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
90 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
1月前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
37 2
|
3月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
3月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
37 4
|
3月前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
2月前
|
存储 Java 程序员
Java基础-面向对象
Java基础-面向对象
20 0
|
4月前
|
Java 数据处理 开发者
【Java基础面试十二】、说一说你对面向对象的理解
这篇文章阐述了面向对象是一种以类和对象为基础,通过封装、继承和多态等概念来模拟现实世界中的事物及其相互关系的程序设计方法,它强调以事物为中心进行思考和系统构造,与结构化程序设计相比,更符合人类的自然思维方式。
【Java基础面试十二】、说一说你对面向对象的理解