Java学习笔记——面向对象(中)

一、多态性

理解:一个事物的多种形态

1. 对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)

Person person2 = new Man();
Person person3 = new Woman();

2. 多态的使用:

  • 虚拟方法调用(当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法。此时父类的方法称为虚拟方法。)
    2.1 有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
    总结:编译看左,运行看右

3. 多态性的使用前提:

① 类的继承关系   ② 方法的重写
  1. 对象的多态性只适用于方法,不适用于属性(编译和运行都看左边)

    看图片 在这里插入图片描述

4. 对多态性的理解

  1. 实现代码的通用性
  2. Object类中定义的public boolean equals(Object obj){ }
    JDBC:使用Java程序操作(获取数据库连接、CRUD)数据库(MySql /Oracle/DB2/SQL Server)
  3. 抽象类、接口的使用肯定体现了多态性(抽象类、接口不能实例化)

5. 向下转型

① 有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致:编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用
② 如何才能调用子类特有的属性和方法?
	使用强制类型转换符(向下转型)
③ ![在这里插入图片描述](https://img-blog.csdnimg.cn/0e1018a4dc0042e99ea1f2f1522e41a1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5ZCD5biD5LiB55qE6IOW5LiB,size_12,color_FFFFFF,t_70,g_se,x_16)
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类

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

2. Object类中的主要结构

方法名称描述
public Object()构造器
public boolean equals(Object obj)对象比较
public int hashCode()取得Hash码
public string toString()对象打印时调用

1. ==运算符

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

2. equals()方法的使用

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

说明:Object类中定义的equals()方法和==的作用是相同的:比较两个对象的地址值是否相等,即两个引用是否指向同一个对象实体。

  1. 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相同。
  2. 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的“实体内容”是否相同,那么我们需要对Object类中的equals()方法进行重写。
    手动实现!!!重写的原则:比较两个对象的实体内容是否相同。
    自动实现equals()重写:和生成构造器getset方法一样的方式,Alt+shift+s→Generate hashCode()and equals()…

3. ==和equals的区别

在这里插入图片描述
在这里插入图片描述

4. toString()方法的使用

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

三、Java中的单元测试

步骤:

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

说明:如果执行结果没有任何异常:绿条;如果执行结果异常:红条

四、包装类的使用

  • 为什么要有包装类(或封装类)?
    为了使基本数据类型的变量具有类的特征,引入包装类。

在这里插入图片描述
在这里插入图片描述
上图的简易版:
基本数据类型<——>包装类:自动装箱与自动拆箱
基本数据类型、包装类——>String:调用String重载的valueOf(Xxx xxx)
String类型——>基本数据类型、包装类:调用包装类的parseXxx()
注意:可能会报NumberFormatException的错误

  1. Java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征。
  2. 掌握的:基本数据类型、包装类、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提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值