多态,抽象,接口,JAVA设计模式

public class Aniaml {
    public Aniaml a(){
        return  null;
    }
}
public class dog extends Aniaml{
    public void bone(){
        System.out.println("狗吃骨头!");
    }
    @Override
    public dog a() {
        return null;
    }
}
public class Cat extends Aniaml {
    public void fish(){
        System.out.println("猫吃🐟!");
    }
}
public class ch01 {
    public void feed(Aniaml aniaml){
        System.out.println("喂养动物");
        //instanceof 用来判断某一个对象是否是某个类的实例。
        if(aniaml instanceof dog) {
            dog dog = (dog) aniaml;//强制转换
            dog.bone();
        }
        if(aniaml instanceof Cat){
            Cat cat=(Cat)aniaml;
            cat.fish();
        }
    }
    public void show(Object o){

    }
    public static void main(String[] args) {
        //多态:一种事物的多种形态!
        Aniaml dog=new dog();
        Aniaml cat=new Cat();
        ch01 ch01=new ch01();
        ch01.feed(dog);
        ch01.feed(cat);
    }
}

关键字instanceof:用来判断某一个对象是否是某一个类的实例。

向上转型:父类 父类对象=new 子类;

向上转型有可能丢失子类独有的特性。

向下转型:子类 子类对象=(子类)父类对象

向下转型有可能会出现ClassCastException,需要谨慎

我们往往在进行向下转型时,前提是向上转型。

抽象:abstract关键字

  1. 类:抽象类中是不是一定要有抽象方法

抽象类结构和普通类中的结构一模一样。

抽象类不能创建对象,不能实例化

  1. 方法:需要abstract修饰,没有方法体

  1. 抽象方法必须存在于抽象类中。

  1. 抽象方法存在的意义:就是被子类实现。

  1. 如果一个类继承了一个抽象类,必须重写这个抽象类中的所有抽象方法。或者这个类本身是一个抽象类(很少)

抽象类本身就是被继承的。

抽象类存在的意义就是定规矩。【约定】

匿名实现类

public abstract class ch03 {
    public static void main(String[] args) {
        ch03 ch03=new ch03(){
            @Override
            public void show(String msg) {
                System.out.println("匿名实现类实现的show方法:"+msg);
            }
            //匿名实现类

        };
        ch03.show("匿名实现类");
    }
    public abstract  void show(String msg);
}

接口:

  1. 抽象方法:可以省略public abstract

  1. 常量:可以省略public static final

  1. 静态方法:可以省略public

  1. 默认方法:可以省略public//除了接口类里,其他类里都放不了

  1. 私有方法(JDK9以后)

接口中的所有对外结构必须是public。

静态方法和默认方法 JDK8以后才支持的。

接口的实现是可以多实现的,一个类如果实现了多个接口,必须 重写所有接口的抽象方法。

接口和接口之间是多继承

类与类之间是单继承

类与接口之间是多实现

一个类是既可以继承父类,也可以实现接口

面试题:接口与抽象类的区别?

  1. 组成。

  1. 继承实现。

  1. 接口和抽象类均不能进行实例化。

  1. 接口和抽象类必须重写所有的抽象方法。

外部类:

这两个类是定义在同一个.java中。就是把两个类写在同一个文件上。开发中不推荐使用。

如果一个类被声明为public class ,就必须单独定义在一个.java文件中,文件名还必须和public class的类名相同

内部类:

为什么要有内部类?

private static class Inner{}

为了健壮性。封装性

在当前类可能有某几个方法或某些属性是需要经常性的调用,考虑使用内部类

面向对象:

  1. 封装,继承,多态,抽象

  1. 属性,方法,构造器,内部类,代码块

  1. 方法,重载,访问权限修饰符

  1. 关键字。final static instanceof

Object类是所有“类”的最顶级父类,基本数据类型不是类。数组实际上确实是一个class。数组是可以调用Object类的方法的。

设计模式

单例模式:可以保证系统中,该类的对象有且仅有一个。

具体思路:

  1. 别人不能new实例。构造器私有化!!

  1. 在该类内部生产一个唯一的对象,并且也封装成private

  1. 定义一个静态方法,返回这个唯一的对象。

public class Ch03 {
    private static  Ch03 ch03=new Ch03();
    private Ch03(){

    }
    public static Ch03 getInstance(){
        return ch03;
    }
    public static void main(String[] args) {
        Ch03 ch03=new Ch03();
    }
}
  1. 饿汉式

  1. 懒汉式

public class Ch03_1 {
    public static Ch03_1 ch031;
    private Ch03_1(){

    }
    public static Ch03_1 getInstance(){
        ch031=new Ch03_1();
        return ch031;
    }
}

JDK8新增的功能 箭头函数(Lambda表达式) 语法糖

函数式接口:如果一个接口只有一个抽象方法,用一个注解来标识@FunctionalInterface

@FunctionalInterface
public interface Function {
    int plus(int i,int j);
}
public class Client {
    public static void test(Function function){
        System.out.println(function.plus(1,2));
    }

    public static void main(String[] args) {
        test((i, j) -> i+j);
        //小括号包裹形参,数据类型也不要。
        test((i,j)->i*j);
    }
}

小括号包裹形参,数据类型也不要。

第二部分,->指向方法的重写处

如果方法体只有一行代码,大括号可以省略。如果这一行代码是返回值,return省略。

面试题:值传递和引用传递

本质上Java只有值传递,所有的传递都是一次值的拷贝

引用类型引用的是地址,基本数据类型拷贝的是值。不会传入实例对象本身。

所谓的引用传递:实际上就是传递的引用数据类型的地址的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值