菜鸟之旅——Java入门篇(五)继承

  继承

上一章中我们简单介绍了面向对象,面向对象涉及到的继承,这一章中,我们详细介绍。那么什么是继承那?

简单的来说,继承就是 子类拥有父类的属性和方法。

继承的基本语法

  在Java语言中,用extends关键字来表示一个类继承另一个类,例如:

   public class Cat extends Animal{

      ……

}

这表示猫类继承了动物类。

 1、继承的定义

子类的成员中有一部分是子类自己声明定义的 ,另一部分是从它的父类继承的。子类继承父类的成员变量作为自己的一个成员变量,就像它们是在子类中声明的一样,可以被子类中自己声明的任何实例方法操作。子类继承的成员变量是父类的完全意义的成员,如果子类不能操作父类的某个成员变量,那么该变量没有被子类继承。同样方法也是。

2、子类和父类的继承

如果子类和父类在同一包中,那么子类自然的继承了其父类中不是private的成员变量作为自己的成员变量,也自然地继承了父类中不是private的方法作为自己的方法。如果不在一个包内,则子类继承父类的protected、public成员作为子类的成员变量,并继承protected、public方法,但子类不能继承父类的友好标量和方法。

3、成员变量的隐藏

父类中的成员变量可以被继承,也可以被隐藏,当子类中的成员变量和父类中的成员变量同名是(可以类型不一样),父类的成员变量就被隐藏了,也就是说子类重新定义了这个成员变量。特变注意的是,尽管父类的成员变量被隐藏,但子类仍然可以使用从父类继承的方法操作操作被隐藏的成员变量。

4、方法重写与方法重载

通过上面的讲解我们知道,子类可以隐藏从父类继承的成员变量。同样的,子类也可以隐藏被继承的方法,那么怎样来隐藏被继承的方法那?

方法重写:是指子类中定义一个方法,并且这个方法的名字、返回类型、参数个数和类型与父类继承的方法完全相同。子类通过方法的重写可以隐藏继承的方法,这样可以把父类的状态和行为改变为自身的状态和行为。

说到方法重写,不得不说说方法重载,很多人在初学的时候很容易把这两个概念给混淆了,虽然它们只用一字之差,但功能相差的太大。

方法重载:方法重载是让类以统一的方式处理不同类型数据的一种手段。在类中创建多个方法,它们具有相同的名字,不同的参数和不同的定义,调用方法时,通过传递不同的参数和个数来决定调用那个方法,这是多态。

例如:

class A{
	public int f(int x,int y){
		return x*y;
	}
	public double f(double x,double y){
		return x*y;
	}
	public double f(double x,int y){
		return x*y;
	}	
}
public class ChongZai {
	public static void main(String[] args) {
		A a=new A();
		System.out.println(a.f(2.3, 0.1));
		System.out.println(a.f(2.3, 2));
		System.out.println(a.f(2,4));
	}
}


5、关键字super

关键字super有两种用法:一种是子类使用super调用父类的构造方法,另一中是子类使用super调用被子类隐藏的成员变量和方法。

子类不继承父类的构造方法,因此子类如果想使用父类的构造方法,必须在子类的构造方法中使用关键字super来表示。而且super必须是子类构造方法中的第一条语句。子类在创建对象是,子类的构造方法总是先调用父类的某个构造方法。如果子类的构造方法没有明确的指明使用哪个父类的构造方法,,子类就调用父类的不带参数的构造方法,如果在子类中的构造方法中,没有使用关键字super调用父类的某个构造方法,那么默认有super();语句,即调用父类不带参数的构造方法,如果父类中没有提供不在参数的构造方法,会出错哦。

如何使用super操作被隐藏的成员变和方法?我们知道,当子类定义成员变量和父类成员重名时,父类成员变量就被隐藏,我们可以使用super来调用被隐藏的成员变量。比如super.x=100;super.play();等。

6、final类与final方法

final类不能被继承,即不能有子类。在类名前加关键字final,这个类就被定义成final类,当一个类被定义为final时,它的所有方法都自动成为final方法,但不影响对变量的定义。如果在父类中定义一个final类型方法,虽然这个final类型方法可以被继承,但是它不能被重写。final参数的含义与final变量一样,是常数参数,即当方法接受了这个参数后,其值不能被改变。

7、上转型对象

上转型对象,其内容对于理解多态以及在程序设计中的重要性都是非常重要的。什么是上转型对象那?假设B是A的子类或者是间接子类,用子类B创建一个对象,并把这个对象的引用放到类A声明的对象中时 ,如:

A a ;

B b=new B();

a=b;

那么就称对象a是子类对象b 的上转型对象。

对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能。特点:

(1)、上转型对象不能操作子类声明定义的成员变量,不能使用子类声明定义的方法。

(2)、上转型对象可以替代子类对象去调用子类重写的实例方法。如果子类重写的方法是实例方法,那么上转型对象调用重写的方法时,就会通知对应的子类对象去调用这些方法。

(3)、上转型对象可以调用子类继承的成员变量和隐藏的成员变量。

可以将对象的上转型对象再强制转换到一个子类对象,这时子类对象又具备了子类的所有属性和功能。

8、继承与多态

大家都知道面向对象有三个特征:封装、继承与多态。

封装是为了保护数据,继承是为了重用父类代码,那么多态那?

下面我们浅谈继承与多态的关系,与继承有关的多态性是指父类的某个实例方法被其子类重写时,可以各自产生自己的功能行为,指同一个操作被不同类型对象调用时可能长生不同的行为。如果一个类有很多子类,并且这些子类都重写了父类中的某个实例方法,把子类创建的对象的引用放到一个父类的对象中时,就得到了该对象的一个上转型对象,那么这个上转型对象在调用这个实例方法时就可能具有多种形态,因为不同的子类在重写父类的实例方法时可能产生不同的行为。不同对象的上转型对象调用同一方法可能产生不同的行为。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值