zoukankan      html  css  js  c++  java
  • Java 继承

    一. 继承的概念

    继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法。

    1. 类的继承格式

    extends关键字。

    class 父类{    
    }
    
    class 子类 extends 父类{
    }
    

    2. 为什么继承

    通过实例来说明这个需求。开发动物类,动物分别为狗和猫。

    狗类

    public class Dog{
        private String name;
        private int id;
        public Dog(String myName, int myid){
            name = myName;
            id = myid;
        }
        public void eat(){
            System.out.println(name+"正在吃");
        }
        public void sleep(){
            System.out.println(name+"正在睡");
        }
        public void introduction(){
            System.out.println("大家好!我是" + id + "号" + name + ".")
        }
    }
    

    猫类

    public class Cat{
        private String name;
        private int id;
        public Cat(String myName, int myid){
            name = myName;
            id = myid;
        }
        public void eat(){
            System.out.println(name+"正在吃");
        }
        public void sleep(){
            System.out.println(name+"正在睡");
        }
        public void introduction(){
            System.out.println("大家好!我是" + id + "号" + name + ".")
        }
    }
    

    这两段代码可以看出,存在重复,解决这个问题,需要继承,将两段代码相同的部分提取出来组成一个类。

    公共父类

    public class Animal{
        private String name;
        private int id;
        public Animal(String myName, int myid){
            name = myName;
            id = myid;
        }
        public void eat(){
            System.out.println(name+"正在吃");
        }
        public void sleep(){
            System.out.println(name+"正在睡");
        }
        public void introduction() { 
            System.out.println("大家好!我是" + id + "号" + name + "."); 
        } 
    }
    

    这个Animal类作为一个父类,狗类和猫类继承这个类之后,具有父类中的属性和方法。

    子类不会存在重复性代码,维护性也高。

    狗类

    public class Dog extends Animal{
        public Dog(String myName, int myid){
            super(myName, myid)
        }
    }
    

    猫类

    public class Cat extends Animal{
        public Cat(String myName, int myid){
            super(myName, myid);
        }
    }
    

    3. 继承类型

    Java不支持多继承,但支持多重继承。

    image



    二. 继承的特性

    • 子类拥有父类非private的属性、方法
    • 子类拥有自己的属性和方法。即对父类进行扩展。
    • 子类可以用自己的方式实现父类的方法。
    • Java的继承是单继承,但是可以多重继承。
    • 继承的缺点,造成代码联系越紧密,独立性差。


    三. 继承关键字

    使用 extendsimplements 这两个关键字实现继承。

    所有类都继承于 java.lang.Object,当没有上面的两个关键字,默认继承 Object 类(这个类在 java.lang 包中,不需要 import)。

    1. extends

    在 Java 中,类的继承是单一继承,一个子类只有一个父类

    public class Animal{
        private String name;
        private int id;
        public Animal(String myName, int myid){
            name = myName; 
            id = myid;
        }
        public void eat(){ 
            System.out.println(name+"正在吃"); 
        }
        public void sleep(){
            System.out.println(name+"正在睡");
        }
    }
    
    public class dog  extends  Animal{ 
    }
    

    2. implements

    implements 关键字变相的使 java 具有多继承的特性,可以同时继承多个接口(接口之间逗号隔开)。

    public interface A{
        public void eat();
        public void sleep();
    }
    
    public interface B{
        public void show();
    }
    
    public class C implements A,B{
    }
    

    3. super 和 this

    super 关键字:通过 super 实现对父类成员的访问,用来引用当前对象的父类

    this 关键字:指向自己的引用

    class Animal{
        void eat(){
            System.out.println("animal : eat")
        }
    }
    
    class Dog extends Animal{
        void eat(){
            System.out.println("dog : eat");
        }
        void eatTest(){
            this.eat();
            super.eat();
        }
    }
    
    public class Test{
        public static void main(String[] args){
            Animal a = new Animal();
            a.eat();
            Dog d = new Dog();
            d.eatTest();
        }
    }
    

    输出:

    animal : eat
    dog : eat
    animal : eat
    

    4. final关键字

    final 关键字可以把类定义为不能继承的,即最终类。或者用于修饰方法,该方法不能被子类重写。

    • 声明类

      final class 类名{
          
      }
      
    • 声明方法

      修饰符(public/private/default/protected) final 返回值类型 方法名(){
          
      }
      

    注意:实例变量也可以被定义为 final,被定义为 final 的变量不能被修改

    被声明为 final 类的方法也自动声明为 final,但实例变量并不是 final



    四. 构造器

    子类是不继承父类的构造器(构造方法或构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式的通过 super 关键字调用父类的构造器并配以适当的参数列表

    如果父类构造器没有参数,则在子类的构造器中不需要 super 关键字调用父类构造器,系统会自动调用父类的无参构造器

    class SuperClass{
        private int n;
        SuperClass(){
            System.out.println("SuperClass()");
        }
        SuperClass(int n){
            System.out.println("SuperClass(int n)");
        }
    }
    
    
    // SubClass 类继承
    class SubClass extends SuperClass{
        private int n;
        SubClass(){             // 自动调用父类的无参构造器
            System.out.println("SubClass");
        }
        public SubClass(int n){
            super(300);     // 调用父类中带有参数的构造器
            System.out.println("SubClass(int n): " + n);
            this.n = n;
        }
    }
    
    
    // SubClass2 类继承
    class SubClass2 extends SuperClass{
        private int n;
        SubClass2(){
            super(300);     // 调用父类中带有参数的构造器
            System.out.println("SubClass2");
        }
        public SubClass2(int n){    // 自动调用父类的无参构造器
            System.out.println("SubClass2(int n): " + n);
            this.n = n;
        }
    }
    
    
    public class TestSuperSub{
        public static void main(String[] args) {
            System.out.println("-------SubClass 类继承--------");
            SubClass sc1 = new SubClass();
            SubClass sc2 = new SubClass(100);
            System.out.println("-------SubClass2 类继承---------");
            SubClass2 sc3 = new SubClass2();
            SubClass2 sc4 = new SubClass2(200);
        }
    }
    

    输出结果:

    -------SubClass 类继承--------
    SuperClass()
    SubClass
    SuperClass(int n)
    SubClass(int n): 100
    -------SubClass2 类继承---------
    SuperClass(int n)
    SubClass2
    SuperClass()
    SubClass2(int n): 200
    
  • 相关阅读:
    包含了访问命名服务的类和接口
    JNDI架构提供了一组标准的独立于命名系统的API
    利用JNDI的命名与服务功能来满足企业级API对命名与服务的访问
    JNDI(Java Naming and Directory Interface,Java命名和目录接口)
    Servlet 国际化
    重要的调试技巧
    使用 JDB 调试器
    Servlet 调试
    Servlet 打包部署
    编译包中的 Servlet
  • 原文地址:https://www.cnblogs.com/keye/p/15161507.html
Copyright © 2011-2022 走看看