初学Java(其四:继承与多态)

前言

还记得Java的三大特性吗?

目录)

子类与继承

子类与父类

类的声明用extends定义子类,子类拥有父类的成员方法和成员变量。子类继承父类的成员变量和方法,同时子类还可以声明自己的成员和方法。

public class Animal{		//父类
	int a;
	public void f() {
		a=2;
	}
}

public class Dog extends Animal {	//子类
	...//默认有int a;public void f(){}...
}

Object 类

Object类是java.lang包中的类,是所有类的祖先类,如果一个类不是某一个类的子类,那么这个类的父类就是Object类。

子类继承性

子类父类在同一个包中的继承性:
如果子父类在同一包中,子类自然地继承父类除private类型之外的成员变量和方法。

子类父类在不同包中的继承性:
不同包中,父类中的private和友好访问权限的成员变量不作为子类的成员变量,子类只继承父类的protected和public类型成员变量和方法。

protected的进一步说明

class A {
	protected int i;
	protected void fun() {}
}
class B extends A {
	protected int ii;
	protected void f() {
	}
}

class Other {
	B b = new b;//b是在类中调用另一个类声明的对象
}

对于子类B自己声明的protected成员变量或方法,只要Other类和B类在同一包中,b对象就可以访问这些protected成员变量或方法。

如果子类B从A继承protected类型方法或类型,b对象要调用需要other类与A类在同一包中。

instanceof运算符

如果a是A类的对象或A类子孙类对象,则a instanceof A返回值是true

成员变量隐藏和方法重写

成员变量隐藏

编写子类声明对象时如果采用与父类继承的成员变量名字相同(声明类型可以不同),子类就会隐藏所继承的成员变量
其特点如下:

  • 子类对象以及子类自己定义的方法操作与父类同名的成员变量是指子类重新声明的这个成员变量。
  • 子类对象仍然可以调用从父类继承的方法操作被子类隐藏的成员变量,也就是说子类继承方法操作变量一定是子类所继承或隐藏的成员变量(也就是父类声明的成员变量)
  • 子类在隐藏父类成员变量时访问权限只能扩大不能减小

方法重写(override)

子类通过重写可以隐藏已继承的方法
1、语法规则

  • 子类继承父类方法有权利重写,重写方法与父类方法类型一致或者是父类方法的类型的子类型(父类方法类型是“类”,允许子类重写方法的类型是“子类”),并且这个方法的名字、参数个数、参数类型和父类的方法完全相同。

2、重写的目的

  • 子类重写父类方法可以把父类的状态和行为改变为自身状态和行为。
  • 重写的方法可以操作新定义的成员变量、调用继承方法,但不能操作已经隐藏的方法和成员变量
  • 重写方法要与父类方法声明完全一致

调用隐藏的方法可以用super关键字

3、重写的注意事项
重写父类方法时,不允许降低方法访问权限,可以提高访问权限
public > protected > 友好的 > private

super关键字

一个例子看懂super关键字的一个作用:调用隐藏的父类方法

class A {
	public int i;
	public float fun() {
		i = 23.0f;
		return i;
	}
class B extends A {
	public int j;
	public float fun() {
	
		System.out.println(super.fun());
	}
public class test {
	public static void main(String [] args) {
		B b = new B();
		b.fun();
	}
}

结果:
23

super第二个作用:
当子类构建对象时,子类构造方法总是先调用父类某个构造方法,如果父类没有特殊写则是

super();

子类构造方法中第一条语句应该用super调用父类构造方法

定义构造方法时父类应当特意写一个不带参数的构造方法(默认的那个)

final关键字

final可以修饰类、成员变量,方法及方法中局部变量,修饰后变量不可变,类不可有子类,方法不允许重写。
如果成员变量或局部变量修饰为final,则为常量

上转型

Animal A = new Tiger();
//或者
Animal A;
Tiger B = new Tiger();
a = b;

a就是b的上转型对象
上转型关系

abstract(抽象)类

抽象方法不用写方法体;

abstract class fun(){
	public abstract void f();
}
  • 抽象类中可以都抽象方法也可以有非抽象方法
  • 抽象类字类必须重写抽象方法
  • 抽象类声明的对象可以成为其子类的对象的上转型对象调用子类重写的方法,即
    体现子类根据抽象类里的行为标准给出的具体行为。

开–闭原则:对扩展开放对修改关闭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值