Java学习(语法1)

本文详细介绍了Java中的包、导包机制,权限修饰符的作用,final关键字在类、方法和变量上的应用,以及常量和枚举的使用。通过实例展示了如何在实际编程中运用这些概念来组织代码和管理信息。
摘要由CSDN通过智能技术生成

前言

现在只需要明白语法的基本作用,在以后的实践中逐步加深了解。

概述

是什么: 包是用来分门别类地管理各种不同类的,类似于文件夹,建包有利于程序的管理和维护。
**建包的语法格式:**package公司域名倒写.技术名称。
例如:package com.zbx.javabean

建包语句必须放在第一行,一般IDEA工具会帮忙创建。

导包

导包格式:import 包类.类名

  1. 相同包下的类可以直接访问,不同包下的类必须导包,才可以使用。
  2. 如果这个类中使用不同包下的相同类名,此时默认只能导入一个类的包,另一个类要用全名访问。

权限修饰符

概述

是什么:权限修饰符可以用来控制一个成员能被访问的范围。
作用:

可以修饰成员变量,方法,构造器,内部类,不同修饰符修饰的成员能够被访问的范围将受到限制。

权限修饰符的分类和具体作用范围

权限修饰符有四种作用范围,从小到大分别是:private->缺省->protected->public

注意:
protected修饰的成员在不同包下的子类虽然可以使用,但是需要创建子类对象来访问。

定义成员时的要求

  1. 成员变量一般私有。
  2. 成员方法一般公开。
  3. 如果该成员只希望本类访问,使用private修饰。
  4. 如果该成员只希望本类,同一个包下的其他类和子类访问,使用protected修饰。

final

概述

final关键字: 最终的意思,可以修饰类、方法、变量。

  • 修饰类:表明该类是最终类,不能被继承。
  • 修饰方法:表明该方法是最终方法,不能被重写。
  • 修饰变量:表示该变量能且只能赋值一次。

修饰变量只能赋值一次必须在创建这个成员变量的时候就要赋值,不然会报错。

注意事项

  1. final修饰的变量是基本类型:那么存储的数据不能发生改变。
  2. final修饰的变量是引用类型:那么存储的地址不能发生改变,但是地址指向的对象内容可以改变。
class Teacher {
    private String hobby;

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public Teacher(String hobby){
        this.hobby = hobby;
    }

    public static void main(String[] args) {
        final Teacher t1 = new Teacher("学习");
        //t1 = null;//这里会报错!!!
        System.out.println(t1.hobby);
        t1.setHobby("吃饭!");
        System.out.println(t1.hobby);
    }
}

常量

概述

是什么:常量是使用了public static final修饰的成员变量,必须有初始值,并且执行的过程中不能被修改。
作用和好处:

可以用于做系统的配置信息,方便程序的维护,同时也能提高可读性。

命名规范

  1. 英文单词全部大写。
  2. 多个单词用下划线连接起来。

例子:public static final String SCHOOL_NAME = "计算机";

执行原理

  1. 在编译阶段会进行“宏替换”,把使用常量的地方全部替换真实的字面量。
public class NAME {
    public static final String NAME = "zbx";
    public static void main(String[] args) {
        System.out.println(NAME);
        System.out.println(NAME);
        System.out.println(NAME);
        System.out.println(NAME);
        System.out.println(NAME);
        System.out.println(NAME);
        System.out.println(NAME);
    }
}

这个代码编译后的样子是:
image.png

  1. 这样做的好处是让使用常量的程序执行性能和直接使用字面量是一样的。

常量做信息标志和分类

案例:
现在开发超级玛丽游戏需要接收用户输入的四个方向的信号,以便控制玛丽的运动方向。

import javax.swing.*;
import java.awt.event.ActionEvent;

public class Mary {
    public static final int UP = 1;
    public static final int DOWN = 2;
    public static final int LEFT = 3;
    public static final int RIGHT = 4;

    public static void main(String[] args) {
        JFrame win = new JFrame();
        JPanel panel = new JPanel();
        win.add(panel);
        JButton btn1 = new JButton("上");
        JButton btn2 = new JButton("下");
        JButton btn3 = new JButton("左");
        JButton btn4 = new JButton("右");
        panel.add(btn1);
        panel.add(btn2);
        panel.add(btn3);
        panel.add(btn4);
        win.setLocationRelativeTo(null);
        win.setSize(300,400);
        win.setVisible(true);

        btn1.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                move(UP);
            }
        });
        btn2.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                move(DOWN);
            }
        });
        btn3.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                move(LEFT);
            }
        });
        btn4.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                move(RIGHT);
            }
        });
    }
    public static void move(int flag){
        switch(flag){
            case UP :
                System.out.println("玛丽向上飞了一下~");
                break;
            case DOWN:
                System.out.println("玛丽向下蹲了一下~");
                break;
            case LEFT:
                System.out.println("玛丽向左跑~");
                break;
            case RIGHT:
                System.out.println("玛丽向右跑~");
                break;
        }
    }
}

现在还不能理解这里的代码的意思,只是作为例子用来说明常量做信息标志作用~

结果会出现一个界面:
image.png
之后,可以通过代码实现按界面上的“上下左右”来实现传递信息“上下左右”给方法move来实现玛丽的运动,这里不再往后写,用文字输出代替。
image.png
好处: 代码可读性好,实现了软编码形式。

软编码就是通过软件程序进行编码。

枚举

概述

