本章目标
- 掌握继承的机泵概念及实现
- 掌握继承实现的各种限制
1、具体内容
1.1、继承的基本概念
在讲解集成的概念之前先来看以下的两个类:
Person.java
class Person{ // 定义Person类
private String name ; // 定义name属性
private int age ; // 定义age属性
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
};
Student.java
class Student{ // 定义Student类
private String name ; // 定义name属性
private int age ; // 定义age属性
private String school ; // 定义school属性
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
public void setSchool(String school){
this.school = school ;
}
public String getSchool(){
return this.school ;
}
};
这两个类完成了,但是这两个类设计是否合理?
Student类中有部分代码是和Person类是重复的,而且,学生是不是人?
这段代码完全是按照之前讲解的最简单的概念实现,但是如果从实际的角度看,这种事先肯定不好。
继承:子类继承父类,可以扩展已有类的功能。
class Person{ // 定义Person类
private String name ; // 定义name属性
private int age ; // 定义age属性
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
};
class Student extends Person{ // 定义Student类
// 此处不添加任何的代码
};
public class ExtDemo02{
public static void main(String arsg[]){
Student stu = new Student() ;// 实例化子类对象
stu.setName("张三") ; // 此方法在Student类中没有明确定义
stu.setAge(30) ;
System.out.println("姓名:" + stu.getName() + ",年龄:" + stu.getAge() ) ;
}
};
输出结果:
姓名:张三,年龄:30
可以把父类中的内容拿过啦在子类继续使用,这样一来,子类如果有一些重复的方法,就不用重新定义了。
extends关键字:称为扩展,子类扩展一个类,子类有时候也称为派生类。
class Person{ // 定义Person类
private String name ; // 定义name属性
private int age ; // 定义age属性
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
};
class Student extends Person{ // 定义Student类
private String school ; // 定义school属性
public void setSchool(String school){
this.school = school ;
}
public String getSchool(){
return this.school ;
}
};
public class ExtDemo03{
public static void main(String arsg[]){
Student stu = new Student() ;// 实例化子类对象
stu.setName("张三") ; // 此方法在Student类中没有明确定义
stu.setAge(30) ;
stu.setSchool("清华大学") ;
System.out.println("姓名:" + stu.getName() + ",年龄:" + stu.getAge() + ",学校:" + stu.getSchool() ) ;
}
};
输出结果:
姓名:张三,年龄:30,学校:清华大学
子类已经扩充了已有的功能。
1.2、继承的限制
单继承:一个孩子只能有一个亲爸。
class A{
};
class B{
};
class C extends A,B{ // 错误,同时继承了两个父类
};
编译出错。
注意:不能多重继承,但是允许多层继承。
class A{
};
class B extends A{
};
class C extends B{
};
3.3、类图的关系表示图
3.4、访问限制
例如:
class Person{ // 定义Person类
private String name ; // 定义name属性
private int age ; // 定义age属性
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
};
class Student extends Person{ // 定义Student类
public void fun(){
System.out.println("父类中的name属性:" + name) ; // 错误,无法访问
System.out.println("父类中的age属性:" + age) ; // 错误,无法访问
}
};
编译出错。
换种访问,通过getter或setter
class Person{ // 定义Person类
private String name ; // 定义name属性
private int age ; // 定义age属性
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
};
class Student extends Person{ // 定义Student类
public void fun(){
System.out.println("父类中的name属性:" + getName()) ; // 正确,间接访问
System.out.println("父类中的age属性:" + getAge()) ; // 正确,间接访问
}
};
编译通过。
2、总结
1、继承的主要目的:扩展类的功能
2、Java中一个子类只能继承一个父类
3、Java中不允许多重继承,但是允许多层继承
网友评论