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 查看源码

posted @ 2017-11-05 09:04  SkyeAngel  阅读(254)  评论(0编辑  收藏  举报