2023年5月21日,抽象类及抽象方法,匿名,对象的转型/引用数据类型的转型,接口的多态,类的多态,接口类

奋斗吧
奋斗吧
擅长邻域:未填写

标签: 2023年5月21日,抽象类及抽象方法,匿名,对象的转型/引用数据类型的转型,接口的多态,类的多态,接口类 博客 51CTO博客

2023-05-21 18:24:02 195浏览

2023年5月21日,抽象类及抽象方法,匿名,对象的转型/引用数据类型的转型,接口的多态,类的多态,接口类,抽象类及抽象方法()//抽象类publicabstractclass类名{//抽象方法publicabstractvoidmethod();}抽象方法的应用场景:    父类的方法不好实现,但是该方法又应该在父类中出现,就将该方法设置为抽象方法,让非抽象的子类去实现即可面试题:1.抽象类不能有构造方法? 

抽象类及抽象方法()

//抽象类
public abstract class 类名{
    //抽象方法
    public abstract void method();
}

抽象方法的应用场景:

       父类的方法不好实现,但是该方法又应该在父类中出现,就将该方法设置为抽象方法,让非抽象的子类去实现即可


面试题:

1.抽象类不能有构造方法?

        抽象类可以有构造方法

2.抽象类中只能有抽象方法?

        抽象类中有非抽象方法(成员方法和静态方法)

3.抽象类中不可以没有抽象方法?

        抽象类中可以没有抽象方法,但是毫无意义

4.如果父类是抽象类,则子类必须实现父类的抽象方法?

        不一定,子类如果是抽象类,可以不实现父类的抽象方法

5.可以使用new关键字来创建抽象类对象?

        不可以,创建的是匿名内部类的对象

匿名类

2023年5月21日,抽象类及抽象方法,匿名,对象的转型/引用数据类型的转型,接口的多态,类的多态,接口类_父类

接口

含义:特殊的抽象类

注意:

     1. JDK1.7时,接口中只能有静态常量和抽象方法

     2. JDK1.8开始,接口中添加了静态方法和默认方法

应用场景:接口更像一个规范


抽象类 vs 接口

抽象类:成员变量、静态变量、静态常量、成员方法、静态方法

接口:静态常量、静态方法(JDK1.8)、默认方法(JDK1.8)


面试题:

1.一个类可以实现多个接口?

       可以

2.一个接口可以实现多个接口?

      不可以,接口与接口的关系是多继承

3.接口里面的方法不一定都是抽象的?

      JDK1.7时接口里只能有抽象方法,JDK1.8时接口可以有抽象方法和默认方法

4.接口解决了类的单继承问题?

      是的,因为类与类是单继承,类与接口是多实现

5.一个类是否可以继承一个类并同时实现多个接口?

      可以

6.接口可以new对象?

      接口是特殊的抽象类,但是本质还是抽象类,抽象类是不可以new对象的,接口也是不能new对象,new出来的匿名类内部类的对象


类 - 接口的关系: 类 - 类:单继承 类 - 接口:多实现 接口 - 接口:多继承

类的多态

子类对象指向父类的引用

采用多态的思想实现自行车和汽车的案例,并在测试类进行测试

package com.fy.test03;

public class test01 {
    /**
     * 知识点:类和多态
     * 需求:采用多态的思想实现自行车和汽车的案例,并在测试类进行测试
     * 分析:
     *      1. 定义交通工具类(Vehicle)
     *              成员变量: XXXXXX
     *              构造方法:无参,带参
     *              成员方法:get/set open(),close()
     *      2. 定义汽车类(Car)继承交通工具类(Vehicle)
     *              构造方法:无参,带参
     *              成员方法:重写open(),close()
     *      3. 定义自行车类(Bike)继承交通工具类()
     *              构造方法:无参,带参
     *              成员方法:重写open(),close()
     *      4. 定义测试类(test01),进行测试
     * @param args
     */
    public static void main(String[] args) {
        Vehicle car=new Car();
        car.open();
        car.close();
        System.out.println("-------------------");
        Vehicle bike= new Bike();
        bike.open();
        bike.close();
    }
}
package com.fy.test03;

public abstract class Vehicle {
    public abstract void open();
    public abstract void close();

}
package com.fy.test03;

public class Car extends Vehicle{

    @Override
    public void open() {
        System.out.println("小汽车:一键启动,踩下油门");
    }

    @Override
    public void close() {
        System.out.println("小汽车:踩下刹车,熄火");
    }
}
package com.fy.test03;

public class Bike extends Vehicle{
    @Override
    public void open() {
        System.out.println("自行车:踩脚踏");
    }

    @Override
    public void close() {
        System.out.println("自行车:刹车");
    }
}

2023年5月21日,抽象类及抽象方法,匿名,对象的转型/引用数据类型的转型,接口的多态,类的多态,接口类_父类_02

接口的多态

模拟电脑的外部设备

package com.fy.test04;

public class test01 {
    /**
     * 需求:模拟电脑的外部设备
     * @param args
     */
    public static void main(String[] args) {
        Computer computer =new Computer();
        //接口的引用中存储的是实现类对象在堆中的地址
        IUSB usb= new Key();
        //传入实现类对象的地址
        computer.connection(usb);
    }
}
package com.fy.test04;

public class Computer {
    public void connection(IUSB usb){
        usb.use();
    }
}
package com.fy.test04;

public interface IUSB {
    public void use();
}
package com.fy.test04;

public class Key implements IUSB{

    @Override
    public void use() {
        System.out.println("键盘:输入数据");
    }
}
package com.fy.test04;

public class Mouse implements IUSB{
    @Override
    public void use() {
        System.out.println("鼠标:左点点、右点点");
    }
}
package com.fy.test04;

public class SSD implements IUSB{
    @Override
    public void use() {
        System.out.println("硬盘:文件上传、下载");
    }
}

2023年5月21日,抽象类及抽象方法,匿名,对象的转型/引用数据类型的转型,接口的多态,类的多态,接口类_父类_03

对象的转型/引用数据类型的转型

package com.fy.test05;

public class test01 {
    /**
     * 知识点:对象的转型/引用数据类型的转型
     *
     * 分类:
     * 	向上转型/自动转型:子类类型 转 父类类型
     * 	向下转型/强制转型:父类类型 转 子类类型
     *
     * 知识点:对象的转型 -- 向上转型
     * 		可以调用父类非私有化的成员属性
     * 		可以调用父类非私有化的成员方法
     * 		可以调用子类重写父类的成员方法
     * 		不可以调用子类的属性
     * 		不可以调用子类的方法
     *
     * 扩展:向上转型就是多态
     * 		多态的优点:需求升级时,不违反OCP原则,增强代码的可维护性
     * 		多态的缺点:不可以调用子类独有的属性和方法
     *
     */
    public static void main(String[] args) {

        Father father = new Son();

        System.out.println(father.fatherAttr);
        father.fatherMethod();
        father.method();

    }
}
package com.fy.test05;

public class Father {

    String fatherAttr = "父类属性";

    public void fatherMethod(){
        System.out.println("父类方法");
    }

    public void method(){
        System.out.println("父类的method方法");
    }

}
package com.fy.test05;

public class Son extends Father{

    String sonAttr = "子类属性";

    static String xxx = "xxx";

    public void sonMethod(){
        System.out.println("子类方法");
    }

    @Override
    public void method() {
        System.out.println("子类重写父类的method方法");
    }
}


好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695