zoukankan      html  css  js  c++  java
  • Java基础——面向对象编程二:继承与多态

    面向对象的特性二:继承
      形式:class A extends B
        子类:A, 父类(或基类 superClass):B
        Java中类的继承只支持单继承

    方法的重写: 区别于方法的重载(在同一个类中)
      1.前提:有子类继承父类
      2.子类继承父类后,若父类的方法子类不适用,那么子类可以对父类的方法重写(override、overwrite)、覆盖、覆写。
      3.重写的规则:1)要求子类的“返回值类型 方法名(参数列表)”与父类的方法一样
               2)子类方法的修饰符不能小于父类方法的修饰符
               3)若父类方法抛异常,那么子类方法抛的异常不能大于父类的
               4)子父类的方法必须同为static或同为非static

    关键字super:调用父类中指定的操作
      1.当子类与父类有同名的属性时,可以通过“super.属性”显示父类中声明的属性
         若想调用子类的同名属性“this.属性”
      2.当子类重写父类的方法后,在子类中若想再显示调用父类被重写的方法,就需要使用“super.方法”
      3.super修饰构造器:通过在子类中使用“super(形参列表)”来显示的调用父类中指定(由形参列表指定)的构造器
        》在构造器内部,“super(形参列表)”必须要声明在首行
        》在构造器内部,“super(形参列表)”或“this(形参列表)”只能出现一个
        》在构造器内部,不显式调用“super(形参列表)”或“this(形参列表)”中任何一个,默认调用的是父类空参的构造器
        注:在设计一个类时,尽量提供一个空参的构造器
      this:
        1.当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加this来表明该变量时类成员
        2.在任意方法内,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的阅读性
        3.this可以作为一个类中,构造器相互调用的特殊格式
          1.使用this()必须放在构造器的首行!
          2.使用this调用本类中其他的构造器,保证至少有一个构造器是不用this的。

    面向对象的特性三:多态性
      1.方法的重载与重写
      2.子类对象的多态性:父类的引用指向子类对象
        Person p1 = new Man(); 父类:Person() 子类 Man();
        虚拟方法调用:通过父类的引用指向子类对象的实体,在调用方法时,实际执行的是子类重写父类的方法
      子类对象多态性使用的前提:1.要有类的继承。2.要有子类对父类方法的重写
      3.程序运行分为编译状态运行状态
        对于多态性来说:编译时,“看左边”,将此引用变量理解为父类的类型
        运行时,“看右边”,关注真正对象的实体:子类的对象。那么执行的方法是子类重写的。
      4.子类对象的多态性:不适用于属性,Person p1 = new Man();中p1的属性调用仍然是父类中的。

      instanceof:格式:对象a instanceof 类A(判断对象a是否是后面类A的一个实例)返回true/false
             若a是A类的实例,那么a是A的父类的实例

      对象类型转换:1.子类到父类的类型转换可以自动进行
               2.从父类到子类的类型转换,必须通过造型(强制类型转换)实现
               3.无继承关系的引用类型间的转换是非法的
               4.在造型前,可以使用instanceof操作符测试一个对象的类型
              if(p1 instanceof Man){ //p1是一个父类的对象,Man是一个子类
                Man m = (Man)p1; //父类转换成子类
              }

    Object类:是所有Java类的根父类
      如果在类的声明中,未使用extends关键字指明父类,默认父类为Object类
    Object类中的方法
      1.equals();
        1.只能处理引用类型变量
        2.在Object类,发现equals()仍然比较的两个引用变量的地址是否相等
          像String,包装类,Date类,File类这些重写了Object类的equals()方法,比较的是两个对象的实体内容是否完全相同

    String中的"==" 与equals();  String型是引用数据类型  在内存中,创建String后,内容存在方法区的字符串常量池中。

    String str1 = "AA";

    String str2 = "AA";

    String str3 = new String("AA");

    str1 == str2 ; //true

    str1.equals(str2); //true

    str1 == str3; //false  比较的是地址

    str1.equals(str3); //true  比较的是内容


    手动生成一个equals()方法:

    public boolean equals(Object obj){
        if(this == obj){
          return true;
      } else if(obj instanceof MyDate){
        MyDate m = (MyDate)obj;
        return this.day == m.day && this.month == m.month && this.year == m.year;
      } else {
        return false;
      } }

      自动生成:  Source->Generate hashCode() and equals() 来调用现成的方法。

      2.toString()方法:

        1.当我们打印一个对象的引用时,实际上默认调用的就是这个对象的toString()方法

        2.当我们打印的对象所在的类没有重写object中的toString()方法时,那么调用的就是object中定义的toString()方法,返回此对象所在的类及对应的堆空间对象实体的首地址值。

        3.若重写toString()方法后,调用的就是重写后的toString()方法。

      一般toString()重写为:将对象的属性信息返回。可以手动实现,也可以自动调用Source->toString()

        4.像String,Flies,Date和包装类等,已经实现了object类中toString()方法的重写

    包装类

      基本数据类型    包装类

      boolean             Boolean

      byte      Byte

      short     Short

      int       Integer

      long     Long

      char     Character

      float     Float

      double    Double

    注:String不是基本数据类型,引用数据类型  在内存中,创建String后,内容存在方法区的字符串常量池中。

      掌握基本数据类型,包装类以及String之间的相互转化

      1.基本数据类型 -->包装类

        调用包装类的构造器

          int i = 10;

          Integer i1 = new Integer(i);

          Integet i2 = new Integet(2);

          Float f = new Float(12.5F);

          Float f = new Float("12.5F");//String型的或者float型的都可以

          Float f = new Float("12.5Fada");//错误,内容不是一个数值型的字符串

          note:Boolean型的只有传入的是"true"或者true是,才是true,否则就是false,(true1也是false)

        所有包装类的默认初始化的值都为null

        boolean b;  //默认为false

        Boolean b;  //默认为null

      2.包装类 -->基本数据类型  调用包装类的xxxValue()方法转换回去

      int i2 = i1.intValue();

      float f2 = f.floatValue();

        自动装箱、拆箱

          自动装箱:

            int i = 12;

            Integer i1 = i;

            Boolean b = false;

          自动拆箱:

            int i2 = i1;

      3.基本数据类型和包装类 与 String类之间的转换

        基本数据类型和包装类 --> String类  //调用String类的String.valueof(Xxx x) (重载的)方法

          int i = 10;

          法一:String str1 = i + "";

          法二:String str2 = String.valueof(i); //调用String类的valueof() (重载的)方法

        String类 --> 基本数据类型和包装类 调用包装类的XXX.parseXxx(String str) (重载的)方法

          int i1 = Integer.parseInt(str1);

    Ctrl+Shift+O 导包
    Ctrl+Shift+T 查看源码

  • 相关阅读:
    [TJOI2013]循环格
    [CQOI2017]小Q的表格
    【51nod 1514】 美妙的序列
    【bzoj3456】 城市规划
    [SHOI2010]最小生成树
    CF438E The Child and Binary Tree
    bzoj 4712: 洪水
    POJ-3069 Saruman's Army---区间选点
    POJ-3617 Best Cow Line---字符串贪心
    HDU-1850 Being a Good Boy in Spring Festival---尼姆博奕的运用
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/7786533.html
Copyright © 2011-2022 走看看