什么是多态?
常见形式
Animal dog = new Dog();
多态中成员访问特点
多态的前提
【多态会产生一个问题】:多态下不能使用子类的独有方法
【instance关键字】:
Animal c = new Cat();
强制类型转换(从父到子)
从父到子(必须进行强制类型转换,否则报错)
子类 对象变量 = (子类)父类类型的变量
Aniaml c = new Cat();
Dog d = (Dog) c;//出现异常 ClassCastExcetion
instance
【需求】
【USB接口】
public interface USB {
void interposition();//插入
void pullOut();//拔出
}
【keyboard键盘】
public class keyboard implements USB{
private String name;
public void type(){
System.out.println("打字功能-----");
}
@Override
public void interposition() {
System.out.println("插入键盘");
}
@Override
public void pullOut() {
System.out.println("拔出键盘");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public keyboard(String name) {
this.name = name;
}
}
【Mouse鼠标】
public class Mouse implements USB{
private String name;
public void click(){
System.out.println("点击功能------");
}
@Override
public void interposition() {
System.out.println("插入鼠标");
}
@Override
public void pullOut() {
System.out.println("拔出鼠标");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Mouse(String name) {
this.name = name;
}
}
【Computer电脑】
public class Computer{
private String name;
public void installUSB(USB usb){
if(usb instanceof keyboard){
keyboard k = (keyboard) usb;
k.type();
}else if(usb instanceof Mouse){
Mouse m = (Mouse) usb;
m.click();
}
}
public Computer(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
【Test】
public class Test {
public static void main(String[] args) {
Computer computer = new Computer("神州");
USB usb = new keyboard("达尔优");
computer.installUSB(usb);
USB usb1 = new Mouse("狗屁王");
computer.installUSB(usb1);
}
}
内部类
内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)
public class People{
//内部类
public class heart{
}
}
内部类场景使用
静态内部类
public class Outer{
//静态内部类
public static class inner{
}
}
静态内部类创建对象格式
public class Outer{
//成员内部类
public class Inner{
}
}
成员内部类创建对象的格式:
外部类名.内部类名 对象名= new 外部类构造器.内部类构造器();
Outer.Innter inner = new Outer().new Inner();
【成员内部类-面试笔试题】
class People{
private int heartbeat = 150;
public class Heart{
private int heartbeat = 110;
public void show(){
int heartbeat = 78;
System.out.println(??);//78
System.out.println(??);//110
System.out.println(??);//150
}
}
}
【heartbeat,this.heartbeat,People.this.heartbeat】
Employee a = new Employee(){//Employee为接口
@Override
public void work(){
System.out.println("员工正在工作");
}
}
【需求】:某学校要求让老师,学生,运动员一起参加游泳比赛
public class Test {
public static void main(String[] args) {
Swimming s = new Swimming(){
@Override
public void swim(){
System.out.println("学生正在🏊");
}
};
go(s);
Swimming teacher = new Swimming() {
@Override
public void swim() {
System.out.println("老师正在🏊");
}
};
go(teacher);
Swimming athlete = new Swimming() {
@Override
public void swim() {
System.out.println("运动员🏊的很快");
}
};
go(athlete);
}
public static void go(Swimming s){
System.out.println("开始");
s.swim();
System.out.println("结束");
}
}
interface Swimming{
void swim();
}
【需求】:给按钮绑定单击时间
public class Test02 {
public static void main(String[] args) {
//1.创建窗口
JFrame windows = new JFrame("登录界面");
//2.创建一个按钮
JButton bt = new JButton("登录");
//绑定按钮监听器
// bt.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
// System.out.println("登录成功");
// }
// });
//简化代码
bt.addActionListener( e -> System.out.println("登录成功"));
//3.展示设置
windows.setSize(400,300);
windows.setVisible(true);
//类似于桌布,设置大小吧按钮放在桌布上
JPanel panel = new JPanel();
panel.add(bt);
windows.add(panel);
}
【idea提供了每个类可以快捷重写toString方法,来输出对象的信息,而不是地址】
因为更安全【Objects里面的equals方法存在判定为空逻辑】
Objects常见方法
public static boolean equals(Object a,Object b){
return (a == b) || (a !=null && a.equals(b));
}
概述
String原理图
【一个加号,堆内存中就会有两个对象】(性能不好)
【需求】:设计一个方法用于输出任意整型数组的内容,要求输出成如下格式:"该数组内容为:[11,22,33,44,55]"
public class Test {
public static void main(String[] args) {
}
public static String toString(int[] arr){
if(arr!=null){
int[] numbers = {11,22,33,44,55};
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < numbers.length; i++) {
sb.append(numbers[i]).append(i==numbers.length-1 ?"":",");
}
return sb.append("]").toString();
}
return null;
}
}
Math类
Math类的常用方法
public static void main(String[] args) {
//1.取绝对值:返回正数
System.out.println(Math.abs(-20));
//2.向上取整:
System.out.println(Math.ceil(4.0000001));
//3.向下取整:
System.out.println(Math.floor(4.999999));
//4.求指数次方
System.out.println(Math.pow(2,3));
//5.四舍五入
System.out.println(Math.round(4.49999));
System.out.println(Math.round(4.500001));
//6.0-1.0之间随机数
System.out.println(Math.random());
}
原因
作用:
public class Test {
public static void main(String[] args) {
System.out.println("程序开始");
//System.exit(0);//JVM终止
//2,计算机认为时间有起源:发牛1970-1-1 00:00 走到此时的总毫秒值
System.out.println(System.currentTimeMillis());
//3.数组拷贝(了解)
int[] arr = {10,20,30,40,50,60,70};
int[] arr2 = new int[6];//[0,0,0,0,0,0] => [0,0,40,50,60,0]
System.arraycopy(arr,3,arr2,2,3);
System.out.println(Arrays.toString(arr2));
System.out.println("程序结束");
}
}
public static void main(String[] args){
//浮点型运算的时候直接+* /可能会出现数据失真(精度问题)
System.out.println(0.09+0.01);//0.09999999999999999
System.out.println(1.0-0.32);//0.6799999999999999
System.out.println(1.015*100);//101.49999999999999
System.out.println(1.301 / 100);//0.013009999999999999
double c = 0.1+0.2;
System.out.println(c);//0.30000000000000004
}
使用步骤
public static BigDecimal valueOf(double val);
//包装浮点数称为Bigdecimal对象
BigDecimal常用API
public class Test {
public static void main(String[] args) {
double a = 0.1;
double b = 0.2;
double c = a + b;
System.out.println(c);
System.out.println("-----------------");
BigDecimal a1 = BigDecimal.valueOf(a);
BigDecimal b1 = BigDecimal.valueOf(b);
//加
System.out.println(a1.add(b1));
//减
System.out.println(a1.subtract(b1));
//乘
System.out.println(a1.multiply(b1));
//除
System.out.println(a1.divide(b1));
//转为Double
double rs = a1.doubleValue();
System.out.println(rs);
}
}