---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一、类的继承
1、继承的定义
继承是Java面向对象的一种特性。继承是指一种由已有的类创建新类的机制。利用继承,可以先创建一个共有属性的一般类,根据该一般类在创建具有特殊属性的新类,新类继承一般类的属性和行为,并根据需要增加它自己的新的状态和行为。有继承而得到的类称为子类,被继承的类称为父类(超类),Java不支持多重继承(子类只能有一个父类)。
继承提高了代码的复用性,让类与类之间出现了关系,有了这个关系才有了多态的特性。具体什么叫做继承,来看下面的例子:
class Person
{
String name;
int age;
}
class Student
{
String name;
int age;
void study()
{
System.out.println("good study");
}
}
class Worker
{
String name;
int age;
void work()
{
System.out.println("good work");
}
}
对于上面三个类,很明显的他们有共有的属性name 和 age,如果照上面的这种方法编程是相当的麻烦的,便可以利用继承,让Students和Worker 全都继承Person,如下:
class Person
{
String name;
int age;
}
class Student extends Person
{
void study()
{
System.out.println("good study");
}
}
class Worker extends Person
{
void work()
{
System.out.println("good work");
}
}
Students和Worker 作为子类继承了父类People的属性name和age,同时子类还扩展了自己特有的行为,这样就提高了代码的复用性。这里用到了关键字extends(继承)。
2、成员变量的隐藏和方法的重写
子类也可以隐藏继承的成员变量,对于类可以从父类继承成员变量,只要子类中定义的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量,即子类对象以及子类自己声明的定义的方法操作与父类同名的成员变量是指子类重新声明定义的这个成员变量。
class A {
int x=2;
}
class B extends A {
int x=3;
void speak() {
System.out.println("x="+x);//输出x的值为3,不是2
}
public static void main(String[] args) {
B b = new B();
b.speak();
}
}
输出结果为:3.
那么如何才能输出2呢?这里要用到关键字super:
class A {
int x=2;
}
class B extends A {
int x=3;
void speak() {
System.out.println("x="+super.x);//输出x的值为2,不是3
}
public static void main(String[] args) {
B b = new B();
b.speak();
}
}
this和super:this指的是本类对象,super指的是父类对象,看下面的程序:
class A {
int x=2;
}
class B extends A {
int x=3;
void speak() {
int x=4;
System.out.println("x="+x);//输出结果是4
System.out.println("x="+this.x);//输出结果是3
System.out.println("x="+super.x);//输出x的值为2,不是3
}
public static void main(String[] args) {
B b = new B();
b.speak();
}
}
输出结果是:
子类可以隐藏已继承的成员变量,子类通过方法重写来隐藏继承的方法。方法重写是指子类中定义一个方法,并且这个方法的名字,放回类型、参数个数和类型与从父类继承的方法完全相同,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。
class A {
void speak() {
System.out.println("a");
}
}
class B extends A {
void speak() {//重写父类的方法
System.out.println("b");
}
public static void main(String[] args) {
B b = new B();
b.speak();//输出结果是b
}
}
注:重写父类的方法时,不可以降低了方法的访问权限。权限从高到低依次为:public protected 有好的 private
class A {
protected void speak() {
System.out.println("a");
}
}
class B extends A {
void speak() {//非法,友好的权限低于protected
System.out.println("b");
}
public void speak() {
System.out.println("b");//合法,public的权限高于protected
}
}
二、对象的上转型对象
假设B类是A类的子类或间接子类,当用子类创建B创建一个对象,并把这个对象的引用放到A类对象中时,如:
A a;
a= new B();
或
A a;
B b = new B();
a=b;
那么,称这个A类对象a是子类对象b的上转型对象(好比说:老虎是哺乳动物)。
对象的上转型对象的是体是子类负责创建的,但上转型对象会失去原子类对象的一些属性和功能。上转型对象有以下特点:
(1) 上转型对象不能操作子类新增的成员变量,不能使用子类新增的方法。
(2) 上转型对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承的或重写的方法。
(3) 上转型对象操作子类继承或重写的方法时,就是通知对应的子类对象去调用这些方法。因此,如果子类重写了父类的某个方法后 对象的上转型对象调用这个方法时,一定是调用了这个重写的方法。
(4) 可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具有了子类的所有属性和功能。
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------