继承
一、一个新类从已有的类那里获得其已有的属性和方法,这种现象叫类的继承。
二、 这个新类被称为子类,也叫派生类,已有的那个类叫父类,也叫做基类。
三、 继承的好处
- 代码得到极大的重用。
- 形成一种类的层次体系结构。
- 为多态创造条件。
四、 继承的格式;
class 子类 extends 父类
{
.....
}
---或者
class 需要继承的类 extends 被继承的类
{
.....
}
继承实例:
class Human//定义一个 Hunman类。
{
public String name;//有名字
public int age;//有年龄
}
class Student//定义一个 student类。既然是学生,就一定有人的所有特点。
{
public String name;//学生也是人,所以学生也有人的特点
public int age;
//学生就肯定有分数。
public double score;//分数
}
class Grraduate//研究生
{
//研究生就肯定有人的特点,学生的特点。
public String name;//学生也是人,所以学生也有人的特点
public int age;
public double score;//分数
//但是研究生肯定有导师。
public String daoshi;//存放导师的名字。
}
这样写很麻烦。重复定义了不少变量
所以要运用继承
class Human//Human的子类是Student
{
public String name = "张三";
public int age = 22;
}
class Student extends Human//学生类继承人类。//Student的父类是Human
{
//public String name;
//public int age;
//既然是继承,所以这个学生类已经有了上面Human类的属性。
//不需要重复定义了。
public double score = 66.6;
}
class Graduate extends Student//研究生 //Graduate的父类是Student
{
//public String name;
//public int age;
//public double score;
//理由同上
public String daoshi = "李四";//存放导师的名字。
}
public class Test1
{
public static void main(String args[])
{
//验证
Graduate gd = new Graduate();//我们只new了一个研究生对象。
System.out.printf("%s,%f\n",gd.name,gd.score);
//如果能输出Human类中的name和Student类中的score,那么就说明继承成功。
//张三,66.600000 输出成功
}
}
什么能继承,什么不能继承。
- 被继承的类中的私有制成员不能被继承。
class A//父类A
{
public int i; //公有的变量i
protected int j; //被保护的变量j
private int k; //私有的变量k
public void g()//公有的方法g
{
}
protected void b()//被保护的方法b
{
}
private void s()//私有的方法s
{
}
}
class B extends A
{
public void f()
{
i = 10;//如果i能被赋值,说明公有制属性继承成功
j = 20;//如果j能被赋值,说明保护型属性继承成功
k = 30;//如果k能被赋值,说明私有制属性继承成功
//k=30会报错。证明私有的属性不能被继承
//方法
g();//如果能调用g,说明能继承公有的方法
b();//如果能调用b,说明能继承保护的方法
s();//如果能调用s,说明能继承私有的方法
//s()会报错。证明私有的方法不能被继承。
//证明了,被继承的类中的私有制成员不能被继承
}
}
public class Test1
{
public static void main(String args[])
{
}
}
子类内部可以访问父类非私有的成员。
私有成员无法被子类访问。
通过子类对象名只能访问从父类继承过来的非私有成员。
总结:私有不能被继承。
- 私有物理上已经被继承过来 ,只不过逻辑上程序员不能去访问它。 因此继承必须慎重,否则会浪费内存。
- 继承的时候,私有成员实际上也被继承了,并在内存中分配了空间。但是语法上不能访问私有的成员。但是私有成员占了内存。
- 如果一个父类中有很多私有成员,只有一个非私有成员的时候。子类继承这个父类,虽然只能访问那个非私有成员,但是内存上,也已经把私有成员继承了过来。只是无法访问。
子类只能有一个父类。一个父类可以有若干个子类。
静态也可以被继承。
构造方法不能继承。构造方法是一个特殊的方法,不能被继承。
不同访问修饰符的权限
名称 | public(公有) | protected(保护) | default(默认) | private(私有) |
---|---|---|---|---|
同包同类 | √ | √ | √ | √ |
同包不同类访问 | √ | √ | √ | |
同包不同类继承 | √ | √ | √ | |
不同包继承 | √ | √ | ||
访问不同包无任何关系的类 | √ |