15、Java基础---继承和访问属性

本文详细介绍了Java中继承和访问属性的相关概念。包括成员继承、final类和方法的特性、重写方法时的访问控制以及类的派生和多态的总结。强调了final类不可被继承,final方法不可被重写,以及重写方法时访问控制修饰符的限制。此外,还讨论了构造函数、super关键字的使用以及多态的概念。

继承和访问属性

在类的派生中, 字段和方法会被继承, 但构造函数不会被继承,这里详细介绍一下在类的派生中. 哪些资产可以披继承. 哪些资产不可以被继承, 以及它们的访问属性又会变成什么祥。

一、成员

在类的派生中,只有类的成员可以被继承, 类的成员如下所示:
1、字段
2、方法
3、类
4、接口【不是指一般的类和接口,而是类中声明的类和接口】

 超类中的成员会被直接继承,不过具有私有访问属性的成员,即声明为private的成员不会被继承

类中还有如下非成员资产:【不会被继承】
1、实例初始化器
2、静态初始化器
3、构造函数

二、final 类和方法

声明为final的类和方法在派生中会被特殊处理。

final类
不可以从final类中进行派生。也就是说, 无法创建以final类为超类的类。
例如,表示字符串的String类就被声明为final类:

public final class String{		//String类为final类
	// ...
}

不可以像下面这样创建String类的扩展类:

class doString extends String{		//错误
	//...
}

【不应该扩展的类(不能创建子类)要声明为final类】

final方法

像下面这样,在方法的开头加上final进行声明的final方法不可以被子类重写

final void f(){		//该方法不能被重写
	// ...
}

【不应该被子类重写的方法要声明为final方法】

三、重写和方法的访问属性

当重写方法时,必须赋给与上位类中的方法相同或更弱的访问控制修饰符;访问控制的强弱关系如图,修饰符的访问控制最弱的是具有公开(public)访问控制的m1, 而最强的是具有私有(private)访问控制的m4

当下位类中重写方法时,不可以赋给比上位类中的方法更强的访问控制修饰符,下表中对该规则进行了归纳:

例如当类A派生的子类中要重写方法ml时、声明中必须加上public (如果不加上public, 就会发生编译错误),当重写方法m2时,必须加上public或者protected;私有的方法(作为子类中可以使用的形式)不会被继承,当然也就不可以重写,类A派生的子类中可以定义方法m4 ,这是因为存在下述规则:即使下位类中定义了与私有方法具有相同签名、相同返回类型的方法,也不会被看作是重写,只是碰巧具有相同规格但毫无关系的方法而已。

在Java的所有类的“老大类"Object类中,toString被定义为public方法,因此当重写toString类时 一定要加上public,方法string toString ()必须在定义中加上public修饰符。

不可以将超类的类方法重写为实例方法, 下面的程序会发生错误:

class A{
	static void f(){...}	//f是类方法
}

class B extends A{
	void f(){...}		//错误
}

当存在多个修饰符肘,虽然可以按任意顺序进行指定,但建议遵循下表:

四、类的派生和多态总结

1、通过类的派生,可以简单创建继承已有类的资产的类;
2、派生源的类称为超(上位)类,通过派生创建的类称为子(下位)类,派生赋予类“血缘关系”;
3、未显式执行派生声明的类都是Object类的子类,因此Java的所有类都是Object类的下位类;
4、在类的派生中,构造函数不可以被继承;
5、在构造函数的开头,可以使用super(...)来调用超类的构造函数。如果未显式进行调用,
编译器会自动插入一个超类的“不接收参数的构造函数” 的调用super();
6、在未定义构造函数的类中,编译器会自动定义一个只执行super()的默认构造函数。如果超类中没有“ 不接收参数的构造函数”则会发生编译错误;
7、超类中的非私有成员可以通过”super. 成员名“进行访问;
8、当类B为类A的下位类时,可以表示为“类B是A的一种”这种关系称为is-A关系;
9、如果上位类类型的变量可以引用下位类类型的实例. 就可以实现多态。在调用与多态相关的方法时要调用的方法会在程序运行时确定,执行动态联编
10、下位类类型的变量如果未执行转换、就不可以引用上位类类型的实例;

11、引用类型的放大转换(向上类型转换)是将下位类类型转换为上位类类型,与之相反的转换是引用类型的缩小转换(向下类型转换);
12、对于要重写的方法,必须赋予与上位类中的方法相同或更弱的访问控制修饰符。否则会发生编译错误;
13、注解是传达给人类和编译器的注释;
14、当方法重写上位类中的方法时,最好在声明中加上@Override注解。

Member.java

//--- 会员类 ---//
public class Member {
	private String name;	// 姓名
	private int no;			// 会员编号
	private int age;		// 年龄

	public Member(String name, int no, int age) {
		this.name = name;  this.no = no;  this.age = age;
	}

	public String getName() {
		return name;
	}

	public void print() {
		System.out.println("No." + no + ":" + name +
						   "(" + age + "岁)");
	}
}

SpecialMember.java

//--- 优待会员类 ---//
public class SpecialMember extends Member {
	private String privilege;		// 优惠

	public SpecialMember(String name, int no, int age, String privilege) {
		super(name, no, age);  this.privilege = privilege; 
	}

	@Override public void print() {
		super.print();
		System.out.println("优惠:" + privilege);
	}
}

MemberTester.java

//--- 测试会员类 ---//
public class MemberTester {

	public static void main(String[] args) {
		Member[] m = {
			new Member("桥口", 101, 27),
			new SpecialMember("黑木", 102, 31, "会费免费"),
			new SpecialMember("松野", 103, 52, "会费减免一半"),
		};

		for (Member k : m) {
			k.print();
			System.out.println();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值