day12 多态 内部类

本学习内容来着b站:黑马程序员

注:痛苦啊真痛苦,明明觉得学习Java特别厉害,非常羡慕技术大佬,但是我自己总是感觉有心无力,备受打击,真的痛苦,啥时候才能见到光明啊,我也知道必须经过黎明前的黑暗我们才能见到光明,还得继续坚持下去。今天的内容可以说是不全的,只有多态和内部类,还有常见的api我没有敲过代码,就不放到这里来了。结尾:本内容,当做笔记的复习材料,如果你看到了这篇文章能对你有所帮助,给我点个赞或者评论也是对我更新的最大动力!感谢,内容如果有错误,欢迎各位兄弟姐妹批评指正!!!

一. 多态

1.1 什么是多态

 

代码实现:抽象类父类 animal

package com.xiaochen.d1_polymorphic;

public class Tortoise extends Animal{
    public String name = "子类乌龟";
    @Override
    public void run() {
        System.out.println("跑的慢");

    }
}

代码实现:子类 dog

package com.xiaochen.d1_polymorphic;

public class Dog extends Animal{
    public String name = "子类狗";
    @Override
    public void run() {
        System.out.println("狗跑的很快");

    }
}

代码实现:子类 tortoise

package com.xiaochen.d1_polymorphic;

public class Tortoise extends Animal{
    public String name = "子类乌龟";
    @Override
    public void run() {
        System.out.println("跑的慢");

    }
}

代码实现:测试类 

package com.xiaochen.d1_polymorphic;
//目标:认识多态,理解多态的形式和概念
public class Test {
    public static void main(String[] args) {
        //1、多态的形式: 父类构造器 对象名称 = new 子类构造器
        Animal a = new Dog();
        a.run();//编译看左边,运行看右边
        System.out.println(a.name);//对于变量的调用,编译看左,运行也看左


        Animal a2 = new Tortoise();
        a2.run();//编译看左边,运行看右边
        System.out.println(a2.name);//对于变量的调用,编译看左,运行也看左
    }
}

1.2 多态的优势

代码实现:父类 animal

package com.xiaochen.d2_polymorphic_advantage;
//父类
public class Animal {
    public String name = "动物名称";
    public void run(){
        System.out.println("动物可以跑");
    }
}

代码实现:子类 Dog

package com.xiaochen.d2_polymorphic_advantage;

public class Dog extends Animal {
    public String name = "狗名称";
    @Override
    public void run(){
        System.out.println("狗跑的快");
    }
    /*
    独有功能
     */
    public void lookDoor(){
        System.out.println("狗在看门");
    }
}

代码实现:子类 tortoise

package com.xiaochen.d2_polymorphic_advantage;

public class Tortoise extends Animal{
    public String name = "乌龟名称";
    @Override
    public void run(){
        System.out.println("乌龟跑的慢");
    }
    /*
   独有功能
    */
    public void lookDoor(){
        System.out.println("乌龟在爬");
    }
}

代码实现:测试类 

package com.xiaochen.d2_polymorphic_advantage;


public class Test {
    public static void main(String[] args) {
        Animal a = new Tortoise();
        go(a);
        Animal a2 = new Dog();
        go(a2);
        //a2.lookDoor();//多态下不能访问子类的独有功能


    }
    /*
    要求:所有的动物都可以进来比赛
     */
    public static void go(Animal a){
        System.out.println("开始");
        a.run();
        System.out.println("结束");
    }
}

 1.3 多态下引用类型数据转换

代码实现:父类 animal

package com.xiaochen.d3_polymorphic_convert;
//父类
public class Animal {
    public void run(){
        System.out.println("动物可以跑");
    }

}

代码实现:子类 dog 

package com.xiaochen.d3_polymorphic_convert;

public class Dog extends Animal{
    @Override
    public void run(){
        System.out.println("狗跑的快");
    }
    /*
    独有功能
     */
    public void lookDoor(){
        System.out.println("狗在看门");
    }
}

代码实现:子类 cat

package com.xiaochen.d3_polymorphic_convert;

public class Cat extends Animal{
    public void run(){
        System.out.println("猫跑的也很快");
    }
    /*
    独有功能
     */
    public void maojiao(){
        System.out.println("猫叫");
    }
}

