zoukankan      html  css  js  c++  java
  • 《java JDK7 学习笔记》之继承与多态

    1、面向对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承。应该正确判断使用继承的时机及继承之后灵活的运用多态,才是学习继承时的重点。

    2、程序代码重复在程序设计上,就是不好的信号,多个类间出现重复的程序代码时,设计上可考虑的改进方式之一,就是把相同的程序代码提升为父类。

    3、在java中,继承时使用extends关键字,private成员也会被继承,只是子类无法直接存取private成员的值,必须通过父类提供的Getting/Setting方法来存取(如果父类愿意提供访问方法的话)。

    4、在java中,子类只能继承一个父类,父类却可以被多个子类继承。继承有个重要的关系,就是子类与父类间会有is-a的关系。

    5、检查多态语法逻辑是否正确,方式是从=号右边往左读:右边是不是一种左边呢(右边类型是不是左边类型的子类)?如果不是就会编译失败,如果加上扮演(CAST)语法,编译程序就让程序代码通过编译,不过后果得自行负责,也就是扮演失败,执行时会抛出ClassCastException。

    6、多态,以抽象讲法解释:就是使用单一接口操作多种类型的对象。

    7、如果某方法区块中真的没有任何程序代码操作,可以使用abstract标识该方法为抽象方法,该方法不用撰写{}区块,直接以“;”结束即可。类中若有方法没有操作,并且标识为abstract,表示这个类定义不完整,定义不完整的类就不能用来生成实例。java中规定内含抽象方法的类,一定要在class前标识abstract,表示这是一个定义不完整的抽象类。

    8、被声明为protected的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类中直接存取。

    9、java中有public、protected、默认包权限与private四个权限范围。

    10、如果想取得父类中的方法定义,可以在调用方法前,加上super关键字。重新定义方法要注意,对于父类中的方法权限,只能扩大但不能缩小。在JDK5之后,重新定义方法时,如果返回类型是父类中方法返回类型的子类,也可以通过编译。

    11、如果子类构造函数中没有指定执行父类中哪个构造函数,就会默认调用父类中的无参构造函数。如果想执行父类中的某构造函数,可以使用super()指定。this()与super()只能选择一个调用,而且一定要在构造函数第一行执行。

    12、如果class前使用了final关键字定义,那就表示这个类是最后一个了,不会再有子类,也就是不能被继承。定义方法时,也可以限定该方法为final,这表示最后一次定义方法了,就是子类不可以重新定义final方法。

    13、如果定义类时没有使用extends关键字指定继承任何类,那一定是继承了java.lang.Object。在java中,任何类追溯至最上层父类,一定就是java.lang.Object。

    14、对于不再有用的对象,JVM有垃圾收集机制,收集到的垃圾对象所占据的内存空间,会被垃圾收集器释放。执行流程中(也就是线程中),无法通过变量参考的对象,就是GC认定的垃圾对象。

    课后练习选择题:

    1、class Some{

             void doService(){

                  System.out.println(“some service”);

            }

        }

        class Other extends Some{

             @Override

             void doService(){

                  System.out.println(“other service”);

            }

        }

       public class Main{

             public static void main(String[] args){

                    Other other = new Other();

                    other.doService();

             }

    }

    一下描述正确的是:显示other serivce。

     

    2、承上题,如果main()中改为:

    Some some = new Other();

    some.doService();

    以下描述正确的是:显示other service;

     

    3、class Some{

             String ToString(){

                   return “Some instance”;

            }

    }

    public  class Main{

          public static void main(String[] args){

                Some some = new Some();

                System.out.println(some);

          }

    }

    以下描述正确的是:显示Some@xxx,xxxx为16位进制数字。

     

    4、class Some{

              int hashCode(){

                  return 99;

             }

    }

    public  class Main{

          public static void main(String[] args){

                Some some = new Some();

                System.out.println(some.hashCode());

          }

    }

    以下描述正确的是:编译错误。

    注:hashCode()不是public修饰的,编译报错。

     

    5、class Some{

            @Override

             String ToString(){

                   return “Some instance”;

            }

    }

    public  class Main{

          public static void main(String[] args){

                Some some = new Some();

                System.out.println(some);

          }

    }

    以下描述正确的是:编译失败。

    注:@Override重写注解,但是toString()的方法名没写对,也没有添加public修饰符。

     

    6、class Some{

             abstract void doService();

    }

    class Other extends Some{

          @Override

           void doService(){

               System.out.println(“other service”);

          }

    }

    public class Main{

         public static void main(String[] args){

              Some some =  new Other();

              some.doService();

        }

    }

    以下描述正确的是:编译失败。

    注:凡是拥有abstract方法的类都是抽象类,class 前必须加加abstract关键字

     

    7、class Some{

            protected int x;

            Some(int x){

                  this.x = x;

           }

    }

    class Other extends Some{

           Other(int x){

                this.x = x;

          }

    }

    以下描述正确的是:Other类无法调用父类的构造函数编译失败。

     

    8、 public class IterableString extends String{

              …..

    }

    以下描述正确的是:因无法继承String的编译失败。

    注:java.lang.String;该类是final类型的,不允许被继承。

     

    9、class Some{

              Some(){

                     this(10);

                     System.out.println(“Some()”);

              }

              Some(int x){

                    System.out.println(“Some(int x)”);

             }

    }

    class Other extends Some{

           Other(){

                super(10);

                System.out.println(“Other()”);

          }

          Other(int y){

               System.out.println(“Other(int y)”);

          }

    }

    以下描述正确的是:

    new Some()显示“Some(int x)”、“Some()”。

    new Other()显示“Some(int x)”、“Other()”。

    注:创建子类对象默认会调用父类无参构造函数。

     

    10、class Some{

              Some(){

                    System.out.println(“Some()”);

                    this(10);

             }

             Some(int x){

                    System.out.println(“Some(int x)”);

             }

    }

    class Other extends Some{

              Other(){

                   super(10);

                   System.out.println(“Other()”);

             }

             Other(int y){

                    System.out.println(“Other(int y)”);

             }

    }

    以下描述正确的是:编译失败。

    注:在构造函数中无论是使用this()还是super()都要在构造函数的第一行。

     

     

  • 相关阅读:
    Linux小命了(6)cd
    Linux小命令(5)mkdir
    性能测试(1)-开篇杂谈
    Linux小命令(4)ls
    Linux小命令(3)cat
    Linux小命令(2)man
    机器学习-学习方法
    flask-cache
    mysql 常用时间函数
    发现变化,拥抱变化
  • 原文地址:https://www.cnblogs.com/wanghongyun/p/6211726.html
Copyright © 2011-2022 走看看