java基础之面向对象编程

学习java语言的一些基础知识

学习打卡,先回忆一些以前学习java 的基础知识,这里稍微总结一下,如有遗漏后续补充

java的语言特性

我们谈到java首先不得不说它是一个面向对象的高级编程语言。因为这种语言特性,java语言适合处理很多复杂的业务逻辑。面向对象有三个基本特征:

  1. 封装 :封装是指不应该在对象里把一些只属于自己的业务逻辑或者处理方法和一些参数变量直接暴露给其他的对象或者方法,应该对外提供一些可访问的方式,而不是直接将这些暴露在外面。
    举个例子:如果我想要去商店买一个苹果。我不需要知道商店是如何将这个苹果从某某地方运送过来,果园如何种出来这个苹果,商店不需要对我提供这些属于自己的东西,只需要提供给我买苹果的这个方式就可以了。

  2. 继承 :继承是属于多个类或对象之间相互有关联的时候所涉及到的处理方式。如果两个对象有一些共同的属性或方法,那么我们可以将这些共有的东西单独抽出来,然后让这两个对象去继承这个抽出来的父类对象,那么这时候我们就说这两个对象同时继承了一个父类对象,他们同时拥有父类对象拥有的所有方法与属性。因为这种模式类似于生活中的这种父子关系,儿子总是能从父亲那里遗传一些父类自己的基因,所以我们把这种叫父子关系,我们说子类继承了父类。
    举个例子:我们日常中能见到很多的比如汽车,轮船,飞机等这些交通工具,他们之间有一个共同点就是他们都属于一种叫交通工具的事物,交通工具有一些共同的特点,他们都有运输方式,运输数量,运输速度,以及运输的花费金额,当他这些交通工具都拥有了同样的属性以后,我们就可以把他们这种共同属性抽象成一个公共的交通工具对象。那么我们可以认为汽车、轮船、飞机都是属于交通工具的子类,交通工具是他们的父类,汽车、轮船、飞机都是继承了交通工具,这时候汽车轮船和飞机不需要再自己定义属性就会自动拥有父类的这些属性。

  3. 多态 :多态这种定义本身也是从自然生活中所总结的一种规律,其实我们java面向对象大多数时候都是从生活中得到的启发。多态性我们一般在java种有两种:1. 方法的多态, 2. 对象的多态。
    (1)方法的多态分为两种实现:1. 方法的重写,2. 方法的重载
    方法的重写可以认为是一个对象的一些方法,他可以有不同的实现方式。他一般发生在有继承关系的两个对象之间。
    举个例子:上面我们说到的交通工具的运输方式和汽车、轮船和飞机的运输方式之间存在着这样的一种多种实现运输方式的形态我们把他称为交通工具的运输方式具有多态性。
    方法的重载,他存在于同一个对象中,比如一个对象他可以实现一个功能,但是他却可以通过多种条件来实现这个功能,而这个功能的名字却是相同的。
    举个例子:我有一个计算器对象,他有一个功能是加法计算。但是我可以给他传入两个数让它去做加法运算也可以传给它三个、四个去让它做加法运算。他都可以实现,而且实现的这种功能叫做加法。
    (2)对象的多态也分为两种实现:1. 向上造型, 2.向下造型
    向上造型:对象的多态也是需要基于两个对象之间有继承关系的前提下,我们可以把子类的对象交给父类的对象来管理,这时候就发生了向上造型。
    举个例子:Vehicle vehicle = new Car(); 这是什么意思呢,换句话就是说汽车是一种交通工具。
    向下造型:向下造型是当我们把父类对象交给子类去管理的时候发生的。一般情况,向下造型是不安全的。
    举个例子:Car car = new Vehicle();这是说的我们创建出来的交通工具是汽车,这时候我们的交通工具可能其实是轮船,那么我们这样写就是说轮船是汽车,肯定是不对的。当然,如果我们创建的交通工具的确是汽车,我们可以把当前创建的对象转换成汽车对象后再交给Car去管理。
    Car car = (Car)new Vehicle();

基于面向对象的编程实例

public class Game {

    private Room currentRoom;

    private Map<String,Handler> handlerMap = new HashMap<>();
        
    public Game() {
        //handlerMap.put("go",HandlerGo());
        createRooms();
    }


    private void createRooms() {

        Room outside, lobby, pub, study, bedroom;
      
        //	制造房间
        outside = new Room();
        outside.setDescription("城堡外");
        lobby = new Room();
        lobby.setDescription("大堂");
        pub = new Room();
        pub.setDescription("小酒吧");
        study = new Room();
        study.setDescription("书房");
        bedroom = new Room();
        bedroom.setDescription("卧室");
        
        //	初始化房间的出口
        outside.setExits("east", lobby);
        outside.setExits("south", study);
        outside.setExits("west", pub);
        lobby.setExits("west", outside);
        pub.setExits("east", outside);
        study.setExits("north", outside);
        study.setExits("east", bedroom);
        bedroom.setExits("west", study);

        currentRoom = outside;  //	从城堡门外开始
    }

    private void printWelcome() {
        System.out.println();
        System.out.println("欢迎来到城堡!");
        System.out.println("这是一个超级无聊的游戏。");
        System.out.println("如果需要帮助,请输入 'help' 。");
        System.out.println();
        this.showPrompt();
    }

    // 以下为用户命令
    private void printHelp() {
        System.out.print("迷路了吗?你可以做的命令有:go bye help");
        System.out.println("如:\t go east");
    }

    private void goRoom(String direction) {
        Room nextRoom = null;
        if (null != direction) {
            nextRoom = currentRoom.getLinkedRooms().get(direction);
        }
        if (nextRoom == null) {
            System.out.println("那里没有门!");
        } else {
            currentRoom = nextRoom;
            this.showPrompt();
        }
    }

    public void showPrompt() {

        StringBuffer sb = new StringBuffer();
        sb.append("你在:").append(currentRoom.getDescription()).append(",").append("出口有: ");

        for (Map.Entry<String,Room> entry :currentRoom.getLinkedRooms().entrySet()) {
            sb.append(entry.getKey()).append(" ");
        }
        System.out.println(sb.toString());
    }

    public void play () {
        Scanner scanner = new Scanner(System.in);

        while ( true ) {
            String line = scanner.nextLine();
            String[] words = line.split(" ");

            Handler handler = handlerMap.get(words[0]);
            if (null != handler) {
                handler.doCmd(words[0]);
            }
            if ( words[0].equals("help") ) {
                this.printHelp();
            } else if (words[0].equals("go") ) {
                this.goRoom(words[1]);
            } else if ( words[0].equals("bye") ) {
                break;
            }
        }
        scanner.close();

    }

	public static void main(String[] args) {

		Game game = new Game();
		game.printWelcome();
        game.play();
        System.out.println("感谢您的光临。再见!");
	}

}

public class Room {

    //房间描述
    private String description;

    //房间出口方向对应的建筑
    private Map<String,Room> linkedRooms = new HashMap<>();

//    public Room northExit;
//    public Room southExit;
//    public Room eastExit;
//    public Room westExit;

    public void setExits(String direction, Room room) {
        linkedRooms.put(direction,room);
    }

//    public void setExits(Room north, Room east, Room south, Room west) {
//        if(north != null)
//            northExit = north;
//        if(east != null)
//            eastExit = east;
//        if(south != null)
//            southExit = south;
//        if(west != null)
//            westExit = west;
//    }


    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Map<String, Room> getLinkedRooms() {
        return linkedRooms;
    }

    public void setLinkedRooms(Map<String, Room> linkedRooms) {
        this.linkedRooms = linkedRooms;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值