ch10:面向对象(高级)

主要内容

在这里插入图片描述

一:类变量 类方法

在这里插入图片描述

引出

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析

在这里插入图片描述
在这里插入图片描述

细节

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

使用

在这里插入图片描述
在这里插入图片描述

对比

在这里插入图片描述

在这里插入图片描述

练习

  • 1
    在这里插入图片描述
    在这里插入图片描述
  • 2
    在这里插入图片描述

在这里插入图片描述

  • 3
    在这里插入图片描述
    在这里插入图片描述

一:main方法

在这里插入图片描述

  • string arg[]

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • idea
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二:代码块

在这里插入图片描述

简介

在这里插入图片描述

        new Movie("电影1", 35, "导演1");
        System.out.println();
        new Movie("电影2", 45);
        System.out.println();
        new Movie("电影3");
class Movie{
    private String name;
    private double price;
    private String director;

    public Movie(String name) {
        System.out.println("Movie(String name) 被调用...");
        this.name = name;
    }

    public Movie(String name, double price) {
        System.out.println("Movie(String name, double price) 被调用...");
        this.name = name;
        this.price = price;
    }

    public Movie(String name, double price, String director) {
        System.out.println("Movie(String name, double price, String director) 被调用...");
        this.name = name;
        this.price = price;
        this.director = director;
    }

    {
        System.out.println("电影屏幕打开...");
        System.out.println("广告开始...");
        System.out.println("电影正是开始...");
    };
}

在这里插入图片描述

细节

在这里插入图片描述
在这里插入图片描述


class Father{
    static int father_int = father_getInt();
    public static int father_getInt(){
        System.out.println("Father的father_getInt(),初始化father_getInt...");
        return 100;
    }

    static{
        System.out.println("Father的静态代码块...");
    }
    {
        System.out.println("Father的普通代码块...");
    }
}

class Children extends Father{
    static int children_int = 50;

    static{
        System.out.println("···children静态代码块...");
    }
    {
        System.out.println("···children普通代码块...");
    }
}

new Children();

在这里插入图片描述

System.out.println(Children.children_int);

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

练习
  • 1
    在这里插入图片描述
    在这里插入图片描述
  • 2
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

三:单例设计模式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

饿汉式
  • 只能有一个对象
 类加载,就创建了实例
 
        System.out.println(GirlFriend.aa);

        System.out.println("==============");

        GirlFriend gf1 = GirlFriend.getInstance();
        GirlFriend gf2 = GirlFriend.getInstance();

        System.out.println(gf1);
        System .out.println(gf2);

        System.out.println(gf1 == gf2);
class GirlFriend{
	//测试类加载
	public static int aa = 100;

    private String name;
    private static GirlFriend gf = new GirlFriend("小梅");

    private GirlFriend(String name) {
        System.out.println("GirlFriend()构造方法...");
        this.name = name;
    }

    public static GirlFriend getInstance(){
        return gf;
    }

    @Override
    public String toString() {
        return "GirlFriend{" +
                "name='" + name + '\'' +
                '}';
    }
}

在这里插入图片描述

懒汉式
//类加载没有创建对象
        System.out.println(Lazy.aa);

        System.out.println("==============");

        Lazy lazy1 = Lazy.getInstance();
        Lazy lazy2 = Lazy.getInstance();

        System.out.println(lazy1);
        System.out.println(lazy2);

        System.out.println(lazy1 == lazy2);

class Lazy{
    //测试类加载
    public static int aa = 100;

    private String name;

    private static Lazy la;

    private Lazy(String name){
        System.out.println("Lazy()构造方法...");
        this.name = name;
    }

    public static Lazy getInstance(){
        if (la == null){
            la = new Lazy("小脚丫···");
        }
        return la;
    }

    @Override
    public String toString() {
        return "Lazy{" +
                "name='" + name + '\'' +
                '}';
    }
}

在这里插入图片描述

对比

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四:final

在这里插入图片描述

在这里插入图片描述

细节

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 练习
    在这里插入图片描述

  • 可以修饰形参,但不可以修改值

在这里插入图片描述

五:抽象类

在这里插入图片描述

引出

在这里插入图片描述

在这里插入图片描述

细节

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

练习

在这里插入图片描述

        Manager m1 = new Manager("经理1", 123456, 1000);
        m1.setBonus(100);
        m1.work();

        CommonEmployee e1 = new CommonEmployee("员工1", 123456, 200);
        e1.work();
abstract public class Employee {
    private String name;
    private int id;
    private double salary;

    //抽象方法
    abstract void work();

    //构造器
    public Employee(String name, int id, double salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }
}

public class Manager extends Employee{
    private double bonus;

    public Manager(String name, int id, double salary) {
        super(name, id, salary);
    }

    @Override
    void work() {
        System.out.println("经理:" + getName() + " 工作中");
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }
}

public class CommonEmployee extends Employee{
    public CommonEmployee(String name, int id, double salary) {
        super(name, id, salary);
    }

    @Override
    void work() {
        System.out.println("员工:" + getName() + "工作中");
    }
}

在这里插入图片描述

模板设计模式

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


public class t1 {
    public static void main(String[] args) {
        AA aa = new AA();
        aa.calculateTime();

        BB bb = new BB();
        bb.calculateTime();
    }
}

abstract class Template{
    public long num = 0;

    abstract void job();

