zoukankan      html  css  js  c++  java
  • Java基础教程----面向对象(中)

    面向对象的特征三:多态性

    7.关于向上转型与向下转型:

    7.1向上转型:多态

    7.2向下转型:

    7.2.1 为什么使用向下转型?

    //有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的。但是由于变量声明为父类类型,
    //导致编译时,智能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。

    //如何才能调用子类特有的属性和方法?

    7.2.2 如何使用向下转型:
    //向下转型:使用强制类型转换符

    7.2.3 使用时的注意点

    ①使用强转时,可能出现ClassCastException的异常

    ②为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前。,

    先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转。

    7.2.4 instance of 的使用

    ①a instanceof A :判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false

    ②如果 a instanceof A返回true ,则 a instanceof B也返回true。其中,类B是类A的父类。

    ③ 要求x所属的类与类A必须是子类和父类的关系,否则编译错误。

    7.2.5图示

     8.面试题

    8.1 谈谈你对多态性的理解?

    ①实现代码的通用性

    ② Object类中定义的public boolean equals(Object obj){}

      JDBC:使用java程序操作(获取数据库连接、CRUD)数据库(MySQL、Oracle)

    ③ 抽象类、接口的使用肯定体现了多态性。(抽象类、接口不能实例化)

    8.2 多态是编译时行为还是运行时行为

    Object类的使用

    1.java.lang.Object类的说明

    * java.lang.Object类
    * 1.Object类是所有Java类的根父类
    * 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
    * 3.Object类中的功能(属性、方法)具有通用性
    * 属性:无
    * 方法:equals()/toString()/getClass()/hashCode()/Clone()/finalize()/wait()/notify()/notifyAll()
    * 4.Object类只声明了一个空参的构造器

    2.equals()方法

    2.1 equals()的使用1.是一个方法,而非运算符* 2.只能适用于引用数据类型* 3.Object类中equals()的定义* public boolean equals(Object obj) {

      return (this == obj);
      }
    说明:Object类中定义的equals()和==的作用是相同的,比较两个对象的地址值是否相同,即两个引用是否指向听一个地址值
    * 4.像 String、Date、File、包装类都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址值
    是否相同,而是比较两个对象的“实体内容”是否相同
    * 5.通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的“实体内容”是否相同,
    * 那么我们就需要对Object类中的equals()方法进行重写
    * 重写的原则,比较两个对象的实体内容是否相等

    2.2 如何重写equals()

    2.2.1 手动重写举例:

     1 class User{
     2     String name;
     3     int age;
     4     //重写其equals()方法    
     5     @Override
     6     public boolean equals(Object obj) {
     7         if(this == obj) {
     8             return true;
     9         }
    10         if(obj instanceof User) {
    11             User o  = (User)obj;
    12             if(this.name.equals(o.name)&& this.age == o.age){
    13                 return true;
    14             }
    15 
    16         }
    17         return false;
    18 
    19     }
    20 }

    2.2.2 开发中如何实现:自动生成的 source-- 

     1     public boolean equals(Object obj) {
     2         if (this == obj)
     3             return true;
     4         if (obj == null)
     5             return false;
     6         if (getClass() != obj.getClass())
     7             return false;
     8         Customer other = (Customer) obj;
     9         if (age != other.age)
    10             return false;
    11         if (name == null) {
    12             if (other.name != null)
    13                 return false;
    14         } else if (!name.equals(other.name))
    15             return false;
    16         return true;
    17     }

    2.3 回顾==运算符的使用:

    * 1.可以使用在基本数据类型变量和引用数据类型变量中
    * 2.如果比较的是基本数据类型变量,比较两个变量保存的数据是否相等,(不一定类型要相同)
    * 如果比较的是引用数据类型变量,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体。
    * 补充: ==符号使用时,必须保证符号两边变量类型一致。

    3.toString()方法

    3.1toString()的基本使用

      1.当我们输出一个对象的引用时,实际上就是调用当前对象的toString();
    * 2.Object类中toString的定义
    * public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    * 3.像String、Date、File、包装类等都重写了Object类中的toString()方法。
    * 使得在调用对象的toString()时,返回“实体内容”信息。
    * 4.自定义类也可以重写toString()方法,当调用此方法时,返回此对象的“试题内容”
    */

    3.2 如何重写toString()

    举例:

    1     //自动实现
    2     @Override
    3     public String toString() {
    4         return "Customer [name=" + name + ", age=" + age + "]";
    5     }

    4.面试题

    ①final、finally、finalize的区别?

    ②==和equals()区别

    单元测试方法

    * 步骤:
    * 1.选中当前工程-右键选择:build path -add libraries -JUnit 4
    * 2.创建Java类、进行单元测试。
    * 此时的Java类要求:①此类是public的 ②此类提供公共的无参的构造器
    * 3.此类中声明单元测试方法
    * 此时的单元测试方法:方法的权限是public ,没有返回值,没有形参。
    * 4.此单元测试方法上需要声明注解@Test,并在单元测试类中导入import org.junit.Test;
    * 5.声明好单元测试方法以后,就可以在方法体内测试相关代码
    * 6.写完代码以后,左键双击单元测试方法名,右键:run as -JUnit Test
    *
    * 说明:
    * 1.如果执行结果没有任何异常,绿条
    * 2.如果执行结果出现异常:红条
    *
    */

    包装类的使用

    1.为什么要有包装类(或封装类)

    为了使基本数据类型的变量具有类的特征,引入包装类

    2.基本数据类型与对应的包装类

    3.需要掌握的类型间的转换(基本数据类型、包装类、String)

    简易版:

    基本数据类型<--->包装类: * JDK 5.0 新特性,自动装箱与自动拆箱

    基本数据类型、包装类<--->String:调用String类型重载的valueOf(Xxx xxx)

    String<--->基本数据类型、包装类:调用包装类的parseXxx()

    注意:转换时,可能会报NumberFormatException

    应用场景举例:

    ①Vector类中关于添加元素,只定义了形参为Object类型的方法

    v.addElement(Object obj); //基本数据类型-->包装类-->使用多态

  • 相关阅读:
    web设计_6_图片/标题/说明文字布局
    web设计_5_自由的框式组件
    web设计_4_可扩展的行
    ubuntu下把python脚本转为二进制字节码文件
    Ubuntu与Window双系统安装的注意事项
    安装Windows和Ubuntu双系统2
    安装Windows和Ubuntu双系统
    Configuring and Running Django + Celery in Docker Containers
    ggplot绘图之基本语法
    R Multiple Plots
  • 原文地址:https://www.cnblogs.com/saltedfishxiaowang/p/13616627.html
Copyright © 2011-2022 走看看