面向对象------学习总结(多态性)

根据哔哩哔哩网站尚硅谷老师讲课,所记的学习笔记。

多态性(向上转型)

1.理解为:一个事物的多种形态。父类的引用指向子类的对象。一个子类只能有一个父类,一个父类可以有多个子类。所以父类的引用可以指向很多个子类的对象,也就可以理解为多态性。

Person p1 = new Man( ); //Person为父类,Man为子类
Person p2 = new Woman( ); //Person为父类,Woman也为子类

2.虚拟方法的调用:
对于调用方法而言(p1.方法)编译时看左边,运行看右边。
对于调用属性而言(p1.属性)编译运行时都看左边。

3.多态性的使用条件:
①继承性
②重写

4.局限性
对象多态性后,内存中实际加载了子类的属性和方法。但是在调用方法时,只能编译父类中涉及到的方法。但是子类的功能肯定比父类强大,子类中特有的属性和方法就不能编译运行。多态性也称为向上转型,为了解决这个局限性也就引出了向下转型。

5.多态是运行时行为,而非编译时行为。

向下转型

1.办法:使用强制类型转换符( )。
2.可能出线的异常:ClassCastException.
3.解决异常问题的方法:instanceof
变量名a instanceOf 类名B
判断a是不是B类的实例。只有是,才是true,不是则是false。例如:
Person p1 = new Man( );
Person p2 = new Woman( );
p1 instanceof Man;//true
Man m1 = (Man) p1;//正确的
p1 instanceof Man;//false
Man m1 = (Man) p2;//ClassCastException.向下转型失败
(从哪转上来的就从哪转回去。子类不一样的转不了。)
4. 如果a instanceof A为true,B是A的父类,则 a instanceof B也为true。

Object类型

1.概述:Object是java所有类型的根父类。如果某一个类没有用extends指明父类的话,默认父类都是Object类。java.lang.Object。数组的根父类也是Object。
2.结构:
属性:无。
构造器:一个空参构造器。
方法:equals( )/toString( )/getClass( )等等

equals( )使用

1.是一个方法,需要对象来调用。只能用于引用型数据类型。
2.Object中的equals( )方法:
public boolean equals(Object obj){
return this == obj;
}
3.equals方法在Object类型中,对比的是两个变量的地址值,而非内容。只有在String、Date、File、包装类中,equals才是比较的两个变量的内容。所以在我们自己定义的类中,如果想引用equals方法,必须对equals进行重写。
4.①自己重写的方法:
class Person(){
String name;
int age;
public boolean equals(Object obj){
if (this ==obj){//调用该方法的对象地址和obj的地址一样
return true;}
if(obj instanceof Person){//obj是不是Person类的对象
Person p1 = (Person) obj;//先把obj向下类型转换为Personl类,再进行对比
return this.age ==p1.age && this.name.equals(p1.name);
}
}
②自己重写的方法有个弊端,不够严谨:
由于 如果a instanceof A为true,B是A的父类,则 a instanceof B也为true。假如两个父子类的属性内容相同时,并且当4.①中 if(obj instanceof Person)这一步的类是两个父子类,就都会产生true。更严谨的方法,软件已经写好了,直接生成就行。主要采用了getclass的方法,使得类相同,不同类直接输出false。
5.实际运用中,软件可以直接生成equals方法,不用自己打。
6.equals和 = =的区别
①= = 可以使用在基本数据类型和引用数据类型中,在基本数据类型中,表达判断两个变量保存的数据是否相等。(不一定类型要相同)在引用数据类型中,表示判断两个变量的地址值是否相等。
注:使用= = 时,两边的数据类型必须一致。
②equals只能使用在引用数据类型中,除了String/Date/File/包装类这四种是判断“内容”是否相等以外,一般判断的也是两个变量的地址值是否相等。如果要判断“内容”是否相等,就得对equals进行重写。

toString( )使用

String/Date/File/包装类这四种都重写了Object中的toString方法,在调用的时候直接返回“内容”的信息。其它的在调用时需要重写(同样,软件自动生成)。
注:s1 = null;
system.out.println(s)//null;
system.out.println(s.toString)//NullPointException空指针异常;

单元测试方法

对测试类的要求:
①此类是public的
②此类提供公共的无参构造器
在类中声明单元测试的方法:
public void 方法名( ){ }

包装类

概述

1.为啥要包装类:因为Java是面向对象的语言,类都可以调用,但是基本数据类型不能调用,通用性就没有体现出来。所以就把数据类型包起来,再调用。
2.基本数据类型与对应的包装类:
byte Byte; short Short ;int Integer;long Long;float Float;double Double;---------以上父类都为Number;
boolean Boolean;char Character

基本数据类型、包装类、String类的互相转换

1.基本数据类型转为包装类
调用包装类的构造器
n1 = 10;
Integer int1 = new Integer(n);
System.out.println(int1.toString());
Integer int2 = new Integer(“123”);
Integer int2 = new Integer(“123xyz”);//编译报错

Boolean b1 = new Boolean(true);/boolean型的true不分大小写,TRue的运行结果也是true.
Boolean b1 = new Boolean(true123);//编译不报错,运行结果是false.

int age;//运行时默认为0
Integer age;//运行时默认为null

自动装箱-------JDK5.0的新特性
int age1 = 15;
Integer i1 = age1;
省略了造对象这一步骤。

2.包装类转为基本数据类型
调用包装类的xxxValue( )----“基本数类型Value()”
Integer int1 = new Integer(12);
int i1 = int1.intValue();----int型
float f1 = float.Value();----float类型
自动拆箱------JDK5.0新特性
int age1 = int1;
省略了xxxValue;
3.基本数据类型、包装类转为String类型
连接运算:
int age = 12;
String str1 = age + " ";
②valueOf(Xxx xxx)
float f1 = 15.4f;
String str1 = String.valueOf(f1);
4.String类型转为基本数据类型、包装类
调用包装类的parseXxx()
String str1 = “123”;
int num2 = Integer.parseInt(str1);
②注意点:

  • 当String str1 = "123abc"时,可能会报错NumberFormatException。
  • boolean类型的判断内容是否是true这四个字母,不管大小写,只要符合 是true.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值