继承和访问属性
在类的派生中, 字段和方法会被继承, 但构造函数不会被继承,这里详细介绍一下在类的派生中. 哪些资产可以披继承. 哪些资产不可以被继承, 以及它们的访问属性又会变成什么祥。
一、成员
在类的派生中,只有类的成员可以被继承, 类的成员如下所示:
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();
}
}
}



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

被折叠的 条评论
为什么被折叠?



