Java面向对象——学习笔记(6)

Java面向对象——学习笔记(6),第1张

一、概述

面向对象,也就是找/设计对象,Java编程的核心

二、设计对象并使用 1、先设计类,再设计对象

(1)类是共同特征的描述,对象是真是存在的具体实例。

(2)类包括成员变量、成员方法、构造器、代码块、内部类

(3)创建对象:类名 对象名=new 类名()

(4)使用对象:类名.成员变量,类.成员方法()

(5)练习

 学生类

package com.laogao.practice;
public class Student {
    //成员变量
    String name;//学生姓名
    String classroom;//班级
    //成员方法
    public void studenWhere(){
        System.out.println(name+"在"+classroom);
    }
    public void study(){
        System.out.println(name+"学习了");
    }
}

 使用学生类

package com.laogao.practice;
public class JavaPractice {
    public static void main(String[] args) {
        //面向对象
        Student student1=new Student();
        Student student2=new Student();
        student1.name="小明";
        student1.classroom="1班";
        student2.name="小李";
        student2.classroom="2班";

        System.out.println(student1.name);
        System.out.println(student2.name);
        student2.studenWhere();
        student1.study();
    }
}
2、注意实现

(1)类名驼峰式,首字母大写,见名知意,不能用关键字

(2)一个类中可以定义多个类,但只能有一个public类,且public类名和文件名一致,推荐一个类一个文件

(3)成员变量定义完整格式:

修饰符(如public) 数据类型 变量名 = 初始值(可以不写);//有和数组一样的默认值

三、内存机制 1、多个对象的内存图

(1)先将.class放入方法区,首先在栈内存开辟一块内存运行main方法,new创建的对象会放入堆内存中(即堆内存中有对象的成员变量、成员方法引用地址--->为了不占堆内存空间),接着返一个地址到栈内存(即栈中存储的是对象地址)。

在使用成员变量时,是根据栈内存中对象地址到堆中调用成员变量;在使用成员方法时,是根据栈内存中对象地址到堆中调用成员方法引用地址,根据成员方法引用地址,到方法区调用方法,在栈内存中开辟一块内存运行该方法。

注意:对象存放在堆内存中、对象变量名中存储的是对象地址、成员变量的数据也存放在堆内存中

2、两个变量指向同一个对象内存图
Student s1=new Student();
Student s2=s1;//同类型的对象可以直接赋值
//s1、s2指向同一个地址

Java垃圾自动回收期,堆中的不用的对象会自动清理,不占用堆内存

四、购物车案例——架构搭建

 

 

package com.laogao.shopdemo;

import java.util.Scanner;

public class ShopCarText {
    public static void main(String[] args) {
        //将商品存储在数组中,数组缺点:长度固定;之后学习集合,可以解决长度问题
        Goods[] shopCar=new Goods[100];
        boolean flag=true;
        while (flag) {
            //搭建 *** 作架构
            System.out.println("请选择 *** 作命令:");
            System.out.println("添加商品:add");
            System.out.println("查询商品:query");
            System.out.println("修改数量:update");
            System.out.println("结算金额:pay");
            System.out.println("退出系统:out");
            Scanner scanner=new Scanner(System.in);
            System.out.println("请输入您的命令:");
            String command=scanner.next();
            switch (command){
                case "add":
                    add(shopCar,scanner);
                    break;
                case "query":
                    query(shopCar);
                    break;
                case "update":
                    update(shopCar,scanner);
                    break;
                case "pay":
                    pay(shopCar);
                    break;
                case "out":
                    flag=false;
                    System.out.println("欢迎下次使用~~~~~~");
                    break;
                default:
                    System.out.println("命令错误!");
            }
        }
    }

    public static void add(Goods[] shopCar,Scanner scanner) {
        Goods item=new Goods();
        System.out.println("请输入商品编号(不重复):");
        item.gid=scanner.nextInt();
        System.out.println("请输入商品名称:");
        item.gname=scanner.next();
        System.out.println("请输入商品价格:");
        item.gprice=scanner.nextDouble();
        System.out.println("请输入商品数量:");
        item.buynum=scanner.nextInt();

        for (int i = 0; i < shopCar.length; i++) {
            if (shopCar[i]!=null&&shopCar[i].gid==item.gid){
                System.out.println("商品编号重复!");
                break;
            }
            if (shopCar[i]==null){
                shopCar[i]=item;
                System.out.println("添加成功!");
                break;
            }
        }
    }

