java基础:继承+多态(学习笔记)

目录

1.类

2.继承

实现步骤:

方法重写:

继承的特性:

继承关系下,权限修饰符的使用范围:

super

继承条件下,构造代码的执行顺序:

继承具体的使用步骤:

3.多态

        引用数据类型之间的类型转换:

        简单工厂设计模式

        例子:饮料购买


1.类

具有相同属性和共同行为的一组对象的集合就叫类。对象是该类下真实存在的一个具体实例。
类里定义了该类下对象应该拥有的属性和行为。

类的组成部分:属性,方法,构造器,代码块,内部类

2.继承

多个类中,有相同的代码,不想写了,但是还想用时可以用继承。继承利于代码的重用。

实现步骤:

        把多个类中,相同的属性和行为提取出来,放到一个单独的类里,这个类就叫做父类。
        把特有的属性和行为放在各自的类里,这些各自的类叫子类
        在子类名的后面写 extends 父类名,就实现了继承。然后父类里的资源,子类对象就可以使用了。

方法重写:

父类的方法体不能满足子类的需求时,子类可以重写方法。子类中方法重写的方法名,参数列表,返回值类型,访问修饰符都与父类的相同。其中,返回值类型可以比父类的小,访问修饰符可以比父类的高。快捷键:alt + Insert --->@Override Methods...

继承的特性:

传递性:A类继承B类,B类继承C类时,A类可以用C类的资源(在前面加super)。

单根性:一个类只能继承于一个父类。

子类不能继承父类的构造方法。

继承关系下,权限修饰符的使用范围:

本类同包类同包子类非同包类非同包子类
publicV对象名.资源直接用/super.资源

导包后

对象名.资源

导包后

对象名.资源

protectedV

无论是否有继承关系

对象名.资源

直接用/super.资源X

导包后

直接用/super.资源

默认的V

无论是否有继承关系

对象名.资源

直接用/super.资源XX
privateVXXXX

super

可以调用父类的属性/方法/构造器。

super.方法/属性:用于辨别是否是父类的,其实不写也行,写的话会直接去父类找,搜索效率高。

super(); :调用父类的无参构造;super(name, age); :调用父类的有参构造(需写在子类构造方法里的第一行)。

继承条件下,构造代码的执行顺序:

先执行父类的构造方法(),再执行子类的构造方法
        父类构造方法,可以是子类通过super()指定的,也可以程序自动调用的父类无参构造,系统没法帮忙调用有参构造!

在有静态变量,静态代码快,构造代码块,构造方法时候:
        静态资源(父类的静态变量>父类静态代码块 >子类的静态变量 >子类静态代码块)
        父类构造代码块 >父类的构造方法>子类的构造代码块>子类构造方法。

继承具体的使用步骤:

1.在父类声明共同属性和方法,生成构造方法(有参构造,无参构造),生成get/set方法,生成toString(看情况)。(用快捷键alt + Insert)

2.在子类的类名后用  extends 父类名  继承。

3.在子类声明自己特有的属性(没有就不用),生成构造方法,生成get/set方法(没有自己特有的属性就不用),生成toString(看情况),如果父类的方法体不能满足子类的需求则重写方法。

4.在Test类的main方法里创建对象并赋值,利用 对象名.方法名() 调用方法。

3.多态

作用:功能的扩展
场景:题目中一定有两条业务线,一条线叫继承,继承线是第二条线中方法的参数/返回值类型
定义:字面意思:一组对象在做同一行为的时候,有多种表现形态 就叫多态
           动态绑定:开发者在编写阶段,让父类做参数(减少子类做参数的方法个数),在程序运行阶段,又会根据传入的实际参数类型 自动绑定对应的执行方法,这个就叫动态绑定。
多态的实现条件有3个: 继承, 重写, 声明父类new子类  eg: Animal a=new Dog();

声明父类new子类:得到的是对象,只能调用子类继承的,或者子类重写的资源,不可以调用子类特有的。

 声明子类new子类:可以调用继承的,重写的,以及子类特有的。

引用数据类型之间的类型转换:

         声明父类new子类 ,是子类型转父类型 。发生的是向上类型转换,是自动进行的;
但是有问题:产生的对象,只能调用继承/重写父类的资源,不能调用子类特有的资源。

        如果仍然想让  声明父类new子类  产生的对象  可以调用子类的资源怎么办?
解决办法:对该对象做向下类型转换;强制进行((子类类型)对象名).特有的资源  eg: ((Dog)animal).getName();
        问题:有可能发生类型转换错误
解决办法:使用关键字 instanceof  。

if(animal instanceof Cat){
    Cat e= (Cat)animal;
}

简单工厂设计模式

        我们不仅可以使用父类做方法的形参,还可以使用父类做方法的返回值类型,真实返回的对象可以是该类的任意一个子类对象。
简单工厂模式的实现是解决大量对象创建问题的一个解决方案。将创建和使用分开,工厂负责创建,使用者直接调用即可。

        简单工厂模式的基本要求是:

  • 定义一个static方法,通过类名直接调用
  • 返回值类型是父类类型,返回的可以是其任意子类类型
  • 传入一个字符串类型的参数,工厂根据参数创建对应的子类产品
例子:饮料购买

接收用户输入的信息,选择购买的饮料,根据输入值输出不同选项及对应饮料。步骤几乎和继承差不多,继承后还需要做的有:

主要是Buy类下的方法。该方法的返回值是父类类名Drink,在方法体里写出不同输入时的各种操

作,返回时通过 return new 子类类名(具体属性值) 实现声明父类new子类。

public class Buy {
    Scanner input = new Scanner(System.in);
    public Drink selDrink(int select) {
        String addInfo = " ";
        if (select == 1) {
            System.out.print("请输入购买容量:");
            int capacity = input.nextInt();
            System.out.print("请问是否要配料(1、加糖 2、加奶 3、什么都不加):");
            int selAdd = input.nextInt();
            switch (selAdd) {
                case 1:
                    addInfo = "加糖";break;
                case 2:
                    addInfo = "加奶";break;
                case 3:
                    addInfo = "什么都不加";break;
                default:break;
            }
            return new Coffe("咖啡", capacity, addInfo);
        } else if (select == 2) {...}
          else if (select == 3) {...}
        return null;
    }
}

在Test类中,要先创建一个Buy的对象;给Drink d 赋值;调用输出方法。

public class Test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请选择饮料(1、咖啡 2、矿泉水 3、可乐):");
        int select = input.nextInt();
        Buy b = new Buy();
        Drink d = b.selDrink(select);
        d.drinkInfo();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值