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

    • 继承
    1. 继承是类与类的一种关系,是一种“is a”的关系。注意:java中的继承是单继承,一个类只有一个父类。
    2. 继承的好处:子类拥有父类的所有属性和方法(private修饰的无效),实现代码的复用
    3. 语法规则:class 子类 extends 父类{}
    4. 父类对象的属性和子类对象的属性并没有关系,是两个属性
    • 方法的重写
    1. 如果子类对继承父类的方法不满意,可以重写父类继承的方法的,当调用方法时会优先调用子类的方法。
    2. 语法规则:返回值类型、方法名、参数类型及个数,都要与父类继承的方法相同。
    • 继承的初始化顺序

      当我们创建一个对象的时候,所执行的构造方法相当于初始化一个对象

    1. 先初始化父类再初始化子类
    2. 先执行初始化对象中的属性,再执行构造方法中的初始化

      

      Animal.java

    package com.test;
    
    public class Animal {
        public int age = 2;
        public String name;
        public void eat() {
            System.out.println("动物具有吃东西的能力");
        }
        public Animal(){
            System.out.println("animal的构造方法");
            age = 4;
        }
    }

      Dog.java

    package com.test;
    
    public class Dog extends Animal {
        public void eat() {
            System.out.println("年龄"+age+"岁的狗是可以吃东西的");
        }
        public Dog(){
            System.out.println("dog的构造方法");
        }
    }

      Initail.java

    package com.test;
    
    public class Initail {
    
        public static void main(String[] args) {
            Dog dog = new Dog();
            //dog.age = 1;
            dog.eat();
        }
    }

      运行Initail.java,执行结果:

      animal的构造方法
      dog的构造方法
      年龄4岁的狗是可以吃东西的

    • final关键字

      使用final关键字做标识有“最终的”含义

    1. final修饰类,则该类不允许被继承
    2. final修饰方法,则该方法不允许被覆盖(重写)
    3. final修饰属性,则该类的属性不会进行隐式的初始化(类的初始化属性必须有值)或在构造方法中赋值(但只能选其一)
    4. final修饰变量,则该变量的值只能赋一次值,即变为常量。
    • super关键字

      在对象的内部使用,可以代表父类对象

    1. 访问父类的属性:super.属性
    2. 访问父类的方法:super.方法
    3. 子类的构造的过程中必须调用其父类的构造方法。
    4. 如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。
    5. 如果显式的调用构造方法(super();),必须在子类的构造方法的第一行。
    6. 如果子类构造方法中既没有显式调用父类的构造方法,而父类又没有无参的构造方法,则编译出错。
    •  Object类

      Object类是所有类的父类,如果一个类没有extend是关键字明确标识继承另外一个类,那么这个类默认继承Object类

      Object类中的方法,适合所有子类

    1. toString()方法:在Object类里定义toString()方法的时候返回对象的哈希code码(对象地址字符串),可以通过重写toString()方法表示出对象的属性
    2. package com.test;
      
      public class Cat extends Animal{
          public int age = 2;
          
          @Override
          public String toString() {
              return "Cat [age=" + age + "]";
          }
          
      }
      package com.test;
      
      public class Initail {
          public static void main(String[] args) {
              Cat cat = new Cat();
              System.out.println(cat);
          }
      }

      如果Cat类没有重写toString(),运行结果是:com.test.Cat@2a139a55;如果Cat重写toString(),运行结果是:Cat [age=2]

    3. euqals():比较的是对象的引用是否指向同一块内存地址。一般情况下比较两个对象时比较他的值是否一致,所以要重写equals()
    4. package com.test;
      
      public class Cat extends Animal{
          public int age = 2;
          @Override
          public boolean equals(Object obj) {
              if (this == obj)
                  return true;
              if (obj == null)
                  return false;
              if (getClass() != obj.getClass())
                  return false;
              Cat other = (Cat) obj;
              if (age != other.age)
                  return false;
              return true;
          }
      }

      如果运算符“==”两侧是引用类型数据,比较的并不是“值”本身,而是在内存的地址。

       注:通过new创建对象的时候,得到的对象是类的对象,obj.getClass()得到的是类对象。类对象描述的是类的代码信息,类的对象描述的是对象的数据信息。

       System.out.println(cat.getClass());输出结果:class com.test.Cat

  • 相关阅读:
    反转链表 16
    CodeForces 701A Cards
    hdu 1087 Super Jumping! Jumping! Jumping!(动态规划)
    hdu 1241 Oil Deposits(水一发,自我的DFS)
    CodeForces 703B(容斥定理)
    poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
    ACM 马拦过河卒(动态规划)
    hdu 1005 Number Sequence
    51nod 1170 1770 数数字(数学技巧)
    hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
  • 原文地址:https://www.cnblogs.com/tianxintian22/p/6523328.html
Copyright © 2011-2022 走看看