继承

Posted on 2022-02-13 11:30  zhoumubaiyu  阅读(30)  评论(0编辑  收藏  举报

继承

  • 面向对象编程语言和面向过程的编程语言最突出的特点就是变量类型的继承

  • 更符合大自然规律:父亲有的,儿子就有

    class Father
    {
      public void f1()
      {
        System.out.println("hi");
      }
    }
    public class Son extends Father
    {
      public static void main(String[] a)
      {
        Son s = new Son();
        s.f1();  //Son没有定义f1,而是通过父类继承的
      }
    }
    
    • 面向过程编程语言没有继承,导致出现很多类型重复定义

    • 物以类聚,世间万物皆对象,对象也可以分成若干类别

    • 类别内的对象属性和方法都具有一定的共同点

    • 将共同点提取出来,即形成了父类/基类/超类

      • Parent class/Base class/Super class

    • 而其他类则自动成为子类/派生类

      • Child class/Derived class

        public class Man{
          int height;
          int weight;
          public void eat(){};
          public void plough(){};  //耕田
        }
        
        public class Human{
          int height;
          int weight;
          public void eat(){};
        }
        
        public class Man extends Human{
          public void plough(){};  //耕田
        }
        

         

        public class Woman{
          int height;
          int weight;
          public void eat(){};
          public void weave(){};  //织布
        }
        
        
        
        public class Woman extends Human{
          public void weave(){};  //织布
        }
        
        • Man extends Human 表示Man继承于Human

        • Human是父类,Man是子类

        • 子类继承父类所有的属性和方法(但不能直接访问private成员)

        • 根据信息隐藏原则:子类会继承父类的所有方法。可以直接使用

        • 子类也会继承父类的所有的属性和方法(但不能直接访问private成员)

        • 单根继承原则:每个类都只能承受一个类

        • 如果不写extends,Java类都默认继承java.lang.Object类

        • Class Human extends java.lang.Object

        • Java所有类从java.lang.Object开始,构建出一个类型继承树

        • Object类里面默认就有clone,equals,finalize,getClass,hashCode,toString等方法

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

        • 如果没有显式定义构造函数,java编译器自动为该类产生了一个空的无形参构造函数。如果已经有了显式的有参构造函数,编译器就不会越俎代庖了

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

          public class A{
            public A()
            {
              System.out.println("111111");
            }
            public A(int a)
            {
              System.out.println("222222");
            }
          }
          

           

          public class B extends A{
            public B()
            {
               //super();编译器自动增加super()
              System.out.println("333333");
            }
            public B(int a)
            {
              super(a);
              System.out.println("444444");
            }
            public static void main(String[] a)
            {
              B obj1 = new B();
              System.out.println("==============");
              B obj2 = new B(10);
            }
          }