代码实现:测试类 

package com.xiaochen.d3_polymorphic_convert;

public class Test {
    public static void main(String[] args) {
        //自动类型转换
        Animal a = new Dog();
        a.run();

        //强制类型转换
        Animal a2 = new Cat();
        a2.run();


        //Dog d = (Dog) a2;//强制类型转换,编译阶段不报错的(注意:有继承或者实现关系编译阶段可以强转,没有毛病)运行时可能会出错的
        if(a2 instanceof Cat){
            Cat t = (Cat) a2;//从父类类型到子类类型,必须强制类型转换
            t.maojiao();
        }else if(a2 instanceof Dog){
            Dog d = new Dog();
            d.lookDoor();
        }
        System.out.println("=================");
        go(new Dog());
        go(new Cat());
    }
    public static void go(Animal a){
        //a到底是狗还是猫
        if(a instanceof Cat){
            Cat t = (Cat) a;//从父类类型到子类类型,必须强制类型转换
            t.maojiao();
        }else if(a instanceof Dog){
            Dog d = new Dog();
            d.lookDoor();
        }
    }


}

 1.4 多态的案例

代码实现:接口

package com.xiaochen.d4_polymorphic_test;
//USB接口 = 规范
public interface USB {
    //接入 拔出
    void connect();
    void unconnerct();
}

代码实现:实现类 keyboard

package com.xiaochen.d4_polymorphic_test;
//实现类
public class KeyBoard implements USB{
    private String name;

    public KeyBoard(String name) {
        this.name = name;
    }

    @Override
    public void connect() {
        System.out.println(name + "成功连接了电脑");

    }
    /*
    独有功能
     */
    public void keyDown(){
        System.out.println(name + "敲击了,来了,老铁666666");
    }