是什么:Java中的一种特殊类型。
作用:是为了做信息的标志和信息的分类(与常量相似)
格式:

修饰符 enum 枚举名称{
第一行都是罗列枚举类实例的名称!
}

enum Season{
    SPRING,SUMMER,AUTUMN,WINTER;//只能有这四个对象!
}

反编译后观察枚举的特征

image.png

高级语言源程序经过编译变成可执行文件,反编译就是逆过程。 但是通常不能把可执行文件变成高级语言源代码,只能转换成汇编程序

枚举的特征

  1. 枚举类都是继承了枚举类型:java.lang.Enum。
  2. 枚举都是最终类,不可以被继承。
  3. 枚举的构造器都是私有的,枚举对外不能创建对象。
  4. 枚举类的第一行默认都是罗列枚举对象的名称。
  5. 枚举类型相当于是多例模式。

枚举做信息标志和分类

作用: 入参严谨(只有罗列的那几个),代码优雅~

每日一练:发红包(普通)

案例:
设计一个程序,实现发红包抢红包(普通红包)
分析:

  1. 首先,群主和成员都是用户,他们都可以归为用户类,通过继承实现他们的关系。
  2. 群主发的一笔金额(红包),从群主余额中扣除,平均分成n等份,让大家领取;大家领取红包后,保存到成员各自的余额中。

最终代码:

public class Users {
    private String name;
    private double leftMoney;
    private double data;
    //构建无参构造器
    public Users() {

    }

    //构建有参构造器
    public Users(String name, double leftMoney) {
        this.name = name;
        this.leftMoney = leftMoney;
    }

    public double getData() {
        return data;
    }

    public void setData(double data) {
        this.data = data;
    }

    public String getName() {
        return name;
    }

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

    public double getLeftMoney() {
        return leftMoney;
    }

    public void setLeftMoney(double leftMoney) {
        this.leftMoney = leftMoney;
    }
    //展示信息方法
    public void show(){
        System.out.println(name+"有"+leftMoney+"元。");
    }
    public void show(double data){
        System.out.println(name+"抢了"+data+"元,"+"现在有"+leftMoney+"元。");
    }
}

import java.util.ArrayList;
import java.util.Random;
public class Member extends Users{
    public Member() {
    }

    public Member(String name, double leftMoney) {
        super(name, leftMoney);
    }

    //从红包集合中随机取出一份给自己
    public void receive(ArrayList<Double> list){
        Random random = new Random();
        //从集合中选出一个编号取出,并在集合中删除该数据
        int index = random.nextInt(list.size());
        double data = list.remove(index);
        super.setData(data);
        super.setLeftMoney(super.getLeftMoney()+data);
    }
}
public class Manager extends Users{
    public Manager() {
    }

    public Manager(String name, double leftMoney,double data) {
        super(name, leftMoney);
    }
    public ArrayList<Double> send(double money, int count){
        double leftMoney = getLeftMoney();
        //创建一个集合保存红包金额
        ArrayList<Double> list = new ArrayList<>();
        //查看能否发红包
        if(money >leftMoney){
            System.out.println("余额不足,发送失败!");
            return null;
        }
        //修改余额
        super.setLeftMoney(leftMoney - money);
        //平均分配红包,如果无法平分,多的给最后一个
        money *= 100;
        //求平分的整数
        int aver = (int)money / count;
        //求未能平分的部分
        int mod = (int)money % count;
        //先发放前面的
        for (int i = 0; i < count-1; i++) {
             list.add(aver/100.0);
        }
        //发放最后一个的
        list.add((aver+mod)/100.0);
        return list;
    }
    public void receive(ArrayList<Double> list){
        Random random = new Random();
        //从集合中选出一个编号取出,并在集合中删除该数据
        int index = random.nextInt(list.size());
        double data = list.remove(index);
        super.setData(data);
        super.setLeftMoney(super.getLeftMoney()+data);
    }
}

import java.util.ArrayList;
import java.util.Scanner;
import static java.lang.System.exit;
public class TestDemo {
    //分别定义用户类,群主类,群员类
    //分别创建一个群主多个群员(总数即为红包个数)
    public static void main(String[] args) {
        Manager manager = new Manager("群主",200.0,0.0);
        Member m1 = new Member("张三",0.0);
        Member m2 = new Member("李四",1.0);
        Member m3 = new Member("王五",2.1);
        Member m4 = new Member("赵六",0.6);
        //显示初始金额
        System.out.println("======================");
        manager.show();
        m1.show();
        m2.show();
        m3.show();
        m4.show();
        System.out.println("======================");
        //输入红包金额
        System.out.print("请您输入要发送红包的金额:");
        Scanner sc = new Scanner(System.in);
        double money = sc.nextDouble();
        //发送红包
        ArrayList<Double> list = manager.send(money,5);
        if(list == null){
            exit(1);
        }
        //抢红包
        System.out.println("======================");
        System.out.println("大家正在抢红包~");
        manager.receive(list);
        m1.receive(list);
        m2.receive(list);
        m3.receive(list);
        m4.receive(list);
        System.out.println("======================");
        //显示余额
        manager.show(manager.getData());
        m1.show(m1.getData());
        m2.show(m2.getData());
        m3.show(m3.getData());
        m4.show(m4.getData());
        System.out.println("======================");
    }
}

运行结果:
image.png
image.png

这只是一个普通红包的发送和接收,还不能实现拼手气红包0.0

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值