继承

xiaoxiao2021-02-28  32

1 继承

继承关键字 :extends 

 格式 :

class 类名{ //公共属性和方法 } class 类名1 extends 类名{ //子类持有的方法和属性 } 子类继承父类的公共方法属性,不能继承final private关键字

super 关键字:

 1调用父类的变量 super.

2调用父类的构造方法 super();super(参数)

3调用父类的方法super.方法名

注意 super关键字不能调用private修饰的变量 (调用 封装方法修改变量)

  super关键字的使用必须为第一条语句(this 调用本类,super调用父类)

在继承过程中实例化子类对象默认会执行父类的无参构造,再执行子类的无参构造

子类不能继承父类的构造方法,但可以通过关键字super去访问

构造有参方法:在此过程从主方法中给子类实例化,默认调用子类中的构造方法子类的构造方法默认调用父类的构造方法

   如果没有super(有参/无参)则系统会默认调用父类中的无参构造

public class Zy4_1 { int age; int score; /* * 一下行成构造方法重载 * */ //无参构造方法 public Zy4_1(){ } //有参构造方法 public Zy4_1(int age){ System.out.println("我是父类的有参构造"); this.age=age; } } public class Zy4_2 extends Zy4_1{ String name; public Zy4_2(){ //此处系统默认调用父类的无参构造 即:super(); } public Zy4_2(int age1,String name){ super(age1); System.out.println("我是子类的有参构造"); this.name=name; } } 如果给子类实例化(有参),则会先调用父类的有参构造 在调用子类的有参构造

先输出我是父类的有参构造,在输出我是子类的有参构造

 方法重写

在子类中使用父类的方法并且加入父类没有的需要元素,这种情况就需要对父类进行重写

方法重写的规则 

    1方法名相同

   2参数列表相同

   3两者关系为继承关系(父子类)

  4返回类型相同或其子类

5修饰符要求不能严于父类(父类<子类:protected<public)

注释:4中的子类

//父类定定的Text1 Text1 b; public Text1 show(){ return b; }

//子类名为Text2 Text2 a; public Text2 show(){ return a } 返回类型可以是当前父类也可以是当前子类类型

重写(Overriding)和重载的区别(Overloading) 重写:把父类的方法添加到子类的方法再加入子类的一些输出元素,构成 新的方法 重载:按照原先的方法添加或删除(参数 增加删除 类型 个数)构成的新的方法  重载和重写的本质原因为:重载后可以调用两个方法,而重写是构造成了一个新方法

 位置方法名参数表返回值修饰符方法重写父类与子类与类名相同相同相同不严于父类方法重载本类与类名相同不同无关无关

继承关系中分为:

      1 多级继承(A为父类 B为子类1 C为子类2 A被B继承,B被C继承  C包含了A中的方法属性和B中的方法属性

2  多重继承(一个子类继承多个父类,在Java中没有这个关系只有多级继承单级继承关系 C语言中有多重继承

Object 重写

常见:equals重写

可以在软件中打出equals+Alt+/

@Override //监控重写equals过程 public boolean equals(Object obj) { // TODO Auto-generated method stub return super.equals(obj); } @Override public boolean equals(Object obj){ Dog d=(Dog)j//强制类型转换 if(j.age ==age && j.name.equals(name)){     return true;    }else{     return false;} return super.equals(obj); } public static void main(String [] args){ //测试类结果 Zy3_1 j=new Zy3_1(); j.name="张三"; j.age=18; Zy3_1 j1=new Zy3_1(); j1.name="张三"; j1.age=18; System.out.println(p1.equals(p)); }这是对equals的改用,如果没有加入方法重写则会出现false;

原因:equals默认对比的为对象即存放在栈内存中,而堆内存中的age ,name则不会对比

 (默认为判断其对象名是否相等  j是否等于j1)

3 抽象方法抽象类 abstract

在定义抽象类中 使用关键字 abstract

在访问修饰符后加入 abstract 此类为抽象类

在方法中加入abstract 此方法为抽象方法

定义抽象类的好处:某些类并不需要实例化,实例化违反oop思想 多此一举就把此类定义成抽象类

 功能:该类不能被实例化

抽象方法的格式:修饰符 abstract 返回类型 方法名( );

定义抽象方法的好处:首先定义抽象方法此类必须为抽象类(必要条件)好处在于此类中定义抽象方法

     要求 在子类中必须方法重写,或者子类也为抽象类,(哪些功能必须被实现)

 原因: 抽象方法必须在抽象类中

功能:子类必须重写抽象方法

4 final

final修饰的 为最终的最终值 如final修饰的变量为常量,final修饰的方法为最终方法 final 修饰的类为最终类不能被继承

final  与 abstract 功能相反

 final不能修饰构造方法与abstract相同

final 修饰类:此类将不能被继承

final 修饰属性:变量为常量不能修改不能赋值

final 修饰方法:final修饰的方法为最终方法不能被修改 也不能重写;

在final修饰对象过程中对象后值不能重新修改

如:

public class Zy4_3 { public static void main(String [] args){ //次行加上final 对象变为不能修改 final Zy4_2 p=new Zy4_2(18,"lili"); //利用p.变量是不会报错的 因为final修饰的只是对象p p.age=18; //此行就会出现报错 //p=new Zy4_2(20,"kk"); } }

结尾

final 修饰的类不能被继承 属性为常量 方法为最终方法

abstract 修饰的类不能被实例化 修饰的方法必须被重写(或子类为抽象类);

两者容易混淆。

转载请注明原文地址: https://www.6miu.com/read-2250154.html

最新回复(0)