文章目录
一、多态性
理解:一个事物的多种形态
1. 对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
Person person2 = new Man();
Person person3 = new Woman();
2. 多态的使用:
- 虚拟方法调用(当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法。此时父类的方法称为虚拟方法。)
2.1 有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
总结:编译看左,运行看右
3. 多态性的使用前提:
① 类的继承关系 ② 方法的重写
-
对象的多态性只适用于方法,不适用于属性(编译和运行都看左边)
看图片
4. 对多态性的理解
- 实现代码的通用性
- Object类中定义的public boolean equals(Object obj){ }
JDBC:使用Java程序操作(获取数据库连接、CRUD)数据库(MySql /Oracle/DB2/SQL Server) - 抽象类、接口的使用肯定体现了多态性(抽象类、接口不能实例化)
5. 向下转型
① 有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致:编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用
② 如何才能调用子类特有的属性和方法?
使用强制类型转换符(向下转型)
③ 
package com.atguigu.java;
public class PersonTest {
public static void main(String[] args) {
Person person = new Person();
person.eat();
Man man = new Man();
man.eat();
man.age = 25;
man.earnMoney();
System.out.println("**********************************************");
// 对象的多态性:父类的引用指向子类的对象
Person person2 = new Man();
//多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法。----虚拟方法调用
person2.eat();
person2.walk();
// Person person3 = new Woman();
System.out.println("****************************");
// 不能调用子类特有的属性、方法:编译时,p2是Person类型
// person2.earnMoney();
//有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型
//导致:编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用
//如何才能调用子类特有的属性和方法?
//使用强制类型转换符(向下转型)
Man man2=(Man)person2;
man2.earnMoney();
man2.isSmoking=true;
//使用强转时,可能出现ClassCastEexception的异常
// Woman woman=(Woman)person2;
// woman.goShopping();
}
}
6. instanceof关键字的使用
- a instanceof A:判断对象a是否是类A的实例,如果是,返回true;如果不是,返回false。
- 使用情境:为了避免在向下转型是出现的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
- 如果a instanceof A返回true,则a instanceof B也返回true,则其中,类B是类A的父类。
(接上面的代码)
//instanceof关键字
if (person2 instanceof Woman) {
Woman woman2=(Woman)person2;
woman2.goShopping();
System.out.println("*****woman*****");
}
if (person2 instanceof Man) {
System.out.println("*************");
Man man3=(Man)person2;
man3.earnMoney();
System.out.println("*****man*****");
}
7. 注意:
① 若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中:编译看左边,运行看右边
② 对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中的实例变量。
二、Object类的使用
1.java.lang.Object类
- Object类是所有Java类的根父类
- 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
- Object类中功能(属性、方法)具有通用性
- Object类只声明了一个空参构造器
2. Object类中的主要结构
方法名称 | 描述 |
---|---|
public Object() | 构造器 |
public boolean equals(Object obj) | 对象比较 |
public int hashCode() | 取得Hash码 |
public string toString() | 对象打印时调用 |
1. ==运算符
- 可以使用在基本数据类型变量和引用数据类型变量中
- 如果比较的是基本数据类型变量,比较的是两个变量保存的数据是否相等(不一定类型要相同)
如果比较的是引用数据类型的变量,比较的是两个对象的地址值是否相等,即两个引用是否指向同一个对象实体。
补充:==符号使用时,必须保证符号左右两边的变量类型一致。
2. equals()方法的使用
- 是一个方法,而非运算符
- 只适用于引用数据类型
- Object类中equals()的定义:
public boolean equals(Object obj){ return (this==obj) }
说明:Object类中定义的equals()方法和==的作用是相同的:比较两个对象的地址值是否相等,即两个引用是否指向同一个对象实体。
- 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相同。
- 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的“实体内容”是否相同,那么我们需要对Object类中的equals()方法进行重写。
手动实现!!!重写的原则:比较两个对象的实体内容是否相同。
自动实现equals()重写:和生成构造器getset方法一样的方式,Alt+shift+s→Generate hashCode()and equals()…
3. ==和equals的区别
4. toString()方法的使用
- 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()方法
- Object类中的toString()方法的定义:
public String toString(){
return getClass().getName()+'@'+Integer.toHexString(hashCode());
}
- 像String、Date、File、包装类等都重写了Object类中的toString()方法。使得在调用对象的toString()方法时,返回“实体内容”信息。
- 自定义类也可以重写toString()方法,当调用此方法时,返回对象的“实体内容”。
- 自动实现重写:Alt+shift+s→Generate toString()…
三、Java中的单元测试
步骤:
- 选中当前工程-右键选择:build path-configure build path-classpath-add libriaries-JUnit-下一步
- 创建Java类,进行单元测试。
此时的Java类要求:① 此类是public的 ② 此类提供公共的无参的构造器 - 此类中声明单元测试方法。
此时的单元测试方法:方法的权限是public,没有返回值,没有形参 - 此单元测试方法上需要声明注解:@Test,并在单元测试类中导入import org.junit.Test;
- 声明好单元测试方法以后,就可以在方法体内测试相关的代码。
- 写完代码以后,左键双击单元测试方法名,右键:run as - JUnit Test
说明:如果执行结果没有任何异常:绿条;如果执行结果异常:红条
四、包装类的使用
- 为什么要有包装类(或封装类)?
为了使基本数据类型的变量具有类的特征,引入包装类。
上图的简易版:
基本数据类型<——>包装类:自动装箱与自动拆箱
基本数据类型、包装类——>String:调用String重载的valueOf(Xxx xxx)
String类型——>基本数据类型、包装类:调用包装类的parseXxx()
注意:可能会报NumberFormatException的错误
- Java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征。
- 掌握的:基本数据类型、包装类、String三者之间的相互转换
a. 基本数据类型——>包装类:调用类的构造器
b. 包装类——>基本数据类型:调用包装类的xxxValue()
JDK 5.0 新特性:自动装箱与自动拆箱
自动装箱(基本数据类型——>包装类):int num=10; Integer in1=num;
自动拆箱(包装类——>基本数据类型):int num3=in1;
c. 基本数据类型、包装类——>String类型:调用String重载的valueOf(Xxx xxx)
public void test4() {
int num1 = 10;
//方式1:连接运算
String str1 = num1 + "";
//方式2:调用String重载的valueOf(Xxx xxx)
float f1=12.3f;
String str2=String.valueOf(f1);
Double d1=new Double(12.4);
String str3=String.valueOf(d1);
System.out.println(str2);
System.out.println(str3);
}
d. String类型——>基本数据类型、包装类:调用包装类的parseXxx()
public void test5() {
String str1="123";
String str1="123";
//错误的情况
// int num1=(int)str1;
// Integer in1=(Integer)str1;
//可能会报NumberFormatException的错误
int num2=Integer.parseInt(str1);
System.out.println(str1);
}
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
该处使用的url网络请求的数据。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。