继承是什么
按照现有类的类型来创建新类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码,这种方法就叫做继承。继承会使子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法。
继承关键字
extends
要想让一个类继承另一个类,就要使用到关键字 extends
public class Test extends Object
{
}
表示的就是 Test 类继承了 Object 类,我们可以说,Test 是 Object 的子类,也可以说,Object 是 Test 的超类或父类。Test 会继承 Object 的域和方法(public),也就是说 Test 的实例对象可以调用 getClass、equals 等方法,这些方法都是在 Object 中定义的。
super
Java 用 super 来表示超类的意思,超类也就是我们的父类。
public class Myfile {
public long size; //file大小
public String name;//file名称
//显示信息
Myfile()
{
System.out.println("Myfile构造方法");
}
Myfile(int a)
{
this.size=a;
System.out.println("Myfile构造方法"+"size:"+size);
}
public void show()
{
System.out.println("文件大小为:"+size+"文件名称为:"+name);
}
}
public class Myvediofile extends Myfile {
//父类public自动继承
//子类属性
public int duration;//时长
//构造方法
Myvediofile()
{
super();
System.out.println("Myvediofile构造方法");
}
public void play()
{
System.out.println("播放视频:"+this.name);
}
public void stop()
{
System.out.println("停止播放:"+this.name);
}
//重写show的方法
@Override
public void show() {
// TODO 自动生成的方法存根
// System.out.println("文件大小为:"+size+" 文件名称为:"+name+" 时长:"+duration);
super.show();
System.out.println("时长:"+duration);
}
}
public class Myvediofilename extends Myvediofile{
public String vedioname;
Myvediofilename()
{
System.out.println("孙辈的构造函数");
}
}
main函数中声明调用孙辈
Myvediofilename file1=new Myvediofilename();
file1.name="beautiful world";
file1.size=123456;
file1.duration=36;
file1.show();
file1.play();
file1.stop();
Myfile构造方法
Myvediofile构造方法
孙辈的构造函数
文件大小为:123456文件名称为:beautiful world
时长:36
播放视频:beautiful world
停止播放:beautiful world
权限修饰符
private
我们都知道声明为 private 的成员是意思是私有的,不希望暴露给外界看的。所以在继承中,我们也无法用 super 调用被 private 修饰的成员。
protected & public
介绍完了比较重要的 private,接下来的 protected 和 public 权限修饰符就比较容易了。把它们放在一起讲是有原因的,因为在继承关系中,它们所展示出来的特性是一模一样的,即无论子类是谁,无论子类在哪里,都可以访问(即调用或重写)由 public 或 protected 声明的父类成员。
重写
final 关键字
我们都知道,final 关键字表示“这是无法改变的”的意思,显而易见,由 final 声明的方法是无法被重写的。所以一旦父类的方法被声明为 final,子类就无法重写该方法。事实上,声明为 private 的方法也会被隐式地声明为 final,所以声明为 private 的方法也同样无法被重写。
// 声明为 final 的方法无法被重写
final void draw() {
System.out.println("Shape.draw()");
}
// 声明为 private 的方法无法被重写
private void privateMethod() {
System.out.println("Shape.privateMethod()");
}
}
class Circle extends Shape{
// ...
// 错误:无法重写声明为 final 的方法
//@Override
//final void draw() {}
// 错误:无法重写声明为 private 的方法
//@Override
//private void privateMethod() {}
总结
1.继承会使子类继承父类的特性和方法,即父类有的子类也有。
2.继承的关键字是 extends,当子类继承父类时,子类可以通过 super 调用父类的构造方法、域和方法。
3.当子类构造方法没有调用父类构造方法时,会隐式地调用 super(),当父类的无参构造方法不可调用时,子类构造方法必须显示地调用父类的构造方法。
4.当我们的成员或方法没有添加任何权限修饰符时,默认为包访问权限。
5.声明为 private 的成员无法被子类访问;声明为 public 或 protected 的父类成员,无论子类在何处,都可以访问父类成员。
6.父类的 private 方法无论如何都无法被重写,如果子类中出现了这个方法,它属于子类的新方法,只不过和父类的方法恰巧同名罢了,使用 @Override可以避免这种陷阱。
7.父类中声明为 final 的方法是无法被重写的,事实上声明为 private 的成员也会被隐式地声明为 final。
8.在重写方法时,添加注解 @Override 永远是个好习惯。
9.重写父类方法时,重写方法的权限修饰符可以由小范围往大范围修改。
10.抽象类被继承时,如果子类为普通类,那么子类必须为父类的抽象类方法提供定义,即重写这些抽象类方法;如果子类也为抽象类,那么可以选择不重写这些父类的抽象方法。