疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java继承学习笔记


 

 
继承
继承是类与类的一种关系,是一种“is a”的关系。注意:java中的继承是单继承,一个类只有一个父类。
继承的好处:子类拥有父类的所有属性和方法(private修饰的无效),实现代码的复用
语法规则:class 子类 extends 父类{}
父类对象的属性和子类对象的属性并没有关系,是两个属性
方法的重写
如果子类对继承父类的方法不满意,可以重写父类继承的方法的,当调用方法时会优先调用子类的方法。
语法规则:返回值类型、方法名、参数类型及个数,都要与父类继承的方法相同。
继承的初始化顺序
  当我们创建一个对象的时候,所执行的构造方法相当于初始化一个对象
 
先初始化父类再初始化子类
先执行初始化对象中的属性,再执行构造方法中的初始化
  
 
  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关键字做标识有“最终的”含义
 
final修饰类,则该类不允许被继承
final修饰方法,则该方法不允许被覆盖(重写)
final修饰属性,则该类的属性不会进行隐式的初始化(类的初始化属性必须有值)或在构造方法中赋值(但只能选其一)
final修饰变量,则该变量的值只能赋一次值,即变为常量。
super关键字
  在对象的内部使用,可以代表父类对象
访问父类的属性:super.属性
访问父类的方法:super.方法
子类的构造的过程中必须调用其父类的构造方法。
如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。
如果显式的调用构造方法(super();),必须在子类的构造方法的第一行。
如果子类构造方法中既没有显式调用父类的构造方法,而父类又没有无参的构造方法,则编译出错。
 Object类
  Object类是所有类的父类,如果一个类没有extend是关键字明确标识继承另外一个类,那么这个类默认继承Object类
 
  Object类中的方法,适合所有子类
 
toString()方法:在Object类里定义toString()方法的时候返回对象的哈希code码(对象地址字符串),可以通过重写toString()方法表示出对象的属性
复制代码
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]
 
euqals():比较的是对象的引用是否指向同一块内存地址。一般情况下比较两个对象时比较他的值是否一致,所以要重写equals()
复制代码
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;
    }
}
复制代码
如果运算符“==”两侧是引用类型数据,比较的并不是“值”本身,而是在内存的地址。