Java学习day05-面向对象编程(中)

本文详细介绍了Java中的面向对象编程特性,包括继承性、多态性和对象的使用。讲解了如何通过继承减少代码冗余,如何实现方法的重写与super关键字的应用。此外,还探讨了多态性的概念及其在运行时的重要性,以及如何进行向下类型转换。同时,提到了Object类的使用,`==`与`equals()`的区别,以及toString方法。最后,文章还涵盖了单元测试的使用和基本数据类型与包装类之间的转换。
摘要由CSDN通过智能技术生成

继承性

和C++相似的作用,减少冗余,提高代码复用性。为多态性使用提供了前提。

继承的格式:class A extend B{}//A继承B
A:子类、派生类、subclass
B:父类、超类、基类、superclass

体现:A继承B,A获得B中声明的结构:属性、方法。但只能继承公有的属性和方法。如果是private的属性方法,也可以继承但由于封装性,不能调用。

Java中类的单继承性:可以有多个儿子,但不能有多个爸爸。和C++不同,C++可以一个子类继承多个父类的属性。
在这里插入图片描述

object类

所有自定义的类都是继承了object类的功能,是lang包中默认存在的所有类的父类。

Eclipse Debug 不能step into 的问题

解决方法视频连接https://www.bilibili.com/video/BV1Kb411W75N?p=271&spm_id_from=pageDriver

方法的重写(override/overwrite)

对从父类继承过来的方法进行重写和改造。在重写后,再次调用该方法,则调用的是子类中重写的改造后的方法。

重写规定:
方法声明:权限修饰符 返回值类型 方法名(形参列表){
//方法体
}
1.子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符。
2.子类不能重写父类中被声明为private权限的方法。
3.父类被重写的方法返回值是void,则子类重写的方法的返回值只能是void
4.父类被重写的返回值A类型,则子类重写的方法的返回值是A类或A类的子类
5.子类重写的方法抛出的异常值类型不大于父类被重写的方法抛出的异常类型。
子类和父类中的同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写)。
在这里插入图片描述

关键字:super

重写了父类的方法A但是又想重新使用父类的方法 A则使用super关键字修饰方法则表示调用父类中的方法。和this区分开来,this调用该类中的方法和属性,super调用父类中继承过来的方法和属性。

this(形参列表);//构造器
super(形参列表);//构造器

1.super形参列表的使用必须声明在子类构造器的首行
2.在类的构造器中,针对this(形参列表)或super(形参列表)只能二选一不能同时出现。
3.在构造器首行,没有显示的声明this(形参列表)或super(形参列表),则默认调用的是父类中的空参的构造器

OOP特征三:多态性

和C++一样分为运行时多态,一个父类可以展现多个子类的功能。就是一个事物的多种形态。

public static void main(String[] args){
	Person P1=new Person()'
	Man man= new Man();//Man是Person子类
	//*******************************
	//多态性
	Person P2=new Man();//对象的多态性 子类对象赋值给一个父类引用
	P2.eat();
	Person P2=new Woman();
	
}

1.父类的对象调用了子类的构造函数,此时展现了子类的功能。可以在运行的时候根据不同的子类需求变成不同的子类。

2.当调用子类父类同名同参数的方法时,实际执行的是子类重写父类的方法-------虚拟方法调用。

3.虚拟方法调用:编译期调用父类的方法,运行的时候执行的是子类的方法,父类的方法称为虚拟方法。该方法在C++里叫动态绑定。
总结:编译看左边执行看右边
4.多态性使用前提:一定要有继承关系,得有重写的关系
在这里插入图片描述
如果没有多态性,则对于子类执行相同的功能,需要写许多的重载函数来调用子类的方法。减少了代码冗余 。包括不同类型数据库的连接,增加的代码的通用性。

多态性只适用于方法,不适用于属性

向下类型转换(向子类型转换)

instanceof关键字,判断某对象的类型。
当父类无法调用子类中特有的方法时,可以使用强制类型转换让父类的对象变成子类对象。

Person p2=new Man();//多态性
Man m1=(Man)p2;//强制类型转换,向下转型

在这里插入图片描述
但是有一定的风险就是转换不成功,可能出现ClassCastException的异常。为了避免这种事情发生,采用instanceof。为了使用向下转型(强制类型转换)之前不出现异常,需要采用instanceof判断

//判断p2是否是Woman类型,是则返回true否则返回false。
if(p2 instanceof Woman){
	Woman m1 = (Woman)p2
}

object类的使用

只声明了空参构造器。如果当前对象的内容没有指向一个地质,则调用finalize()这个方法来回收这个垃圾
在这里插入图片描述

==和equals()的区别

可以用在基本数据类型和引用数据类型。== 表示两个对象是否指向同一个地址或者基本数据类型数值是否相等。object类作用中equals()方法和= =的作用是相同的。但string、Data、File、包装类中都重写了equals方法。重写了之后比较两个实体之间的内容。自定义的类如果想比较实体类的内容也需要进行重写。
在这里插入图片描述

toString方法

在这里插入图片描述

JUnit单元测试

新建类,随后右击文件,点击build path,再点add library,再点JUnit,这个类需要是共有类且需要提供一个公共无参的构造器。写完测试单元后run as JUnit Test。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

包装类

还是类,就是把基本数据类型变成类。
在这里插入图片描述

基本数据类型,包装类,string类之间的转换

基本数据类型转换为包装类:

int n1=10; 
integer t=new integer(n1);
System.out.println(t.toString());

包装类转换为基本数据类型:调用包装类的xxxValue();函数xxx为包装类类型。

integer t=new integer(10);
int n1=t.intValue();
System.out.println(nl.toString());

JDK5.0引入了自动拆箱和自动装箱使得基本数据类型可以自动的转换为包装类。或者包装类自动转换为基本数据类型。

基本数据类型转换为String类:

int n1=10;//方法1:连接运算 
String str=n1+"";
float f1=12.3f;//方法2:Valueof()函数
String str2=String.Valueof(f1);

String类转换为基本数据类型和包装类:调用包装类.parseXxx()方法转换为基本数据类型或者包装类。

String str="123";
Integer n1=Integer.parseInt(str);

注:使用三目运算符的时候?和:要求是同一数据类型,不然会自动类型提升。
在这里插入图片描述
Integer中有个cache提前将-128~127的数都存入一个数组方便调用,则当int数自动装箱,取的数都是在数组中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值