目录
1.子类继承了父类所有的属性和方法,私有属性和方法要通过在父类创建公共的get方法来访问
3.创建子类对象时,不管使用哪个构造器默认都会调用父类的无参构造器(构造器里面默认有一个super())父类没有无参构造器则需要指定一个构造器来使父类完成初始化
4.java中object是祖宗类,其他所有类都是object的子类
5.一个类只能继承一个父类,子类与父类之间要存在某种关联,不能一个人继承一个日本人(因为日本人不是人)
=左边为编译类型,=右边为运行类型,一个对象的编译类型和运行类型是可以不一致的,编译类型在定义时就确定了,而运行类型是可以改变的
②.调用父类属性或方法时要遵循访问权限,不能调用子类的属性和特有的方法
instanceOf:用于判断对象的运行类型是否为某类型或某类型的子类型
①.调用方法时,引用名会和运行类型(子类)进行绑定,首先找子类
一.封装
1.隐藏细节,保障数据安全
2.将属性私有化不能直接修改属性
3.提供get和set方法来获取和赋值
创建一个A类,创建四个属性,name和count设为公共的,password和money设为private的
创建两个构造器一个无参的,一个有参的,有参的里面调用set方法防止通过构造器来访问或修改属性值
创建一个scanner对象用来接收输入的值
分别给四个属性创建get和set方法,私有属性的get方法加上密码判断,所以的set方法加上一定的规定(毕竟不能太离谱)
创建一个info方法来获取全部信息(当然要输密码)
一.创建一个A对象实例,用set方法来进行赋值,通过get方法来获取并打印,再通过info方法来获取信息,最后关闭scanner
可以看出name和count时直接输出的,剩下的都要输一遍密码
二.通过构造器来进行赋值 ,然后调用info方法
输出: 故意输错一次
二.继承
1.子类继承了父类所有的属性和方法,私有属性和方法要通过在父类创建公共的get方法来访问
2.子类必须调用父类的构造器来使父类完成初始化
3.创建子类对象时,不管使用哪个构造器默认都会调用父类的无参构造器(构造器里面默认有一个super())父类没有无参构造器则需要指定一个构造器来使父类完成初始化
4.java中object是祖宗类,其他所有类都是object的子类
5.一个类只能继承一个父类,子类与父类之间要存在某种关联,不能一个人继承一个日本人(因为日本人不是人)
在A类创建四个不同访问修饰符的属性,创建一个get方法来访问私有的n4,创建一个有参构造器
B类继承A类,指定父类的有参构造器,然后用get方法来获取私有属性并打印。
输出:
由于父类没有无参构造器报错
三.多态
多态有方法的多态和对象的多态,重载和重写就体现出了多态
多态是建立在封装和继承基础之上的,且两个对象要存在继承关系
=左边为编译类型,=右边为运行类型,一个对象的编译类型和运行类型是可以不一致的,编译类型在定义时就确定了,而运行类型是可以改变的
创建一个steam类和一个tx类为两个父类,创建dota类和csgo类继承steam类,创建lol类和dnf类继承tx类,所有类创建一个相同名字的属性和一个play方法,四个子类创建一个tese方法
1.向上转型
①.编译类型为父类,运行类型为子类
②.调用父类属性或方法时要遵循访问权限,不能调用子类的属性和特有的方法
可以看出编译类型和运行类型是可以不一致的,编译类型全都为父类,运行类型全都为子类。
不能调用子类的属性,输出的结果可以看出id属性打印的全是父类的
输出
可以看出不能调用子类特有的方法
2.向下转型
①.向下转型之前必须向上转型
②.可以调用子类所有的属性和方法
可以看出在进行向下转型后是可以调用子类的id和tese方法的
输出
可以看出如果不进行向上转型是可以编译成功的,但是运行会报错,所以说向下转型之前必须进行向上转型
输出:
3.对象的多态和instanceOf
创建一个PLATFORM类和一个GAME类为父类,分别创建两个字类继承他们,都创建一个有参构造器,父类各创建一个属性并在有参构造器里面给属性赋值,子类的有参构造器里调用父类的有参构造器
再创建一个person类,创建一个属性、一个有参构造器 和一个play方法
在main方法中创建对象传入相应的参数并调用
输出:
instanceOf:用于判断对象的运行类型是否为某类型或某类型的子类型
创建一个编译类型和运行类型均为game的对象,game是lol类型的父类,是game类型,是object类型的子类,所以输出 false、 true、 true
输出:
当编译类型为子类,运行类型为父类会报Type mismatch(类型不匹配)的错误
4.动态绑定机制
在进行向上转型后
①.调用方法时,引用名会和运行类型(子类)进行绑定,首先找子类
②.属性没有动态绑定机制
创建一个父类两个子类,都有一个属性id、一个get方法,给父类和一个子类创建一个i方法
在i方法中输出get方法和属性id
(4、5、6用的类图)
创建两个不同的子类对象,输出i方法。
可见game1调用了父类的i方法但是i方法中get方法是自己(lol类)的,这就是动态绑定机制,属性没有动态绑定机制,所以属性id是game的id,
game2有get方法和id所以输出的都是自己的
输出
5.多态数组
数组的定义类型为父类,保存的元素为子类
这里还用上面的类,可见一样调用i方法,输出的结果是一样的
输出
6.多态参数
定义方法时的形参为父类,传入的实参为子类
这里还用上面的类,再创建一个person类,person类里创建一个属性name和一个有参构造器,
创建一个play方法,形参为GAME类(父类),方法里输出get方法
创建一个person对象,调用play方法传入实参LOL类和CSGO类(子类)
输出可见确实调用了对应的get方法