多态、内部类、常用API(java基础进阶)

多态

同类的对象,执行同一个行为,会表现出不同的行为特征

//多态的常见形式
父类类型 对象名=new 子类构造器
接口 对象名称=new 实现类构造器

成员访问特点
方法调用:编译看左边,运行看右边
变量调用:编译看左边,运行看左边(多态侧重行为多态)

多态的前提
有继承/实现关系;有父类引用指向子类对象;有方法重写

多态的优势
在多态形式下,右边对象可以实现解耦合,便于扩展和维护
定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利

多态下会产生一个问题:
多态下不能使用子类的独有功能

多态下引用数据类型的类型转换
自动类型转换(从子到父):子类对象赋值给父类类型的变量指向
强制类型转换(从父到子)
此时必须进行强制类型转换:子类 对象变量=(子类)父类类型的变量
作用:可以解决多态下的劣势,可以实现调用子类独有的功能

注意:如果转型后的类型和对象真实类型不是同一类型,那么在转换的时候会出现ClassCastException

java建议强制转换前使用instanceof判断当前对象的真实类型,再进行强制转换

变量名 instanceof 真实类型
判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或其子类型,是则返回true

内部类

定义在一个类里面的类

public class People{
//内部类
	public class Heart{
	}
}

内部类的使用场景、作用
当一个事物的内部,还有一部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构可以选择使用内部类来设计
内部类通常可以方便访问外部类的成员,包括私有成员
内部类提供了更好的封装性,内部类本身就可以用private、protected等修饰,封装性可以做更多控制

分为静态内部类、成员内部类、局部内部类、匿名内部类(重点)

静态内部类

有static修饰,属于外部类本身
它的特点和使用与普通类是完全一样的,类有的成分它都有,只是位置在别人里面而已

public class Outer{
	//静态成员内部类
	public static class Inner{
	}
}

//静态内部类创建对象的格式
格式:外部类名.内部类名 对象名 = new 外部类名.内部类构造器();
Outer.Inner in=new Outer.Inner();

成员内部类

无static修饰,属于外部类对象
JDK16之前,成员内部类中不能定义静态成员,JDK16开始可以定义静态成员了

public class Outer{
	//静态成员内部类
	public class Inner{
	}
}
//格式
外部类名.内部类名 对象名=new 外部类构造器.new 内部类构造器();
Outer.Inner in=new Outer().new Inner();

注意:在成员内部类中访问所在外部类对象
格式:外部类名.this

局部内部类

放在方法、代码块、构造器等执行体中
文件名为:外部类$N内部类.class

匿名内部类

本质上是一个没有名字的局部内部类,定义在方法、代码块中等。
作用:方便创建子类对象,最终目的为了简化代码编写

//格式
new/抽象类名/接口名(){
	//重写方法;
};

Employee a=new Employee(){
	public void work(){
	}
};
a.work();

总结:
匿名内部类是一个没有名字的内部类
匿名内部类写出来就会产生一个匿名内部类的对象
匿名内部类的对象类型相当于是当前new的那个类型的子类类型

使用形式(了解即可)
匿名内部类可以作为方法的实际参数进行传输

使用总结
开发中不受我们主动去定义匿名内部类的,而是别人需要我们可以写的时候才会使用。匿名内部类的代码可以实现代码进一步的简化

Object类

作用一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类
Object类的方法是一切子类都可以直接使用的

方法名说明
public String toString()默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址
public Boolean equals(Object o)默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false

Object中toString方法的作用?
默认是打印当前对象的地址
让子类重写,以便返回子类对象的内容

直接比较两个对象的地址是否相同完全可以用 == 替代equals

equals的意义
父类equals方法存在的意思是为了被子类重写,以便子类自己来定制比较规则

Objects概述
利用Objects更安全
Objects常用方法

方法名说明
public static boolean equals(Object a,Object b)比较两个对象的,底层会先进行非空判断,从而可避免空指针异常。再进行euqals比较
public static boolean isNull(Object obj)判断变量是否为null,为null返回true,反之

StringBuilder概述

是一个可变的字符串类,我们可以把它看成是一个对象容器。
作用:提高字符串的操作效率,如拼接,修改等

StringBuilder构造器

名称说明
public StringBuilder()创建一个空白的可变的字符串对象,不包含任何内容
public StringBuilder(String str)创建一个指定字符串内容的可变字符串对象

StringBuilder常用方法

方法名称说明
public StringBuilder append(任意类型)添加数据并返回StringBuilder对象本身
public StringBuilder reverse()将对象的内容反转
public int length()返回对象内容长度
public String toString()通过toString()就可以实现把StringBuilder转换为String

总结
当作工具来用,最终目的还是要转成String

Math类

包含指向基本数字运算的方法,Math类没有提供公开的构造器
如何使用类中的成员?
看类的成员是否是static修饰,如果是,通过类名直接调用
在这里插入图片描述

//扩展 3-9直接的随机数 0-6+3
int data=(int)(Math.random()*7)+3;

System类

功能是通用的,不需要通过实例,直接调用即可
在这里插入图片描述

BigDecima作用

用于解决浮点型运算精度失真的问题
在这里插入图片描述

BigDecimal a1=BigDecimal.valueof(a);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值