    public static void query(Goods[] shopCar) {
        System.out.println(String.format("%-12s","商品id")+String.format("%-12s","商品名称")+String.format("%-12s","商品价格")+String.format("%-12s","商品数量"));
        for (int i = 0; i < shopCar.length; i++) {
            if (shopCar[i]!=null) {
                System.out.println(String.format("%-14s",shopCar[i].gid)+String.format("%-14s",shopCar[i].gname)+String.format("%-14s",shopCar[i].gprice)+String.format("%-14s",shopCar[i].buynum));
            }else {
                break;
            }
        }
    }

    public static void pay(Goods[] shopCar) {
        double sum=0;
        for (int i = 0; i < shopCar.length; i++) {
            if (shopCar[i]!=null) {
                sum+=shopCar[i].buynum*shopCar[i].gprice;
            }else {
                break;
            }
        }
        System.out.println("商品总额为"+sum+"元");
    }

    public static void update(Goods[] shopCar,Scanner scanner) {
        while (true) {
            System.out.println("请输入要修改的商品id:");
            int id=scanner.nextInt();
            Goods goods=getGoodsById(shopCar,id);
            if (goods==null){
                System.out.println("购物车中没有该商品信息!");
            }else {
                System.out.println("请输入修改后商品数量:");
                int num=scanner.nextInt();
                goods.buynum=num;
                System.out.println("修改成功!");
                query(shopCar);
                break;
            }
        }
    }

    public static Goods getGoodsById(Goods[] shopCar,int id){
        for (int i = 0; i < shopCar.length; i++) {
            if (shopCar[i]!=null){
                if (shopCar[i].gid==id) {
                    //找到了
                    return shopCar[i];
                }
            }else {//遇到null直接结束
                return null;
            }
        }
        return null;//找完100个都还没找到
    }
}

五、构造器 1、学构造器的目的

真正知道对象具体是通过调用什么代码得到的;能够掌握为对象赋值的其他简便写法;为以后学面向对象编程的其他内容做支撑

2、构造器分类

无参数构造器:(默认存在的)初始化对象时,成员变量数据是默认值

有参数构造器:初始化对象时,可以接收参数为成员变量赋值

package com.laogao.practice;
public class Student {
    //成员变量
    String name;//学生姓名
    String classroom;//班级
    //成员方法
    public void studenWhere(){
        System.out.println(name+"在"+classroom);
    }
    public void study(){
        System.out.println(name+"学习了");
    }
/*构造器格式  

修饰符 类名(){}

*/

//无参数构造器
    public Student(){
        System.out.println("调用了无参数构造器");
    }
//有参数构造器
    public Student(String n,String c){
        System.out.println("调用了有参数构造器");
        name=n;
        classroom=c;
        
    }

}
3、注意

无参构造器是默认有的,但写了有参数构造器后,那无参构造器就不能用了,要想用需要自己再写上无参构造器

六、this关键字

可以出现在构造器、成员方法中

this代表当前对象的地址,所以可以解决成员变量名和构造器参数名冲突的问题

可以通过this访问成员变量、成员方法

//有参数构造器
    public Student(String name,String classroom){
        System.out.println("调用了有参数构造器");
        this.name=name;
        this.classroom=classroom;
        
    }
七、封装

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

2、封装:告诉我们,如何正确设计对象的属性和方法

3、封装原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为。

4、举例:

人画圆,对象有人、圆,那画这个方法属于谁呢?属于圆,因为画所需要的数据圆的半径等信息封装在了圆这个对象中。

人关门,对象人、门,关这个方法属于门,因为关这是门的状态,人只是调用了门这个关门方法。

5、封装好处:编程变简单、降低学习成本,有利于建立面向对象的思想。

学会使用API文档

6、如何更好的封装

修饰符private:只能在当前类访问,其他类不能访问

可以通过public修饰的getter、setter()方法进行取值和赋值

八、JavaBean

JavaBean实体类,其对象可以用于程序中封装信息

标准JavaBean需要满足的书写要求:

1、成员变量使用private修饰

2、提供成员变量对应get、set方法--->快捷方式,右键Generate-->Getter and Setter,shift全选OK添加

3、必须提供一个无参构造器(默认存在的);有参数构造器可写可不写--->快捷方式,右键Generate-->Constructor,shift全选OK添加。注意需要补上无参的-->快捷方式,右键Generate-->Constructor,Select None添加

九、补充:成员变量、局部变量区别

十、综合案例

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/729534.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存