    public void calculateTime(){
        long start = System.currentTimeMillis();
		
		
        job();

        long end = System.currentTimeMillis();
        System.out.println("执行时间:" + (end - start));

    }
}

class AA extends Template{
    @Override
    void job() {
        System.out.println("AA_job");
        for (int i = 0; i < 800000; i++) {
            num += i;
        }
    }

//    public void calculateTime(){
//        long num = 0;
//        long start = System.currentTimeMillis();
        /*for (int i = 0; i < 800000; i++) {
            num += i;
        }*/
//        long end = System.currentTimeMillis();
//        System.out.println("执行时间:" + (end - start));
//    }
}

class BB extends Template {
    @Override
    void job() {
        System.out.println("BB_job");
        for (int i = 0; i < 800000; i++) {
            num -= i;
        }
    }
}

六:接口

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

细节

在这里插入图片描述
在这里插入图片描述

interface AA{

    默认实现 jdk8支持
    default void hi(){};
    
    静态
    static void method3(){};
    
	默认就有public abstract
    public abstract void method2();
    
    void method1();
}

抽象类可以不实现
abstract class BB implements AA{

}

class CC extends BB{
    @Override
    public void method2() {

    }

    @Override
    public void method1() {

    }
}

在这里插入图片描述

  • 练习

在这里插入图片描述

对比继承

  • 继承:猴子爬树
  • 接口:猴子飞
    在这里插入图片描述
    在这里插入图片描述
多态
  • 类似继承
    在这里插入图片描述

  • 多态传递
    在这里插入图片描述

  • 练习
    在这里插入图片描述

在这里插入图片描述

继续完善类

在这里插入图片描述

七:内部类

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

分类

在这里插入图片描述

定义在外部局部位置(方法)

1.局部内部类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.匿名内部类

在这里插入图片描述

  • main方法
        Outher aa = new Outher();
        aa.aa_fun();
  • main方法后面
interface IA{
    void ia_fun1();
    void ia_fun2(int i);
}

class Father{
    public Father(String name) {
        System.out.println("接收到name: " + name);
    }
    public void father_fun(){ }
}

abstract class Animal{
    abstract void eat();
}
class Outher{

    public void aa_fun(){
        //匿名内部类----基于接口
        // 1.需求: 想使用 IA 接口,并创建对象
        // 2.传统方式,是写一个类,实现该接口,并创建对象
        // 3.老韩需求是 Tiger/Dog 类只是使用一次,后面再不使用
        // 4. 可以使用匿名内部类来简化开发
        // 5. tiger 的编译类型 ? IA
        // 6. tiger 的运行类型 ? 就是匿名内部类 Outer04$1 /*
        //7. jdk 底层在创建匿名内部类 Outer04$1,立即马上就创建了 Outer04$1 实例,并且把地址 返回给 tiger
        //8. 匿名内部类使用一次,就不能再使用
        IA ia = new IA(){

            @Override
            public void ia_fun1() {
                System.out.println("ia_fun1");
            }

            @Override
            public void ia_fun2(int i) {
                System.out.println("ia_fun2");
            }


        };
        ia.ia_fun1();
        ia.ia_fun2(2);
        System.out.println("ia 的运行类型:" + ia.getClass());//Outer$1


        //基于类
        //1. father 编译类型 Father
        // 2. father 运行类型 Outer04$2
        // 3. 底层会创建匿名内部类
        /* 类似于
        class Outer04$2 extends Father{
            @Override
            public void test() {
                System.out.println("匿名内部类重写了 test 方法");
            }
        }
        */
        // 4. 同时也直接返回了 匿名内部类 Outer04$2 的对象
        // 5. 注意("jack") 参数列表会传递给 构造器
        Father father = new Father("jack"){
            @Override
            public void father_fun() {
                System.out.println("重写Father的father_fun方法...");
            }
        };
        System.out.println("father 对象的运行类型=" + father.getClass());//Outer$2
        father.father_fun();

        //基于抽象类
        Animal animal = new Animal() {
            @Override
            void eat() {
                System.out.println("小牛吃草");
            }
        };
        animal.eat();
    }
}

在这里插入图片描述
在这里插入图片描述

调用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.最佳实践

在这里插入图片描述

  • 练习
    在这里插入图片描述
public class t5 {
    public static void main(String[] args) {
        new CellPhone().alarmclock(new Bell() {
            @Override
            public void ring() {
                System.out.println("懒猪起床了....");
            }
        });

        //1. 传递的是实现了 Bell 接口的匿名内部类 t5$2
        //2. 重写了 ring
         /*
         相当于
         Bell bell = new Bell() {
            @Override
            public void ring() {
                //System.out.println(this.getClass());  //t5$2
                System.out.println("小伙伴上课了....");
            }
        });

         * */
        CellPhone cp = new CellPhone();
        cp.alarmclock(new Bell() {
            @Override
            public void ring() {
                //System.out.println(this.getClass());  //t5$2
                System.out.println("小伙伴上课了....");
            }
        });
    }
}
interface Bell{
    void ring();
}

class CellPhone{
    public void alarmclock(Bell bell){  //形参是 Bell 接口类型
        System.out.println("运行类型是:" + bell.getClass());
        bell.ring();            //动态绑定
    }
}

定义在外部类的 成员位置

1.成员内部类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.静态内部类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 练习
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值