继承的基本概念:
1.1--继承的基本概念:
先看一下两个类
Person类和Student类
class Person
{
private String name;
private int 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
{
private String name;
private int age;
private string school;
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public void setSchool(String school){
this.school=school;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public String getSchool(){
return this.school;
}
};
类定义好了,但是这样是否合理呢》
两个类的部分代码是重复的。
但是从实际的角度看,这种实现肯定不好。
这就要使用继承的概念,
class Person
{
private String name;
private int 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
{
//此处不添加任何代码
};
public class ExDemo01
{
public static void main(String args[]){
Student stu = new Student();
stu.setName("张三");
stu.setAge(18);
System.out.println("姓名:"+stu.getName()+"年龄:"+stu.getAge());
}
}
F:\java>java ExDemo01
姓名:张三,年龄:18
可以把父类的内容拿过来在子类中继续使用,这样,子类如果有一些重复的方法,将就不用重复定义了。
继承:子类继承父类,扩展已有类的功能。
1.2 extends关键字:成为扩展,子类也称为派生类。
class Person
{
private String name;
private int 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
{
//此处添加代码
private String school;
public void setSchool(String school){
this.school=school;
}
public String getSchool(){
return this.school;
}
};
public class ExDemo01
{
public static void main(String args[]){
Student stu = new Student();
stu.setName("张三");
stu.setAge(18);
stu.setSchool("清华大学");
System.out.println("姓名:"+stu.getName()+",年龄:"+stu.getAge()+",学校:"+stu.getSchool());
}
}
结果为:
F:\java>java ExDemo01
姓名:张三,年龄:18,学校:清华大学
F:\java>
1.3 继承的限制
在java中只允许单继承,不允许多继承。即一个子类只能继承一个父类,
class A{
};
class B
{
};
class C extends A,B
{
};
结果为:
F:\java>javac ExDemo02.java
ExDemo02.java:7: 需要 '{'
class C extends A,B{
^
1 错误
但是允许多层继承,即一个子类可以有一个父类,一个父类还可以有一个父类。
class A{
};
class B extends A{
};
class C extends B{
};
1.4:访问限制
子类是不能直接访问父类的私有成员的,但是子类可以调用父类的非私有方法,但是不能直接调用父类中的私有成员。
class Person
{
private String name;
private int 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
{
//此处添加代码
public void fun(){
System.out.println(name);//错误
}
};
public class ExDemo02
{
public static void main(String args[]){
Student stu = new Student();
stu.setName("张三");
stu.fun();
}
}
F:\java>javac ExDemo01.java
ExDemo01.java:26: 类 ExDemo02 是公共的,应在名为 ExDemo02.java 的文件中声明
public class ExDemo02
^
ExDemo01.java:22: name 可以在 Person 中访问 private
System.out.println(name);//错误
^
2 错误
修改后的代码:
class Person
{
private String name;
private int 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
{
//此处添加代码
public void fun(){
System.out.println(getName());//错误
}
};
public class ExDemo01
{
public static void main(String args[]){
Student stu = new Student();
stu.setName("张三");
stu.fun();
}
}
结果为:
F:\java>javac ExDemo01.java
F:\java>
F:\java>java ExDemo01
张三
F:\java>