第六章、面向对象(下)

1、this与super

(1)this:

this 用法有三种,主要应用场合:

用法一:表示当前对象引用,常用于形参或局部变量与类的成员变量同名的情形,使用this.成员名表示当前对象的成员

用法二:表示当前对象

用法三:调用当前类的构造方法


(2)super: 子类的数据成员或成员方法与父类的数据成员或成员方法名字相同时,当要调用父类的同名方法或同名数据成员时则可    用super来指明。即super.数据成员;super.成员方法 l  super(参数) , 表示调用父类构造方法

子类和父类定义了同名数据成员,子类继承了父类的x,自己又定义了一个x,则会发生父类数据成员的隐藏。在子类 中用的x都是子类自己的,若要使用父类x,则必须用super.x。 子类在覆盖父类方法的同时,调用父类的super.Printme(),这 个方法中的成员变量均为父类的成员变量。super.Printme()中 的代码虽然调用父类代码,但其中的this指的是子类对象。 

构造方法的多态与继承:

(1)构造方法的多态(重载):一个类的若干个重载的构造方法之间可以相互调用。当一个构造方法需要调用另一个构造方法时,可以使用关键字this,同时这个调用语句应该是整个构造方法的第一个可执行语句。使用关键字this来调用同类的其它构造方法,优点同样是以最大限度地提高对已有代码的利用程度,减少程序的维护工作量。

(2)构造方法的继承:构造方法的继承遵循以下的原则:1.父类构造方法,子类可以在自己的构造方法中使用super来调用,但必须是子类构造方法的第一个可执行语句。2、若子类构造方法中没有显式调用父类构造方法,则在产生子类的对象时,系统在调用子类构造方法的同时,默认调用父类无参构造方法。3、综上两点:子类的构造方法必定调用父类的构造方法。如果不显式用super方法,必然隐含调用super()。


显式使用super调用父类的构造方法


隐式使用super调用父类的构造方法


2、抽象类

概念:用abstract修饰的类称为抽象类,用abstract 修饰的成员方法称为抽象方法

①抽象类和具体类的关系就是一般类和特殊类之间的关系,是继承和被继承的关系。

②抽象类中可以有零个或多个抽象方法,也可以包含非抽象方法。只要有一个抽象方法,类前就必须有abstract修饰。若没有抽象方法,类前也可有abstract修饰。

③抽象类不能创建对象,创建对象由具体子类来实现,但可以有声明,声明能引用所有具体子类的对象。 

④对于抽象方法,在抽象类中只指定方法名及类型,而不写实现代码。抽象类必定要派生子类,若派生的子类是具体类,则具体子类中必须实现抽象类中定义的所有抽象方法(覆盖)。

⑤若子类还是抽象类,如果父类中已有同名abstract方法,则子类中就不能再有同名的抽象方法了。

⑥在抽象类中,非抽象方法可以调用抽象方法。

⑦abstract不能与final并列修饰同一个类(产生逻辑矛盾);abstract 不能与private ,static(因为static修饰的方法必然被直接调用),final或native并列修饰同一个方法。

3、接口(interface)


接口的两种含义:

①可以被引用调用的方法(public方法或同包中的protected方法或默认方法);

②另一种是同“类”概念地位相当的专有概念interface, interface是方法说明的集合。

interface声明格式:

 [public]  interface 接口名[extends父接口名列表]

  {  //静态常量数据成员声明

    [public][static][final] 域类型 域名 = 常量值

  //抽象方法声明 

    [public][abstract]返回值 方法名(参数列表)[throw 异常列表]

  }

定义接口要注意几点:

①接口定义用关键字interface,而不是用class,interface前的修饰符要么为public,要么为缺省。

②接口定义的数据成员全是final static(静态常量)。即使没有修饰符,其效果也等效,访问级别要么为public,要么为缺省。

接口中没有构造方法;所有成员方法都是抽象方法(与抽象类有所不同)。即使没有修饰符,其效果完全等效,访问级别要么为public,要么为缺省。注:方法前不能修饰为final。