    @Override
    public void unconnerct() {
        System.out.println(name + "成功从电脑拔出");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

代码实现:实现类 mouse

package com.xiaochen.d4_polymorphic_test;
//实现类
public class Mouse implements USB{
    private String name;

    public Mouse(String name) {
        this.name = name;
    }

    @Override
    public void connect() {
        System.out.println(name + "成功连接了电脑");

    }
    /*
    独有功能
     */
    public void dbClick(){
        System.out.println(name + "双击点亮小红心,一键三连");
    }

    @Override
    public void unconnerct() {
        System.out.println(name + "成功从电脑拔出");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

代码实现:电脑类

package com.xiaochen.d4_polymorphic_test;

public class Computer {
    private String name;

    public Computer(String name) {
        this.name = name;
    }
    public void start(){
        System.out.println(name + "开机了");
    }
    /*
    提供安装USB设备的入口
     */
    public void installUSB(USB usb){
        //多态 usb == 可能是鼠标,也可以是键盘
        usb.connect();
        //独有功能:先判断,再强转
        if(usb instanceof KeyBoard){
            KeyBoard k = (KeyBoard) usb;
            k.keyDown();
        }else if(usb instanceof Mouse){
            Mouse m = (Mouse) usb;
            m.dbClick();
        }
        usb.unconnerct();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

代码实现:测试类 

package com.xiaochen.d4_polymorphic_test;
/*
目标:USB设备模型
1、定义USB接口:接入 拔出
2、定义2个USB的实现类:鼠标 键盘
3、创建一个电脑对象,创建USB设备对象,安装启动
 */
public class Test {
    public static void main(String[] args) {
        //1、创建电脑对象
        Computer c = new Computer("华为");
        c.start();
        //2、创建鼠标对象,键盘对象
        USB u = new KeyBoard("小陈");
        c.installUSB(u);
        USB u1 = new KeyBoard("罗技鼠标");
        c.installUSB(u1);

    }
}

 

二.内部类

 2.1 什么是内部类

 2.2 静态内部类

 

代码实现 :Outer

package com.xiaochen.d5_innerclass_static;
/*
外部类
 */
public class Outer {
    public static int a = 100;
    private String hobby;

    /*
    学习静态成员内部类
     */
    public static class Inner{
        private String name;
        private int age;
        public static String schoolName;

        public Inner() {
        }

        public Inner(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public void show(){
            System.out.println("名称:" + name);
            System.out.println(a);
            Outer o = new Outer();
            System.out.println(o.hobby);//间接访问
           // System.out.println(hobby);

        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public static String getSchoolName() {
            return schoolName;
        }

        public static void setSchoolName(String schoolName) {
            Inner.schoolName = schoolName;
        }
    }

}

代码实现:测试类 

package com.xiaochen.d5_innerclass_static;

public class Test {
    public static void main(String[] args) {
        Outer.Inner in = new Outer.Inner();
        in.setName("小陈");
        in.show();
    }
}

 2.3 成员内部类

 

 

代码实现:outer类

package com.xiaochen.d6_innerclass;



//外部类
public class Outer {
    public static int num = 111;
    private String hobby;

    public Outer() {
    }

    public Outer(String hobby) {
        this.hobby = hobby;
    }

    /*
        成员内部类:不能加static修饰属于外部类对象的
         */
    public class Inner{
        private String name;
        private int age;
        public static int a = 100 ;//jdk16开始支持静态成员了

        public static void test(){
            System.out.println(a);

        }
        public void show(){
            System.out.println("名称:" + name);
            System.out.println("数量:" + num);
            System.out.println("爱好:" + hobby);

        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }
}

代码实现: 测试类

package com.xiaochen.d6_innerclass;

public class Test {
    public static void main(String[] args) {
        Outer.Inner in = new Outer().new Inner();
        in.setName("内部");
        in.show();
        Outer.Inner.test();

        System.out.println("========");
        Outer.Inner in1 = new Outer().new Inner();
        in1.show();

    }
}

2.4 局部内部类 

 

package com.xiaochen.d7_innerclass;
目标:了解局部内部类的语法
public class Test {
    public static void main(String[] args) {
        class Cat{
            private String name;

            public static int onlineNumber =100;

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }
        }
    }
}

 2.5 匿名内部类重点

 

 

package com.xiaochen.d8_innerclass_anonymous;
//目标:学习匿名内部类的形式和特点
public class Test {
    public static void main(String[] args) {
        Animal a = new Animal() {
            @Override
            public void run() {
                System.out.println("老虎跑得快");
            }
        };
        a.run();

    }
}
//class Tiger extends Animal{
//    @Override
//    public void run() {
//        System.out.println("老虎跑得快");
//    }
//}

abstract class Animal{
    public abstract void run();
}

 

 

 

代码实现: 

package com.xiaochen.d8_innerclass_anonymous;
//目标:掌握匿名内部类的使用形式
public class Test2 {
    public static void main(String[] args) {
        Swimming s = new Swimming() {
            @Override
            public void swim() {
                System.out.println("学生快乐的自由泳");
            }
        };
        go(s);
        System.out.println("===============");
        Swimming s1 = new Swimming() {
            @Override
            public void swim() {
                System.out.println("老师泳得快");
            }
        };
        go(s1);
        System.out.println("=================");
        go(new Swimming() {
            @Override
            public void swim() {
                System.out.println("运动员快");
            }
        });

    }
    /*
    学生 老师 运动员可以一起参加游戏比赛
     */
    public static void go(Swimming s){
        System.out.println("开始");
        s.swim();
        System.out.println("结束");
    }
}
class Student implements Swimming{
    @Override
    public void swim() {
        System.out.println("学生快乐的自由泳");
    }
}

interface Swimming{
    void swim();
}

 

 

代码实现: 

package com.xiaochen.d8_innerclass_anonymous;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//目标:通过GUI编程 理解匿名内部类的真实使用场景
public class Test3 {
    public static void main(String[] args) {
        //1、创建窗口
        JFrame  win = new JFrame("登录界面");
        JPanel panel = new JPanel();
        win.add(panel);

        //2、创建一个按钮对象
        JButton btn = new JButton("登录");


        //注意:讲解匿名内部类的使用
//        btn.addActionListener(new ActionListener() {
//            @Override
//            public void actionPerformed(ActionEvent e) {
//                JOptionPane.showConfirmDialog(win,"点我一下,说明爱我");
//            }
//        });

        btn.addActionListener( e -> JOptionPane.showConfirmDialog(win,"点我一下,说明爱我"));

        //3、把按钮对象添加到桌布上展示
        panel.add(btn);

        //4、展示窗口
        win.setSize(400,300);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值