JAVA 继承

一、继承

1、概念:

类的继承可以使用已有的类为基础派生出新的类。程序代码再利用。

子类继承父类的成员变量和成员方法,同时可以修改父类的成员变量或者重写父类的方法,还可以添加新的变量或成员方法。

2、优点:

(1)子类直接拥有父类的所有属性和方法(除了privata)

(2)实现代码复用

3、子类的创建:

通过 extend  关键字

父类

class Person{
    private String name;
    private int age;
    public Person(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
    public void show()
    {
        System.out.println("姓名:"+name+" 年龄: "+age);
    }
}

 其子类,学生类

class Student extends Person
{
    private String Depatmengt;

    public Student(String name, int age) {
        super(name, age);       //调用父类的有参构造方法
        // TODO Auto-generated constructor stub
    }
    public void setDepartment(String D)
    {
        this.Depatmengt = D;
        System.out.println(D+"系学生");
    }
    
}

子类的使用

public class demo1 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Student per1 = new Student("张三",15);
        per1.setDepartment("通信工程");
        per1.show();
        
    }
}

 运行结果:

通信工程系学生
姓名:张三 年龄: 15

说明:

(1)子类的每个对象也是其父类的对象,这是继承性的“即是”性质。若Student继承Person,则Student即是Person,所以在任何可以使用Person实例的地方,都可以使用Student实例。反之则不然,父类对象不一定是它子类的对象。

(2)Java程序在执行子类构造方法之前,会先自动调用父类中没有参数的构造方法,目的是为了帮助继承来自父类的成员做初始化操作。

(3)子类不能继承父类中private成员

(4)调用父类中特定的构造方法:

        通过 super() 来调用父类特定的构造方法(见上程序)。其中super() 可以重载。super()与this()功能相似。super() 与是从子类的构造方法调用父类的构造方法。 this()是同一个类中调用其他构造方法。super()与this()均必须放在构造方法的第一行。所以不能共存与同一构造方法。

        其构造方法调用顺序为:父类无参-->子类无参-->父类有参-->子类有参

(5)当父类中的成员声明为 protected 时,可在子类中super.访问

protected String name;

 访问父类属性

System.out.println(super.name);

 

二、覆盖(方法重写)

1、定义:

    如果子类对父类的方法不满意,可以重写父类的方法,调用时优先使用子类的方法。

2、语法规则:

(1)返回值类型  (2)方法名  (3)参数类型和个数

都要与父类继承的方法相同,才是方法的重写。否则将继承原来父类的方法。

 注:子类中不能覆盖父类中声明为final或者static的方法

3、final关键字:

父类中被声明为final的成员在子类中可被继承,但不能覆盖。

若一个类被final修饰符缩修饰,则说明这个类不能再被其他类继承,该类不可能有子类,被称为最终类。

 

三、Object类

是所有类的父类,如果没有明确使用extends关键字确定标示继承另一个类,那么这个类默认继承Object类

1、equals()方法:

public boolean equals(Object obj)    功能说明:判断两个对象变量所指向的是不是同一个对象

对于字符串的操作,Java在执行时会维护一个字符串池,对于一些可共享的字符串对象(如“”括起来的一个字符串),会先在字符串池中查找,如果有,就直接返回,而不是创建新的对象,以减少内存占用。

(1)对于字符串变量,“==”运算符和equals()方法比较字符串时,比较方式不同。“==”比较两个变量本身的值,即两个对象在内存中的首地址;而equals()方法比较的是两个字符串中所包含内容是否相同。

(2)对于非字符串类型变量,二者都是用来比较其对象在内存中的首地址,即都是用来比较两个类类型的变量是否指向同一个对象。

 

          PS:Dog dog = new Dog();   中的dog只是一个指向dog对象的指针。

(2)一般情况下,是比较image

生成的代码:

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }//生成haxi码


    @Override
    public boolean equals(Object obj) {
        if (this == obj)             //如果是同一个对象,就是对的
            return true;
        if (obj == null)             //如果obj是空的,肯定不相等
            return false;
        if (getClass() != obj.getClass())    //判断类的对象是否相等
            return false;
        Animal other = (Animal) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

 

其中getClass()是得到类对象、

2、toString()方法:

返回对象的哈希code码,是唯一区分对象的标识,但对于我们没有用;可以通过重写toString()方法显示对象的属性。

esplice提供的ISE方法:

image

image

 

@Override
    public String toString() {
        return "Animal [age=" + age + ", name=" + name + "]";
    }

 

于是乎,在mian中调用

System.out.println(dog);

结果为:

image

 

posted @ 2015-11-21 19:52  Kevin1207  阅读(225)  评论(0编辑  收藏  举报