this
使用细节
- this 关键字可以用来访问本类的属性、方法、构造器
- this 用于区分当前类的属性和局部变量
- 访问成员方法的语法:this.方法名(参数列表)
- 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一 条语句)
- this 不能在类定义的外部使用,只能在类定义的方法中使用。
本章作业(日后一定要回看,作业里有不理解的地方)
这一章有十多个作业,大多是回顾的,虽然都自己先做一遍然后在听老师讲,不过实现代码的方式都不太一样,不知道是我没读懂题目还是本身就有多个解法。记录一道石头剪刀布
package com.exception;
import java.util.Scanner;
public class Test04 {
public static void main(String[] args){
Tom tt = new Tom();
Scanner sca = new Scanner(System.in);
int score = 0 ;
while (true){
System.out.println("请按数字键出招:0石头,1剪刀,2布(其他任意键退出游戏)");
int attack = sca.nextInt();
if(attack == 0 || attack ==1 || attack ==2){
score += tt.fingerGuess(attack);
}else{
System.out.println("总共赢了" + score + "次");
System.out.println(attack + "退出游戏");
return;
}
}
}
}
class Tom{
int defense;
public int fingerGuess(int attack){
switch (attack){
case 0:
System.out.println("你使用了---石头!");
break;
case 1:
System.out.println("你使用了---剪刀!");
break;
case 2:
System.out.println("你使用了---布!");
break;
}
defense = (int)(Math.random()*3);
switch (defense){
case 0:
System.out.println("电脑使用了-石头!");
break;
case 1:
System.out.println("电脑使用了-剪刀!");
break;
case 2:
System.out.println("电脑使用了-布!");
break;
}
if(attack - defense == 0){
System.out.println("平局");
return 0;
}else if(attack - defense == -1 || attack - defense == 2){
System.out.println("你赢了!");
return 1;
}else{
System.out.println("你输了!");
return 0;
}
}
}
老师的方法和我的有点不一样,老师是通过判断石头剪刀布 ,三种出法,能赢的三种情况 ,然后剩下的平局,然后就是输来做思路,而我是统计了0 1 2之间的差数来确定输赢
//老师使用的一种没见过的随机数方法
Random r = new Random();
int a = r.nextInt(3); //0 1 2中的一个随机数
IDEA 快捷键
- Ctrl + Alt + L 快速格式化代码
- 快速运行 Alt + R
- 导入该行需要的类 Alt + Enter
- Ctrl + d 复制当前行
- Alt + d 删除当前行
- Alt + / 补全代码
- Alt + Insert 生产构造器
- Ctrl + H 查看一个类的层级关系
- Ctrl +B 可以快速定位方法的位置
- .var 自动分配变量名
自己添加模版 Settings - Editor - Live Templates - Java " + "
包
包的本质就是文件夹,用于区分不同项目。
只能包含数字、字母、下划线、小圆点 ( . ),但不能用数字开头,不能是关键字或者保留字。
规范 com.公司名.项目名.业务模块
一个包下,包含很多的类,java 中常用的包有:
//1) java.lang.* --lang 包是基本包,默认引入,不需要再引入
//2) java.util.* --util 包,系统提供的工具包, 工具类,使用 Scanner
//3) java.net.* --网络包,网络开发
//4) java.awt.* --是做 java 的界面开发,GUI
package 的作用是声明当前类所在的包,需要放在类(或者文件)的最上面, 一个类中最多只有一句 package
import 指令 位置放在 package 的下面,在类定义前面,可以有多句且没有顺序要求
访问修饰符
java 提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围):
- 公开级别:用 public 修饰,对外公开
- 受保护级别:用 protected 修饰,对子类和同一个包中的类公开
- 默认级别:没有修饰符号,向同一个包的类公开.
- 私有级别:用 private 修饰,只有类本身可以访问,不对外公开
访问控制修饰符 | 同类 | 同包 | 子类 | 不同包 | |
---|---|---|---|---|---|
1 | public | √ | √ | √ | √ |
2 | protected | √ | √ | √ | X |
3 | 没有修饰符 | √ | √ | X | X |
4 | private | √ | X | X | X |
注意事项:
- 修饰符可以用来修饰类中的属性 ,成员方法以及类
- 只有默认的和public才能修饰类,并遵循表格的访问权限特点
- 成员方法的访问规则和属性完全一样
封装 (重要)
封装(encapsulation) 就是把抽象出的数据[属性] 和对数据的操作[方法] 封装在一起, 数据被保护在内部,程序的其它部分只有通过被授权的操作[方法],才能对数据进行操作。同样适用Alt + Insert快捷键
封装的好处:
- 隐藏实现细节:方法(连接数据库)<–调用(传入参数…)
- 可以对数据进行验证,保证安全合理
封装的实现步骤(三步):
- 将属性进行私有化private【不能直接修改属性】
- 提供一个公共的(public) set方法, 用于对属性判断并赋值
- 提供一个公共的(public) get方法, 用于获取属性的值
public void set Xxx(类型参数名){ //Xxx表示某个属性
//加入数据验证的业务逻辑
属性=参数名;
}
public数据类型get Xxx() {//权限判断, Xxx某个属性
return xx;
}
将构造器和 setXxx 结合
把setXxx方法写进有参构造器内,防止通过构造器传参修改。
课堂练习
创建程序,在其中定义两个类:Account 和 AccountTest 类体会 Java 的封装性。
Account 类要求具有属性:姓名(长度为 2 位 3 位或 4 位)、余额(必须>20)、
密码(必须是六位), 如果不满足,则给出提示信息,并给默认值(程序员自己定)
通过 setXxx 的方法给 Account 的属性赋值。
在 AccountTest 中测试
public class Account {
private String name;
private double money;
private String password;
public Account() {
}
public Account(String name, double money, String password) {
this.setName(name);
this.setMoney(money);
this.setPassword(password);
}
public String getName() {
return name;
}
public void setName(String name) {
if(name.length() == 2 || name.length() == 3
|| name.length() == 3) {
this.name = name;
}else{
System.out.println("输入姓名有误,长度应在2-4之间,设为 默认值张三");
this.name = "张三";
}
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
if(money > 20){
this.money = money;
}else{
System.out.println("输入余额错误,余额应大于20,设为 默认值8.8888");
this.money = 8.8888;
}
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
if(password.length() == 6){
this.password = password;
}else{
System.out.println("输入密码有误,请输入六位密码,设为默认000000");
this.password = "000000";
}
}
public void info(){
System.out.println("name=" + name + "\tmoney=" + money
+ "\tpassword=" + password);
}
}
public class AccountTest {
public static void main(String[] args) {
Account account = new Account();
account.setName("哈哈哈");
account.setMoney(333);
account.setPassword("333333");
account.info();
}
}