面向对象编程---封装、继承

封装(encaosulation)

封装就是把抽象的数据【属性】和对数据的操作【方法】封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作【方法】,才能对数据进行操作。

封装的理解和好处:

隐藏实现细节---调用方法(传入参数)

可以对数据进行验证,保证安全合理

封装的实现步骤(三步曲)

将属性进行私有化(不能直接修改属性)

提供一个公共的(public)set方法,用于对属性判断并赋值

public void setXxx(类型 参数名){//Xxx表示某个属性
    //加入数据验证的业务逻辑
    属性 = 参数名;
}

提供一个公共的(public)get方法,用于获取属性的值

public 数据类型 getXxx(){//权限判断,Xxx表示某个属性
    return xx;
}

继承:

继承可以解决代码复用,让我们的编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可

继承的基本语法:

class 子类 extends 父类 {
}

  • 子类会自动拥有父类定义的属性和方法
  • 父类又叫超类,基类
  • 子类又叫派生类

继承给编程带来的便利:

  1. 代码的复用性提高了
  2. 代码的扩展性和维护性提高了

继承的深入讨论/细节问题

  1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类中直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供的公共的方法去访问。
  2. 子类必须调用父类的构造器,完成父类的初始化。
  3. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
  4. 如果希望指定去调用父类的某个构造器,则显示的调用一下:super(参数列表)。
  5. super在使用时,必须放在构造器第一行。
  6. super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器。
  7. java所有类都是Object类的子类,Object类是所有类的基类。
  8. 父类构造器的调用不限于直接父类!将一直往上追溯直到Object类(顶级父类)。
  9. 子类最多只能继承一个父类(指直接继承),即java中是单继承机制
  10. 不能滥用继承,子类和父类之间必须满足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;
			}
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值