④接口具有继承性,可通过extends关键字声明接口的父接口。

例:

接口的设计用途:通用可扩展代码,多态体现


接口实现要注意几点:

①在类中,用implements关键字来实现接口。一个类可以实现多个接口,在implements后用逗号隔开多个接口的名字。一个接口也可被多个类来实现。

②接口的实现者可以继承接口中定义的常量,其效果等效于在这个实现类当中定义了一个静态常量。

③如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现接口的所有抽象方法,而且方法头部分应该与接口中的定义完全一致。

④如果实现接口的类是abstract类,则它可以不实现该接口的所有方法。但对于抽象类的任何一个非抽象的子类而言,接口中的所有抽象方法都必须实现。

⑤接口的抽象方法的访问限制符如果为缺省或public时,类在实现方法时,必须显式使用public修饰符,否则将被警告为缩小了接口中定义的方法的访问控制范围。

4、抽象类与接口

两者区别

5、引用


引用要点

①引用如何形成:先声明,后初始化(将对象赋给引用)

②抽象类声明进行引用有什么特点?

     抽象类声明可以引用所有具体子类对象,此概念可以推广到所有具有父子关系的类,以及接口和实现类。

③引用可以替换吗?

     替换是有原则的:父类引用可以指向子类对象,子类声明不能引用平行级别的其它类的对象,也不能引用父类对象。

④父类声明和子类声明引用同一个子类对象有什么区别?   

     父类声明是从父类的角度去引用对象,子类声明是从子类角度引用对象。父类引用子类对象时,可以经过显式的转化赋给子类的声明,但子类的引用赋值给父类的声明则不需要。

例:A是父类(非抽象类),A1,A2分别是A的子类

      A a= new A();  //声明一个父类对象引用a

     a = new A1();    //父类引用a可以引用一个子类A1的对象

     A1 a1 = (A1) a; //声明一个子类引用a1,将父类引用a显式转换后

                                 赋值给a1

    A aa = a1;         //声明一个父类引用aa,子类引用a1可以直接赋值给aa,使得aa

                               指向子类A1的对象

   A2 a2= new A1();  //错误,子类引用不能平行引用同一父类的另一个子类对象

   A2 a2= new A();  //错误,子类引用不能引用父类对象

引用比较:

1)equals方法:equals方法是Object类的方法,比较本引用和参数指明的某个引用是否相等,即是否指向同一对象。返回true或false。很多Object的子类对其进行了覆盖,并实现了不同的功能,例如:String类对equals方法进行了覆盖,比较两个字符串对象的内容是否相等,而不是比较引用是否指向同一个字符串对象

true

(2)使用“==”比较:如果两边是对象引用则比较的是它们的引用是否相同;如果两边是数值,则比较的是它们的值(如果值类型不同,有可能发生类型转化,例如10==10.0将返回true);如果一边是引用,一边是值,则编译错误。

对象引用: String  s1= newString("Hello");

                   String  s2= newString("Hello");

                   System.out.println(s1==s2); //false

值比较:    int  s1 = 10;

                  float s2= 10.0f;

                  System.out.println(s1 == s2); //true

(3)instanceof的用法:判断对象是否为某个类可引用的实例

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 包装类 通过包装类将八种基本类型的值包装成对象使用 自动装箱:把基本类型变量赋给对应包装类变量 自动拆箱:把包装类...
    Utte阅读 1,677评论 0 0
  • 1 面向对象No6 面向对象 OO Object Oriented 编程时以对象为单元,封装数据和逻辑,以此提...
    征程_Journey阅读 4,900评论 0 2
  • java继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。 继承就是子类继...
    863cda997e42阅读 3,947评论 0 1
  • 面向对象笔记 一、 对象在内存中的存放方法以及被调用过程 class文件首先被加载到方法区中的class文件内容区...
    VictorBXv阅读 3,359评论 0 2
  • 原文链接:https://github.com/EasyKotlin 在前面的章节中,我们学习了Kotlin的语言...
    JackChen1024阅读 4,302评论 0 3