zoukankan      html  css  js  c++  java
  • 20175316盛茂淞 2018-2019-2 《Java程序设计》第5周学习总结

    20175316盛茂淞 2018-2019-2 《Java程序设计》第5周学习总结

    教材学习内容总结

    第六章 接口与实现、

    何谓接口

    • 接口:书上没有明确地给出接口的定义,我理解的接口就是一段程序中可能有很多类会有共同的行为,但这些类本身并不具有任何关系,如果使用继承的话程序架构会不合理,所以使用统一的接口表示这些类具有共同的行为
      interface
      可定义行为,例如:
    public interface Swimmer{
            public abstract void swim();
        }
    

    implements
    类要操作接口,必须使用 implements 关键字,例如:

    public abstract class Fish implements Swimmer{
    }
    
    • 操作某接口时,对接口中定义的方法有两种处理方式:
      1. 操作接口中定义的方法
      2. 再度将该方法标示为 abstract
        继承与操作接口的区别:继承会有“是一种”关系,操作接口表示“拥有行为”,但不会有“是一种”的关系
    • 多态语法合法性判断:判断等号右边是不是拥有等号左边的行为,即等号右边的对象是不是操作了等号左边的接口,以下这个例子就可以通过编译:
      Swimer swimmer = new Shark();//因为 Fish 操作了 Swimmer 接口,即 Fish 拥有了 Swimmer 行为。Shark 继承 Fish ,所以Shark 拥有 Swimmer 行为
    • 扮演语法:会操作 Swimmer 接口的不一定继承Fish,加上扮演语法即可通过编译,例如:
    Swimmer swimmer = new Shark();
    Fish fish = (Fish)swimmer;
    

    以下的例子将会抛出 ClassCastException 错误:

    Swimmer swimmer = new Human();//将 swimmer 参考到 Human实例
    Shark shark = (Shark)swimmer;//让 swimmer 扮演鲨鱼
    

    已经将 swimmer 参考到 Human 实例了,再让他扮演鲨鱼就会出现错误

    • 解决需求变更问题:我们可以定义一些拥有不同行为的接口,定义一些类作为父类,当增加新的需求的时候,可以操作接口,代表拥有接口的行为,也
      可以继承父类,代表这个新的类“是一种”父类,原有的程序无需修改,只针对新的需求撰写程序即可
    • 在java中,类可以操作两个以上的接口,也就是拥有两种以上的行为
    • 在java中,接口可以继承自另一个接口,也就是继承父接口行为,再在子接口中额外定义行为,例如:
    public interface Diver extends Swimmer{  //接口 Diver 继承了接口 Swimmer
        public abstract void dive();
    }
    

    接口语法细节

    • 在java中,可使用 interface 定义抽象的 行为与外观,如接口中的方法可声明为 public abstract ,例如:
    public interface Swimmer{
        public abstract void swim();
    }
    
    • 接口中的方法没有操作的时候,一定要是公开抽象,可以省略 public abstract ,例如:
      public interface Swimmer{
        void swim();  //此处默认是 public abstract
    }
    
    • 由于默认一定是 public ,在类操作接口的时候也要撰写 public
    interface Action{
        void execute();
    }
    
    class Some implements Action{
        void execute(){
        //Some 类在操作 execute() 方法时,没有撰写 public ,因此默认为是包权限,这等于是将 Action 中的 public 方法缩小为包权限,所以编译失败
        //将 Some 类的 execut() 设为public 才可通过编译
        System.out.println("做一些服务");
        }
    }
    

    在 interface 中,只能定义 public static final的枚举常数 ,例如:

    public interface Action{
        public static final int STOP = 0;
    }
    

    如下撰写程序时,编译程序会自动展开为public static final

    public interface Action{
        int STOP = 0;
    }
    
    • 在接口中枚举常数,一定要使用 = 指定值,否则编译错误
    • 接口可以继承别的接口,可以同时继承两个以上的接口,使用 extends 关键字 ,代表了继承父接口的行为,例:
    interface Action{
        void executes();
    }
    // 定义 Acton 为父接口
    interface Some extends Action{
        void doSome();
    }
    interface Other extends Action{
        void doOther();
    }
    // Some 和 Other 接口继承 Action 接口
    public class Service implements Some,Other{
    // Service 继承 Some 和 Other 接口
        @Override
        public void execute(){
            System.out.println("execute()");
        }
    // Service 重新定义 execute() 方法
        @Override
        public void doSome{
            System.out.println("doSome()");
        }
        @Override
        public void doOther{
            System.out.println("doOther()");
        }
    // Service 重新定义 doSome 和 doOther 方法
    }
    

    匿名内部类

    • 某些子类或接口操作类只使用一次,不需要为这些类定义名称,这时可使用匿名内部类
    • 语法:
    new 父类()|接口(){
        //类本体操作
    };
    
    • JDK8 之前,若要在匿名内部类中存取局部变量,则该局部变量必须是 final ,否则会发生编译错误
    final int[] numbers = {10,20};
    

    enum

    enum 可定义枚举常数,但实际上 enum 定义了特殊的类,继承自 java。lang.Enum ,编译过后会产生 Action.class 文件,可用这个 Action 声明类型,例如:

    public class Game {
        public static void main(String[] args){
            play(Action.RIGHT);
            play(Action.UP);
        }
        
        public static void play(Action action){
            switch(action){
                case STOP:
                    out.println("播放停止动画");
                    break;
                case RIGHT:
                    out.println("播放向右动画");
                    break;
                case LEFT:
                    out.println("播放向左动画");
                    break;
                case UP:
                    out.println("播放向上动画");
                    break;
                case DOWN:
                    out.println("播放向下动画");
                    break;
            }
        }
    }
    
    • enum中列举的常熟,实际上是 public static final ,且为枚举类型实例,因为构造函数权限设定为 private ,只有类中才可以实例化

    教材学习中的问题和解决过程

    问题一

    Java中的继承和C语言中调用函数有何区别?

    • Answer
      Java语言与C语言本身就是两种不同思维的语言。C语言是面向过程的语言,就是我们要干一件事情,那么一步一步逐次来做,直到完成,其中可能就要调用一些函数,被调用的函数也是过程执>行的。但是Java程序的开发思路是面向对象的,它是有一个类,这个类有属性,有方法。我们要干一件事的时候,就通过该类所定义的或者说是具体化的对象(Object)来调用自己的方法来完成,这里所说的方法,也可以理解为是一个函数(类似于C语言中的),但是只不过这个方法现在是属于这个类的,属于这个对象的,是有“主人”的,只有通过它的“主人”才能调用它。而面向对象的Java有一个特点就是继承,当某一个类A继承了类B那么类A就可以使用类B的方法了,因为A继承了B,同样A的对象也可以使用B的方法了。

    问题二

    继承类和接口有何区别?

    • Answer:
      1.不同的修饰符修饰(interface),(extends)
      2.在面向对象编程中可以有多继承!但是只支持接口的多继承,不支持“继承”的多继承。而继承在java中具有单根性,子类只能继承一个父类
      3.在接口中只能定义全局常量,和抽象方法,而在继承中可以定义属性方法,变量,常量等。
      4.某个接口被类实现时,在类中一定要实现接口中的抽象方法,而继承想调用那个方法就调用那个方法,毫无压力。
      举个有趣的例子:
      当使用继承的时候,主要是为了不必重新开发,并且在不必了解实现细节的情况下拥有了父类我所需要的特征。
      但是很多时候,一个子类并不需要父类的所有特征,它可能只是需要其中的某些特征,但是由于通过继承,父类所有的特征都有了,需要的和不需要的特征同时具备了。而那些子类实际上不需要用到的,有时候甚至是极力避免使用的特征也可以随便使用,这就是继承的副作用。特别是允许多重继承的Java语言中,很容易引起不容易发现的错误。所以在java的语言中,会创造出各种规定来限制子类使用父类中的某些方法。
      如果狗的主人只是希望狗能爬比较低的树,但是不希望它继承尾巴可以倒挂在树上,像猴子那样可以飞檐走壁,以免主人管不住它。那么狗的主人肯定不会要一只猴子继承的狗。
      设计模式更多的强调面向接口。猴子有两个接口,一个是爬树,一个是尾巴倒挂。我现在只需要我的狗爬树,但是不要它尾巴倒挂,那么我只要我的狗实现爬树的接口就行了。同时不会带来像继承猴子来带来的尾巴倒挂的副作用。这就是接口的好处。
      Java技术发展也有好多年了,一个很明显的趋势就是继承的使用越来越少,而接口的使用越来越广泛了。其实只要稍微比较一下JDK里面那些最早就有的类库和最近才加进去的类库,就可以很明显的感觉到java技术领域的编程风格的变迁,由大量的继承到几乎无处不用的面向接口编程。
      接口不是替代继承。比如说我现在就是要我的动物去爬树,我根本就不需要知道到底是狗去爬树还是猴子。我提取出“能爬树”的动物去爬。这个能爬树的动物既可以是猴子,也可以是狗。这样不是很灵活吗?

    本周感悟

    • 经过了本章学习,我感觉自己的比上周又进步了很多,而且几周时间,在练习的过程中我已经敲了将近两千行代码了,就像老师说的那样,通过敲代码的练习,真真切切的可以感受到自己对代码的理解一直在上升,一开始我会抱有疑问:敲代码不就是可以记忆的更好么?其实不止如此,敲代码的过程也要是一个思考的过程,我们敲代码不是单纯的敲键盘,脑袋也要进行思考,出现了问题要去发现问题解决问题,没有问题也要去想想这段代码虽然运行成功了,但是合理么?如果合理,还有可以改进的地方么?带着思考去学习,进步才会越来越大,就像老师给的那道思考题——正方形可以继承长方形么?如果我们单纯的敲代码,我们可以敲出一个运行成功的代码,结果也是我们想的,但是,正确答案是不可以的,那么正确答案就需要我们自己思考,设计一个验证的方案,不光这道思考题如此,我们以后接触的代码会越来越复杂,很多地方无论逻辑上还是规则上都需要进行思考。
    • 本周学习,我最大的收获就是对代码思考的越来越多了,不只是在敲代码了。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 200/200 2/2 20/20
    第二周 300/500 2/4 18/38
    第三周 500/1000 3/7 22/60
    第四周 300/1300 2/9 30/90
    第五周 300/1600 2/10 30/120
  • 相关阅读:
    二分图 洛谷P2055 [ZJOI2009]假期的宿舍
    并查集 洛谷P1640 [SCOI2010]连续攻击游戏
    贪心 洛谷P2870 Best Cow Line, Gold
    贪心 NOIP2013 积木大赛
    快速幂 NOIP2013 转圈游戏
    倍增LCA NOIP2013 货车运输
    树形DP 洛谷P2014 选课
    KMP UVA1328 Period
    动态规划入门 BZOJ 1270 雷涛的小猫
    KMP POJ 2752Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/sms369/p/10634035.html
Copyright © 2011-2022 走看看