黑马程序员Java教程学习笔记

Posted 末初mochu7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑马程序员Java教程学习笔记相关的知识,希望对你有一定的参考价值。

学习视频:https://www.bilibili.com/video/BV1Cv411372m
如侵权,请私信联系本人删除

文章目录


黑马程序员Java教程学习笔记(三)

面向对象:设计对象、注意事项

OOP(Object Oriented Programming):面向对象程序设计

类:是对象共同特征的描述
对象:是真实存在的具体实例
在Java中,必须先设计类,才能创建对象并使用

public class Car
	// 属性(成员变量)
	String name;
	double price;

	// 行为方法
	public void start()

	
	public void run()
	
	

创建对象

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

使用对象

访问属性:对象名.成员变量
访问行为:对象名.方法名(...)


定义类的补充注意事项:

  • 类名首字母建议大写,且有意义,满足”驼峰模式
  • 一个Java文件中可以定义多个class类,但只能一个类是public修饰,而且public修饰的类名必须成为代码文件名
    (实际开发中建议还是一个文件定义一个class类)
  • 成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;一般无需指定初始值,存在默认值

面向对象:内存机制

Java虚拟机内存的三部分:栈内存、堆内存、方法区

多个对象使用时内存处理过程:

  • 类会先加载到方法区,虚拟机会把方法区中的类的main方法加载到栈内存中执行,在执行main方法的过程中会把其中的对象加载到方法区,然后对象中的属性(成员变量)会加载到栈内存,而对象会在堆内存开辟存储对象的信息的空间(属性,以及方法的引用地址(指向方法区)),对象在堆内存中的内存空间的地址赋值给栈内存中的变量。


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

垃圾回收机制: 当堆内存中的对象,没有被任何变量引用(指向)时,就会被判定为内存中的”垃圾“。Java存在自动垃圾回收器,会定期进行清理

面向对象:编程训练-模拟购物车

1.需求分析、架构搭建

2.添加商品到购物车、查看购物车信息

3.修改购买数量

4.结算支付金额

package com.mochu.project2;

public class Commodity 
    // 商品类
    int id;
    String name;
    double price;
    int quantity;

package com.mochu.project2;
import java.util.Scanner;

public class ShoppingCart 
    // 定义商品类,用于创建购物车对象
    public static void main(String[] args) 
        // 定义购物车对象,使用一个数组对象表示
        Commodity[] shopcart = new Commodity[100];
        while (true) 
            System.out.println("请您选择操作:");
            System.out.println("添加商品到购物车:add");
            System.out.println("查看商品到购物车:view");
            System.out.println("修改商品购买数量:update");
            System.out.println("结算商品的金额:pay");
            Scanner sc = new Scanner(System.in);
            System.out.print("请您输入命令:");
            String command = sc.next();
            switch (command) 
                case "add":
                    add(shopcart, sc);
                    break;
                case "view":
                    view(shopcart);
                    break;
                case "update":
                    update(shopcart, sc);
                    break;
                case "pay":
                    pay(shopcart);
                    break;
                default:
                    System.out.println("没有该功能");
            
        
    
    public static void add(Commodity[] shopcart, Scanner sc) 
        // 录入商品信息
        System.out.print("请输入购买商品编号:");
        int id = sc.nextInt();
        System.out.print("请输入购买商品的名称:");
        String name = sc.next();
        System.out.print("请输入购买商品的数量:");
        int quantity = sc.nextInt();
        System.out.print("请输入商品的价格:");
        double price = sc.nextDouble();
        // 把商品的信息分装成对象
        Commodity cd = new Commodity();
        cd.id = id;
        cd.name = name;
        cd.quantity = quantity;
        cd.price = price;
        // 把商品对象添加到购物车数组中
        for (int i = 0; i < shopcart.length; i++) 
            if (shopcart[i] == null) 
                shopcart[i] = cd;
                break;
            
        
        System.out.println("您的商品已添加到购物车");
    

    public static void view(Commodity[] shopcart) 
        // 查看购物车中的商品信息
        System.out.println("=============购物车信息如下=============");
        System.out.println("编号\\t\\t\\t名称\\t\\t\\t价格\\t\\t\\t数量");
        for (int i = 0; i < shopcart.length; i++) 
            Commodity cd = shopcart[i];
            if (cd != null) 
                // 展示商品信息
                System.out.println(cd.id + "\\t\\t\\t" + cd.name + "\\t\\t\\t" + cd.price + "\\t\\t\\t" + cd.quantity);
            else 
                break;
            
        
    

    public static void update(Commodity[] shopcart, Scanner sc) 
        while (true) 
        System.out.print("请输入需要修改商品的ID:");
        int id = sc.nextInt();
        Commodity cd = getCommodityId(shopcart, id);
        if (cd == null) 
            System.out.println("不存在该商品");
        else 
            System.out.print("请您输入" + cd.name + "商品购买数量:");
            int quantity = sc.nextInt();
            cd.quantity = quantity;
            System.out.println("商品购买数量修改完成");
            view(shopcart);
            break;
            
        
    

    public static Commodity getCommodityId(Commodity[] shopcart, int id) 
        // 遍历寻找商品id与用户输入的id相同的商品
        for (int i = 0; i < shopcart.length; i++) 
            Commodity cd = shopcart[i];
            // 判断商品对象是否为空
            if (cd != null) 
                if (cd.id == id) 
                    return cd;
                else 
                    return null; // 不为空的商品对象中不存在与用户输入的商品id相同的商品,返回为空
                
            
        
        return null; // 遍历完所有商品对象数组也没有找到相同的商品id,返回为空
    

    public static void pay(Commodity[] shopcart) 
        view(shopcart);
        double amount = 0;
        for (int i = 0; i < shopcart.length; i++) 
            Commodity cd = shopcart[i];
            if (cd != null) 
                amount += (cd.price * cd.quantity);
            else 
                break;
            
        
        System.out.println("购物车所有商品总金额为:" + amount + "元");
    

