封装 继承 多态的一些详细说明:
面向对象:(最长问的面试问题就是这里面的what when where why whom how)
类与对象的关系:类是对象的抽象对象是类的实现
类是由属性和方法组成,他的每一个对象都有对应的属性和方法
方法:
1方法的重载和重写
方法重载:方法名相同 参数列表不同 与其他无关(针对同一个行为的多种表现对应相同方法名的多个方法)
2类方法=static方法
类名.方法()或者对象.方法()调用
封装:
为了保护属性值不被随意修改 私有化属性并提供getter/setter对外接口
继承:
为了少写代码代码重用 继承是多态的基础 extends关键字 默认的跟类是Object java里是单根继承但可传根
方法的重写:
有继承关系()可以是子与爷爷 方法名相同参数列表相同返回值相同或小于父类访问修饰符不能小于父类异常不能多余父类(严于)
构造方法:默认的构造方法都会先走父类无参构造方法 用super指定的构造方法,调用指定的构造方法前也是先走父类的无参构造
多态:
以父类做参数类型的:(父类不仅仅是类型 可以是接口)
父类中的方法如果被子类重写,那么在使用父类类型调用该方法时则看具体的子类类型,决定调用的是哪个重写后的方法
以父类做返回值类型的:
如果只调用父类方法则没有问题
如果需要调用子类特有方法, 则需要向下强制转型
抽象类和接口:
abstrac关键字定义抽象类和抽象方法
interface关键字定义接口
implements关键字实现接口
抽象类和接口的异同点:
同:都不能被实例化 都可以有抽象方法
不同:接口的所有方法都默认是public abstract类型 接口的所有属性都默认是public static final类型
抽象类用来被继承 主要的目的是代码重用 只能继承一个类
接口主要用来扩展功能 可以实现多个接口
异常:
异常的分类:Throwable(Error,Exception)
Exception(check异常和运行期异常RuntimeExcepton)
异常的处理:
try{有可能产生异常的代码}
catch{打印堆栈 打印异常信息}(有可能的异常类型 e)
finally{最终快,用于关闭资源}
自定义异常:继承已知的异常类 写出有参构造方法 并用super调用父类的有参构造(这一步可以没有)
#2QuickHit
/**
-
@Author taomin
-
@Date 2020/7/26
-
@Description
*/
public class Game {
Player player=new Player();//当前玩家
public Game(Player player) {
super();
this.player = player;
}public String printStr(){
//对字符串进行增删改查
StringBuffer buffer = new StringBuffer();
//创建随机数对象
Random random = new Random();
//循环生成对应玩家等级长度的字符串
for (int i = 0;i < Level.levels[player.getLevelNo() – 1].getStrLength();i++ )
{
//每次循环就产生一个随机数
int rand = random.nextInt(6);
//拼接产生随机数所对应的字符串
switch (rand)
{
case 0:{
buffer.append(\”>\”);
break;
}
case 1:{
buffer.append(\”<\”);
break;
}
case 2:{
buffer.append(\”*\”);
break;
}
case 3:{
buffer.append(\”&\”);
break;
}
case 4:{
buffer.append(\”%\”);
break;
}
case 5:{
buffer.append(\”#\”);
break;
}
}
}
//输出所生成的字符串,让玩家可以对应着输入
System.out.println(buffer.toString());
//返回生成的字符串
return buffer.toString();
}
//对比系统生成的字符串和玩家输入的字符串是否一样
public void printResult(String out,String in){if(out.equals(in)){long currentTime=System.currentTimeMillis();//如果超时if((currentTime-player.getStartTime())/1000>Level.levels[player.getLevelNo()-1].getTimeLimit()){System.out.print(\"你输入太慢了,已经超时,退出!\");System.exit(1);//如果没有超时}else {//计算玩家当前积分player.setCurrScore(player.getCurrScore()+Level.levels[player.getLevelNo()-1].getPerScore());//计算玩家以用时间player.setElapsedTime((int) ((currentTime - player .getStartTime()) / 1000));//输出玩家当前级别,当前积分和以用时间System.out.println(\"输入正确,您的级别\"+player.getLevelNo()+\",您的积分\"+player.getCurrScore()+\",已用时间\"+player.getElapsedTime()+\"秒\");//判断用户是否已经闯过最后一关并处理if(player.getLevelNo()==6){int score=Level.levels[player.getLevelNo() - 1].getPerScore() * Level.levels[player.getLevelNo() - 1].getStrTimes();if(player.getCurrScore()==score){System.out.println(\"恭喜您,通关成功!\");}else{System.out.println(\"输入错误,退出!\");System.exit(0);//等于0正常退出 为1或者-1就是非正常退出}}}}else{System.out.println(\"输入错误\");System.out.println(\"正确的是\"+out);System.exit(0);}
}
}
port java.util.Scanner;
/**
-
@Author taomin
-
@Date 2020/7/26
-
@Description
*/
public class Player {
//当前级别号
private int levelNo;
//当前级别积分
private int currScore;
//当前级别开始时间
private long startTime=0;
//当前级别以用时间
private int elapsedTime;
public int getLevelNo() {
return levelNo;
}
public void setLevelNo(int levelNo) {
this.levelNo = levelNo;
}
public int getCurrScore() {
return currScore;
}
public void setCurrScore(int currScore) {
this.currScore = currScore;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public int getElapsedTime() {
return elapsedTime;
}
public void setElapsedTime(long l) {
this.elapsedTime = (int) l;
}
public Player(int levelNo, int currScore, long startTime, int elapsedTime) {
super();
this.levelNo = levelNo;
this.currScore = currScore;
this.startTime = startTime;
this.elapsedTime = elapsedTime;
}
public Player() {
// super();
}
public void play(){
Game game=new Game(this);
// game.setPlayer(this);
Scanner scanner = new Scanner(System.in);
//外层循环代表着等级
for (int i = 0;i < Level.levels.length ;i++ )
{
//玩家晋级
levelNo += 1;
//获得新的游戏开始时间
startTime = System.currentTimeMillis();
//每次晋级玩家积分清零
currScore = 0;
//内层循环代表着每个级别所需要玩的次数
for (int j = 0; j < Level.levels[i].getStrTime() ; j++ )
{
//系统生成的字符串
String out = game.printStr();
//玩家输入的字符串
String in = scanner.next();
//比较,产生结果
game.printResult(out,in);
}
}
}
public static void main(String[] args) {
Player player = new Player();
player.play();
}
}//System.currentTimeMillis();这个方法可以获取当前时间记住就行 -
@Author taomin
-
@Date 2020/7/26
-
@Description
*/
public class Level {
private int levelNo; // 级别号
private int strLength; // 各级别一次输出字符串的长度
private int strTime; // 各级别输出字符 串的次数
private int timeLimit; // 各级别闯关的时间限制
private int perScore; // 各级别成功输入一次字符串后增加的分值
public final static Level levels[]=new Level[6];
static {
levels[0]=new Level(1, 2, 10, 30,1);
levels[1]=new Level(2, 3, 9, 26,2);
levels[2]=new Level(3, 4, 8, 22,5);
levels[3]=new Level(4, 5, 7, 18,8);
levels[4]=new Level(5, 6, 6, 15,10);
levels[5]=new Level(6, 7, 5, 12,15);
}public Level(int levelNo, int strLength, int strTime, int timeLimit,int perScore) {
// super();
this.levelNo = levelNo;
this.strLength = strLength;
this.strTime = strTime;
this.timeLimit = timeLimit;
this.perScore = perScore;
}
public int getLevelNo() {
return levelNo;
}
public void setLevelNo(int levelNo) {
this.levelNo = levelNo;
}
public int getStrTime() {
return strTime;
}
public void setStrTime(int strTime) {
this.strTime = strTime;
}
public Level() {
super();
}
public int getLeveNo() {
return levelNo;
}
public void setLeveNo(int leveNo) {
this.levelNo = levelNo;
}
public int getStrLength() {
return strLength;
}
public void setStrLength(int strLength) {
this.strLength = strLength;
}
public int getStrTimes() {
return strTime;
}
public void setStrTimes(int strTimes) {
this.strTime = strTimes;
}
public int getTimeLimit() {
return timeLimit;
}
public void setTimeLimit(int timeLimit) {
this.timeLimit = timeLimit;
}
public int getPerScore() {
return perScore;
}
public void setPerScore(int perScore) {
this.perScore = perScore;
}
}