任何一个伟大的目标,都有一个微不足道的开始。
上天从未抛弃过每一个努力生长的灵魂,也不曾辜负过每一个擦肩而过的生命,所有不期而遇的温暖,悄然改变着那些看似惨淡混沌的人生。
Fork me on github

Java继承、重写与重载

1.java继承

1.1概念

  • 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
  • 继承可以使用extendsimplements这两个关键字来实现继承,而且所有的类都是继承于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                         

 

posted @ 2021-10-04 14:49  Aurora*  阅读(369)  评论(0编辑  收藏  举报
-->