zoukankan      html  css  js  c++  java
  • 7.JAVA-类继承、覆写、final关键字

    1.JAVA继承-extends

    在java中,要想实现继承则使用extends关键字.

    一般子类被称为派生类,父类称为基类(super)

    extends需要注意的地方:

    • java不允许多重继承(一个类只能继承一个父类,不能继承多个父类)
    • 派生类会继承基类所有属性和方法,但不能直接访问基类的private私有属性
    • 实例化派生类时,会先去调用父类的构造方法构造基类,再实例化自身的属性类对象,最后才是调用自身类构造方法.
    • 在派生类中,有个隐藏的super,表示为基类,所以我们可以通过它指定如何构造基类

    1.1 示例1-super使用

    注意:super必须放在构造方法首行使用,如果用户不使用super,则编译器默认调用super()来初始化父类

    代码如下:

    class Parent
    {
             public Parent()
             {
                      System.out.println("Parent()");
             }
             public Parent(String str)
             {
                      System.out.println("Parent(String str):"+str);
             }
    }
    
    class Derived extends Parent
    {
             public Derived()
             {
                      super("123");           //调用Parent(String str)初始化父类
                      System.out.println("Derived()");
             }
    }
    
    public class Test{
                      public static void main(String args[]){
                      Derived d = new Derived();
             }       
    }

    打印如下:

     

    2.JAVA继承之方法覆写

    当派生类覆写基类的方法时候,要遵守方法的权限,返回值以及参数都一致.

    如果派生类覆写的基类方法是private的,则不能实现覆写功能,因为基类的private方法是不可见的(参考2.2示例)

    派生类覆写方法,一般用于基类的方法不满足当前派生类功能实现时,才会去覆写.

    2.1 示例1-覆写

    代码如下:

    class Parent
    {
             public void func(int i)
             {
                      System.out.println("Parent::func()");
             }
    }
    
    class Derived extends Parent
    {
             public void func(int i)              //覆写父类的func方法
             {
                      System.out.println("Derived::func()");
             }
    }
    
    public class Test{
                      public static void main(String args[]){
                      Derived d = new Derived();
                      d.func(1);
             }       
    }

    2.2示例2-派生类private无法实现覆写

    先来个正常覆写的代码:

    class Parent
    {
             public void func()
             {
                      System.out.println("Parent::func()");
             }
             public void print()
             {
                      func();
             }
    }
    
    class Derived extends Parent
    {
             public void func()            //覆写父类的func方法
             {
                      System.out.println("Derived::func()");
             }
    }
    
    public class Test{
                      public static void main(String args[]){
    
                      Derived d = new Derived();
                      d.print();
             }       
    
    }

     如下图所示,打印派生类的func():

     

    然后将Parent的func()改为private:

    private void func()
    {
        System.out.println("Parent::func()");
    }

    如下图所示,则打印基类的func():

     

    2.3JAVA继承之如何通过派生类调用基类被覆盖的方法

    在上面第1节,我们讲过派生类中有个隐藏的super,表示为基类.所以当基类被覆写的方法时,我们可以通过super来调用基类的方法.

    示例-super调用基类方法

    class Parent
    {
             public void func()
             {
                      System.out.println("Parent::func()");
             }
    }
    
    class Derived extends Parent
    {
             public void func()            //覆写父类的func方法
             {
                      super.func();             //调用父类的func,如果不加super,则会出现一直递归
                      System.out.println("Derived::func()");
             }
    }
    
    public class Test{
                      public static void main(String args[]){
                        Derived d = new Derived();
                        d.func();
                     }       
    }

    打印如下:

     

    3.final关键字

    在java中,final被称为终结器, final可以修饰变量,方法和类.

    3.1 final修饰类

    当final修饰类时,则表示该类为最终的,也就是说该类不能再有子类了,示例如下:

    final class A {                 // 修饰该类不能有子类
    }
    
    class B extends A {             // 错误的继承
    }

    3.2 final修饰方法

    当在某个类的方法前面定义final时,则表示该方法不允许在子类里进行方法覆写(可以实现方法重载)

    示例如下:

    class A {
             public final void fun() {}       //此方法不允许子类覆写
             public void fun(int i) {}        //可以实现方法重载
    }
    
    class B extends A {
             public void fun() {}            // 错误:此处不允许覆写
    }

    3.3 final修饰变量

    当final修饰变量时,则表示该变量为常量(类似C++中const).示例如下:

    public static final String LICENSE = "GPL";                      //修饰全局常量,定义常量时,名称需大写

    下章学习: 8.JAVA-向上转型、向下转型

  • 相关阅读:
    java自带线程池
    SQL 语句学习
    Eclipse 运行内存不足情况
    Eclipse的ant调用maven
    Elipse 无法启动问题(转)
    UI自动化测试实战之Select类实战(四)
    WebElement类方法实战(三)
    WebDriver浏览器属性详解(二)
    服务端测试之gRPC协议测试(一)
    服务端测试实战(一)
  • 原文地址:https://www.cnblogs.com/lifexy/p/10811531.html
Copyright © 2011-2022 走看看