面向对象:构造器、this

构造器的作用:

  • 定义在类型中,可以用于初始化一个类的对象,并返回对象的地址

构造器的格式:

修饰符 类名(形参列表) 
	...


public class Car 
	// 无参数的构造器
	public Car() 
     ...
	

	// 有参数的构造器
	public Car(String name, double price) 
	 ...
	


调用构造器得到对象的格式:
类 变量名称 = new 构造器;

构造器的分类和作用:

  • 无参数构造器(默认存在的):初始化对象时,成员变量的数据均采用默认值
  • 有参数构造器:在初始化对象的时候,同时可以接收参数为对象进行赋值


构造器注意事项:

  • 任何类定义出来,默认就自带了无参数构造器,写不写都有。
  • 一旦定义了有参数构造器,那么无参数构造器就没有了,如果还想用无参数构造器,就需要自己手写一个无参数构造器了。


this关键字是什么

  • 可以出现在构造器、方法中
  • 代表当前对象的地址

this关键字的作用:可以用于指定访问当前对象的成员变量,成员方法。

public Commodity(String name, double price) 
        this.name = name;
        this.price = price;
    

面向对象:封装

  • 面向对象的三大特征:封装、继承、多态
  • 封装:告诉我们,如何正确设计对象的属性和方法
  • 封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为

如何进行更好的封装?

  • 一般建议对成员变量使用private(私有、隐藏)关键字修饰(private修饰的成员只能在当前类中访问)。
  • 为每个成员变量提供配套public修饰的getter、setter方法暴露其取值和赋值

面向对象:标准JavaBean、综合案例

JavaBean也可以称为实体类,其对象可以用于在程序中封装数据

标准JavaBean需满足如下书写要求:

  • 成员变量使用private修饰
  • 提供成员变量对应的setXxx()getXxx()方法
  • 需提供一个无参构造器;有参数构造器是可写不可写的
package com.mochu.JavaBean;

public class Test 
    public static void main(String[] args) 
        User user = new User();
        user.setName("mochu7");
        user.setHeight(180);
        user.setSalary(2500);
        System.out.println(user.getName());
        System.out.println(user.getHeight());
        System.out.println(user.getSalary());
        System.out.println("-----------------");
        User user2 = new User("Slevin", 185, 3000);
        System.out.println(user2.getName());
        System.out.println(user2.getHeight());
        System.out.println(user2.getSalary());
    

package com.mochu.JavaBean;

public class User 
    private String name;
    private double height;
    private double salary;

    public User() 

    

    public User(String name, double height, double salary) 
        this.name = name;
        this.height = height;
        this.salary = salary;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public double getHeight() 
        return height;
    

    public void setHeight(double height) 
        this.height = height;
    

    public double getSalary() 
        return salary;
    

    public void setSalary(double salary) 
        this.salary = salary;
    

成员变量、局部变量的区别

package com.mochu.JavaBean;

public class Test 
    public static void main(String[] args) 
        Movie[] movies = new Movie[3];
        movies[0] = new Movie("《长津湖》", 9.7, "吴京");
        movies[1] = new Movie("《我和我的父亲》", 9.6, "吴京");
        movies[2] = new Movie("《扑水少年》", 9.5, "王川");

        for (int i = 0; i < movies.length; i++) 
            Movie m = movies[i];
            System.out.println("电影名称:" + m.getName());
            System.out.println("电影评分:" + m.getScore());
            System.out.println("电影主演:" + m.getActor());
        

    

package com.mochu.JavaBean;

public class Movie 
    private String name;
    private double score;
    private String actor;

    public Movie() 
    

    public Movie(String name, double price, String actor) 
        this.name = name;
        this.score = price;
        this.actor = actor;
    

    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;
    

    public String getActor() 
        return actor;
    

    public void setActor(String actor) 
        this.actor = actor;
    

String概述、对象创建原理

Sting概述:

  • java.lang.String类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串。
  • Java程序中的所有字符串文字(例如“abc”)都为此类的对象。

String类的特点详解:

  • String其实常被称为不可变字符串类型,它的对象在创建后不能被更改



package com.mochu.project1;

public class StringDemo 
    public static void main(String[] args) 
        // 推荐用法
        String name = "末初";
        System.out.println(name)以上是关于黑马程序员Java教程学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

黑马程序员Java教程学习笔记

黑马程序员Java教程学习笔记

黑马程序员Java教程学习笔记

黑马程序员Java教程学习笔记

黑马程序员Java教程学习笔记

黑马程序员Java教程学习笔记