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对象的指针。
生成的代码:
@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方法:
@Override public String toString() { return "Animal [age=" + age + ", name=" + name + "]"; }
于是乎,在mian中调用
System.out.println(dog);
结果为: