Java继承、重写与重载
1.java继承
1.1概念
- 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 继承可以使用extends和implements这两个关键字来实现继承,而且所有的类都是继承于java.lang.Object,当一个类没有继承的两个关键字, 则默认继承object (这个类在java.lang包中,所以不需要import)祖先类。
1.2继承的特性
- 子类拥有父类非private的属性、方法。
- 子类可以拥有自己的属性和方法。即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一 个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是Java继承区别于C++继承的一个特性。
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)
1.3格式
1 class 父类{
2 }
3 class 子类 extends 父类{
4 }
1.4实例
1.4.1extends关键字
在Java中,类的继承是单一继承, 也就是说,一个子类只能拥有一个父类, 所以extends只能继承一个类。
1 public class Animal {
2 private String name ;
3 private int id:
4 public Animal() {}
5 public Animal (String myName,int myid) {
6 //初始化属性值.
7 }
8 public void eat() { //吃东西方法的具体实现 }
9 public void sleep() { //睡觉方法的具体实观}
10 }
11
12 public class Penguin extends Animal {
13 }
14
1.4.2implements关键字
使用implements关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔,下面例子中的A与B)。
1 public interface A {
2 public void eat() ;
3 public void sleep() ;
4 }
5 public interface B {
6 public void show() ;
7 }
8 public class C implements A, B{
9 public void eat() {}
10 public void sleep() {}
11 public void show() {}
12 }
1.4.3super与this关键字
super关键字 : 我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字 : 指向自己的引用。
1 class Animal {
2 void eat() {
3 System.out.println(" animal : eat");
4 }
5 }
6 class Dog extends Animal {
7 void eat() {
8 System.out.println(" dog : eat");
9 }
10 void eatTest() {
11 this.eat(); // this 调用自己的方法.
12 super.eat(); // super 调用父类方法
13 }
14 }
15 Animal a = new Animal();
16 a.eat();
17 Dogd = new Dog();
18 d.eatTest();
19
1.4.4构造器
- 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在F类的构造器中显式地通过super 关键字调用父类的构造器并配以适当的参数列表。
- 如果父类构造器没有参数,则在子类的构造器中不需要使用super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
1 class SuperC1ass {
2 private int n;
3 SuperClass() {
4 System.out.println("SuperClass()");
5 }
6 SuperClass(int n) {
7 System.out.println("SuperClass(int n)");
8 this.n = n;
9 }
10 }
11 // SubClass1类继承
12 class SubClass1 extends SuperClass {
13 private int n;
14 SubClass1(){ //自动调用父类的无参数构造器
15 System.out.println("SubClass1");
16 }
17 public SubClass1(int n) {
18 super(300); //{ 调用父类中带有参数的构造器
19 System.out.println(”SubClass1(int n):" +n);
20 this.n = n;
21 }
22 }
23 // SubClass2类继承
24 class SubClass2 extends SuperClass {
25 private int n;
26 SubClass2() {
27 super(300); //{ 调用父类中带有参数的构造器
28 System.out.println("SubClass2");
29 }
30 public SubClass2(int n){ //自动调用父类的无参数构造器
31 System.out.println("SubClass2(int n):" +n);
32 this.n= n
33 }
34 }
35 System.out.println("-----SubClass类继承-----");
36 SubClass1 sc1 = new SubClass1();
37 SubClass1 sc2 = new SubClass1(100);
38 System.out.println("-----SubC1ass2类继------");
39 SubClass2 sc3 = new SubClass2();
40 SubClass2 sc4 = new SubClass (200);
2.重写(Override)与重载(Overload)
2.1重写规则
- 参数列表必须完全与被重写方法的相同。
- 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5及更早版本返回类型要-样, java7 及更高版本可以不同)。
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public, 那么在子类中重写该方法就不能声明为protected.
- 父类的成员方法只能被它的子类重写。
- 声明为final的方法不能被重写。
- 声明为static的方法不能被重写,但是能够被再次声明。
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
- 写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是.重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
- 构造方法不能被重写。
- 如果不能继承一个方法,则不能重写这个方法。
2.2重载规则
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型:
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个 子类中被重载。
- 无法以返回值类型作为重载函数的区分标准。
2.3重写与重载的区别
区别点 | 重载方法 | 重写方法 |
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
2.4.1重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改
变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据
需要实现父类的方法。
1 class Animal {
2 public void move() {
3 System.out.println("动物可以移动");
4 }
5 }
6
7 class Dog extends Animal {
8 public void move() {
9 System. out. print1n("狗可以跑和走");
10 }
11 }
12 Animal a = new Animal(); // Animal对象
13 a.move(); //执行Animal类的方法
14
15 Animal b = new Dog(); //Dog对象
16 b.move(); //执行Dog类的方法
17
2.4.2重载
重载(overloading)是在一个类里面, 方法名字相同,而参数不同。返回类型可以相同
也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一 无的参数类型列表。
最常用的地方就是构造器的重载。
1 public class Overloading {
2 public int test() {
3 System.out.println("test1");
4 return 1;
5 }
6 public void test(int a) {
7 System.out.println("test2");
8 }
9 //以下两个参数类型顺序不同
10 public String test(int a, String s) {
11 System.out.println("test3");
12 return "returntest3";
13 }
14 public String test (String s, int a) {
15 System.out.println(" test4");
16 return "returntest4";
17 }
18 }
19 Overloading o = new overloading();
20 System.out.println(o.test()) ;
21 o.test(1);
22 System.out.println(o.test(1,"test3"));
23 System.out.println(o.test("test4",1));
24
本文来自博客园,作者:Aurora*,转载请注明原文链接:https://www.cnblogs.com/lang12/p/15366408.html