java学习笔记(二十一)继承

java学习笔记(二十一)继承

继承的基本概念:


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>