目录
1.类
具有相同属性和共同行为的一组对象的集合就叫类。对象是该类下真实存在的一个具体实例。
类里定义了该类下对象应该拥有的属性和行为。
类的组成部分:属性,方法,构造器,代码块,内部类
2.继承
多个类中,有相同的代码,不想写了,但是还想用时可以用继承。继承利于代码的重用。
实现步骤:
把多个类中,相同的属性和行为提取出来,放到一个单独的类里,这个类就叫做父类。
把特有的属性和行为放在各自的类里,这些各自的类叫子类
在子类名的后面写 extends 父类名,就实现了继承。然后父类里的资源,子类对象就可以使用了。
方法重写:
父类的方法体不能满足子类的需求时,子类可以重写方法。子类中方法重写的方法名,参数列表,返回值类型,访问修饰符都与父类的相同。其中,返回值类型可以比父类的小,访问修饰符可以比父类的高。快捷键:alt + Insert --->@Override Methods...
继承的特性:
传递性:A类继承B类,B类继承C类时,A类可以用C类的资源(在前面加super)。
单根性:一个类只能继承于一个父类。
子类不能继承父类的构造方法。
继承关系下,权限修饰符的使用范围:
本类 | 同包类 | 同包子类 | 非同包类 | 非同包子类 | |
public | V | 对象名.资源 | 直接用/super.资源 | 导包后 对象名.资源 | 导包后 对象名.资源 |
protected | V | 无论是否有继承关系 对象名.资源 | 直接用/super.资源 | X | 导包后 直接用/super.资源 |
默认的 | V | 无论是否有继承关系 对象名.资源 | 直接用/super.资源 | X | X |
private | V | X | X | X | X |
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();
}
}