封装(encaosulation)
封装就是把抽象的数据【属性】和对数据的操作【方法】封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作【方法】,才能对数据进行操作。
封装的理解和好处:
隐藏实现细节---调用方法(传入参数)
可以对数据进行验证,保证安全合理
封装的实现步骤(三步曲)
将属性进行私有化(不能直接修改属性)
提供一个公共的(public)set方法,用于对属性判断并赋值
public void setXxx(类型 参数名){//Xxx表示某个属性
//加入数据验证的业务逻辑
属性 = 参数名;
}
提供一个公共的(public)get方法,用于获取属性的值
public 数据类型 getXxx(){//权限判断,Xxx表示某个属性
return xx;
}
继承:
继承可以解决代码复用,让我们的编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可
继承的基本语法:
class 子类 extends 父类 {
}
- 子类会自动拥有父类定义的属性和方法
- 父类又叫超类,基类
- 子类又叫派生类
继承给编程带来的便利:
- 代码的复用性提高了
- 代码的扩展性和维护性提高了
继承的深入讨论/细节问题
- 子类继承了所有的属性和方法,非私有的属性和方法可以在子类中直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供的公共的方法去访问。
- 子类必须调用父类的构造器,完成父类的初始化。
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
- 如果希望指定去调用父类的某个构造器,则显示的调用一下:super(参数列表)。
- super在使用时,必须放在构造器第一行。
- super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器。
- java所有类都是Object类的子类,Object类是所有类的基类。
- 父类构造器的调用不限于直接父类!将一直往上追溯直到Object类(顶级父类)。
- 子类最多只能继承一个父类(指直接继承),即java中是单继承机制。
- 不能滥用继承,子类和父类之间必须满足is-a的逻辑关系。
package practice01;
import java.util.Scanner;
public class Homework14 {
public static void main(String args[]) {
Roshambo ra = new Roshambo();
boolean flag = true;
Scanner sa = new Scanner(System.in);
while(flag) {
ra.gamer();
System.out.println("请问玩家是否继续游戏 Y-是 N-否");
String in = sa.next();
if((in.toUpperCase() == null || in.toUpperCase().equals(""))
|| !(in.toUpperCase().equals("Y") || in.toUpperCase().equals("N"))) {
System.out.println("请您重新输入:");
}else {
if(in.toUpperCase().equals("N")) {
System.out.println("游戏即将退出");
flag = false;
}
}
}
}
}
//有个人 Tom 设计他的成员变量.成员方法,可以电脑猜拳
//电脑每次都会随机生成 0,1,2
//0 表示 石头 1 表示剪刀 2 表示 布
//并要可以显示 Tom的输赢次数 (清单)
class Roshambo{
int player;
int machine;
int winCount;
int defeatCount;
int gameCount;
public Roshambo() {
}
public void gamer() {
Scanner sc = new Scanner(System.in);
System.out.println("游戏现在开始,规则如下所述:");
System.out.println("0-石头 1-剪刀 2-布");
System.out.println("请玩家进行出拳:");
String in = sc.next();
Double va = validate(in);
if(va == null) {
return;
}
machine = (int) (Math.random() * 2 + 1);
int result = compare();
if(result == 0) {
System.out.println("此局为平局");
}else if(result > 0) {
System.out.println("恭喜玩家本局获得胜利");
winCount ++;
}else {
System.out.println("本局电脑玩家获胜");
defeatCount ++;
}
System.out.println("玩家获胜次数" + winCount);
}
public Double validate(String in) {
if(in == null || in.isEmpty()) {
System.out.println("输入不能为空,请重新输入");
return null;
}else if(!(in.equals("1") || in.equals("2") || in.equals("0"))) {
System.out.println("您的输入项不在规则之内");
return null;
}else {
player = Integer.parseInt(in);
return 0.0;
}
}
public int compare() {
gameCount ++;
if(machine == player) {
return 0;
}
if(machine == 0) {
System.out.println("机器出拳为石头");
if(player == 1) {
return -1;
//System.out.println("这一轮人机机器获胜");
}else {
return 1;
//System.out.println("恭喜玩家获得胜利");
}
}else if(machine == 1) {
System.out.println("机器出拳为剪刀");
if(player == 0) {
return 1;
//System.out.println();
}else {
return -1;
}
}else {
System.out.println("机器出拳为布");
if(player == 0) {
return -1;
}else {
return 1;
}
}
}
}