zoukankan      html  css  js  c++  java
  • Java继承,接口,抽象类

    继承

    继承的例子:

     class Father
    {
        public void f1()
        {
            System.out.println("hi");
        }
    }
    
    public class Son extends Father
    {
        public static void main(String[] a)
        {
            Son a=new Son();//编译器会自动给无参构造函数
            a.f1();//Son没有定义f1,而是从父类继承来的
        }
    }
    
    

    Java 中子类继承父类的语法格式如下:

    修饰符 class class_name extends extend_class {
        // 类的主体
    }
    

    其中,class_name 表示子类(派生类)的名称;extend_class 表示父类(基类)的名称;extends 关键字直接跟在子类名之后,其后面是该类要继承的父类名称 。

    • Java 与 C++ 定义继承类的方式十分相似。Java 用关键字 extends 代替了 C++ 中的冒号(:)。在 Java 中,所有的继承都是公有继承, 而没有 C++ 中的私有继承和保护继承。

    • 类的继承不改变类成员的访问权限,也就是说,如果父类的成员是公有的、被保护的或默认的,它的子类仍具有相应的这些特性,并且子类不能获得父类的构造方法。

    • 单根继承原则:每个类都只能继承一个类。即 Java 不支持多继承,只允许一个类直接继承另一个类,即子类只能有一个直接父类,extends 关键字后面只能有一个类名。

    很多地方在介绍 Java 的单继承时,可能会说 Java 类只能有一个父类,严格来讲,这种说法是错误的,应该是一个类只能有一个直接父类,但是它可以有多个间接的父类。例如,Student 类继承 Person 类,Person 类继承 Person1 类,Person1 类继承 Person2 类,那么 Person1 和 Person2 类是 Student 类的间接父类。图 1 展示了单继承的关系。

    从图 1 中可以看出,三角形、四边形和五边形的直接父类是多边形类,它们的间接父类是图形类。图形类、多边形类和三角形、四边形、五边形类形成了一个继承的分支。在这个分支上,位于下层的子类会继承上层所有直接或间接父类的属性和方法。如果两个类不在同一个继承树分支上,就不会存在继承关系,例如多边形类和直线。

    • 如果定义一个 Java 类时并未显式指定这个类的直接父类,则这个类默认继承 java.lang.Object 类。因此,java.lang.Object 类是所有类的父类,要么是其直接父类,要么是其间接父类。因此所有的 Java 对象都可调用 java.lang.Object 类所定义的实例方法。

    • 每个Java类都有也必须有构造函数。

    • 每个子类的构造函数的第一句话都是默认调用父类的无参构造函数super(),除非子类的构造函数第一句话是super,且super语句必须放在第一条,不会出现连续两条super语句(否则编译器会报错)。

    super关键字

    由于子类不能继承父类的构造方法,因此,如果要调用父类的构造方法,可以使用 super 关键字。super 可以用来访问父类的构造方法、普通方法和属性。
    super 关键字的功能:

    • 在子类的构造方法中显式的调用父类构造方法

    • 访问父类的成员方法和变量。

    super调用父类构造方法

    super 关键字可以在子类的构造方法中显式地调用父类的构造方法,基本格式如下:

    super(parameter-list);
    
    

    其中,parameter-list 指定了父类构造方法中的所有参数。super( ) 必须是在子类构造方法的方法体的第一行。

    例1:

    public class Person {
        public Person(String name) {
    
        }
    }
    public class Student extends Person {
    
    }
    
    

    会发现 Student 类出现编译错误,提示必须显式定义构造方法.这是因为如果一个类中没有写任何的构造方法,JVM 会生成一个默认的无参构造方法。在继承关系中,由于在子类的构造方法中,第一条语句默认为调用父类的无参构造方法(即默认为 super(),一般这行代码省略了)。所以当在父类中定义了有参构造方法,但是没有定义无参构造方法时,编译器会强制要求我们定义一个相同参数类型的构造方法。

    super访问父类成员

    当子类的成员变量或方法与父类同名时,子类的成员变量或方法会对父类的成员变量或方法进行覆盖。如果想对父类的成员变量或方法进行访问可以使用 super 关键字来访问。如果子类重写了父类的某一个方法,即子类和父类有相同的方法定义,但是有不同的方法体,此时,我们可以通过 super 来调用父类里面的这个方法。

    使用 super 访问父类中的成员与 this 关键字的使用相似,只不过它引用的是子类的父类,语法格式如下:

    super.number
    
    

    其中,member 是父类中的属性或方法。使用 super 访问父类的属性和方法时不用位于第一行。

    super和this的区别

    this 指的是当前对象的引用,super 是当前对象的父对象的引用。下面先简单介绍一下 super 和 this 关键字的用法。

    • super.父类属性名:调用父类中的属性

    • super.父类方法名:调用父类中的方法

    • super():调用父类的无参构造方法

    • super(参数):调用父类的有参构造方法

    如果构造方法的第一行代码不是 this() 和 super(),则系统会默认添加 super()。

    this 关键字的用法:

    • this.属性名:表示当前对象的属性

    • this.方法名(参数):表示调用当前对象的方法

    当局部变量和成员变量发生冲突时,使用this.进行区分。

    关于 Java super 和 this 关键字的异同,可简单总结为以下几条。

    1.子类和父类中变量或方法名称相同时,用 super 关键字来访问。可以理解为 super 是指向自己父类对象的一个指针。在子类中调用父类的构造方法。

    2.this 是自身的一个对象,代表对象本身,可以理解为 this 是指向对象本身的一个指针。在同一个类中调用其它方法。

    3.this 和 super 不能同时出现在一个构造方法里面,因为 this 必然会调用其它的构造方法,其它的构造方法中肯定会有 super 语句的存在,所以在同一个构造方法里面有相同的语句,就失去了语句的意义,编译器也不会通过。

    4.this( ) 和 super( ) 都指的是对象,所以,均不可以在 static 环境中使用,包括 static 变量、static 方法和 static 语句块。

    5.从本质上讲,this 是一个指向对象本身的指针, 然而 super 是一个 Java 关键字。

  • 相关阅读:
    C++11线程池
    muduo的事件处理(Reactor模型关键结构)
    sed和awk
    gdb
    C#访问级别
    C#表达式树浅析
    C#并发实战Parallel.ForEach使用
    c#获取本月有哪些周六、周日
    重装了Devexpress后项目报Dll引用找不到问题解决办法
    C#单例模式
  • 原文地址:https://www.cnblogs.com/Acapplella/p/13295190.html
Copyright © 2011-2022 走看看