公式:获取[a,b]范围的随机数:(int)(Math.random()*(b-a+1))+a
什么是继承性?继承性是怎么体现的(what)
构造器要与类同名
一。继承性(拿到调到)
某属性没有在本类中定义,在父类中定义(private),在子类方法中调用时只能通过Get方法调用;属性在本类中定义(private),在子类方法中调用时可以直接调用 权限影响
1.为什么需要继承性
1)减少了代码的冗余,提高了代码的复用性
2)便于功能的拓展
3)为之后多态性的使用,提供了前提
2.继承性的格式:class A extends B{}
A:子类,派生类,subclass
B:父类,超类,基类,superclass
2.1体现:一旦子类A继承父类B之后,子类A中就获取了父类B中声明的所有属性或者方法。特别的,父类中声明为private的属性或方法,子类仍然被认为获取了父类中私有的结构。只是因为封装性的影响,使得子类不能直接调用父类的结构而已
2.2子类继承父类以后,还可以声明自己特有的属性或方法,实现功能的拓展。子类和父类的关系,不同于子集和集合的关系。
extends:延展,拓展
3.Java中关于继承性的规定
1.一个类可以被多个子类继承
2.Java中类的单继承性:一个类只能有一个(直接)父类
3.子父类是相对概念
4.子类直接继承的父类称为直接父类,间接继承的父类称为间接父类
5.子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性或结构
4.object
1.如果没有显式声明一个父类的话,则此类继承于java.lang.Object类
2.所有的Java类(除java.lang.Object类)都直接或间接继承于java.lang.Object类,所以所有的Java类都具有java.lang.Object类声明的功能。
二。方法的重写(overwrite/override)
1.重写:子类继承父类之后,可以对父类中同名同参数的方法进行覆盖操作
2.应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法(即使是在父类中调用重写的方法,调用的也是重写之后的方法)
3.重写的规定:
方法的声明:权限修饰符 返回值类型 方法名(形参列表) throws 异常的类型{
//方法体
}
约定俗成:子类中的叫重写的方法,父类中的叫被重写的方法
(1)子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
(2)子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符(覆盖)
特殊:子类不能重写父类中声明为private权限的方法(可见性大小,不构成重写)
(3)返回值类型:
1)父类被重写的方法的返回值类型是void,则子类重写的方法的返回值只能是void
2)父类被重写的方法的返回值类型是A类型(引用数据类型),则子类重写的方法的返回值类型可以是A或A的子类(eg:object类)
3)父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须是相同的基本数据类型
4)子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
ps:子类和父类的同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不考虑重写,一定不可以重写父类。静态的方法不能够被覆盖,随着类的加载而加载)
在实际开发中,直接复制黏贴,更改方法体即可
区分重载和重写
三。super(父类的)关键字的使用
0.为什么需要super?
super关键字解决了子父类重名方法冲突的问题(不是封装性 private的问题)
1.super可以用来调用属性,方法,构造器(this关键字现在本类中找,找到了往上找,super直接往上找)
2.super的使用:调用属性和方法
2.1 在子类的方法或构造器中,通过使用"super.属性"和"super.方法"的方式,显式的调用父类中声明的属性或方法,但通常情况下,习惯省略super.
2.2 特殊情况,当子类和父类中定义了同名的属性时,要想在子类中调用父类中声明的属性,则必须显式的使用“super.属性”的方式,表明调用的是父类中声明的属性(重写的方法同理)
3.super调用构造器
3.1在子类的构造器中显式的使用“super(形参列表)”的方式,调用父类中声明的指定的构造器
3.2“super(形参列表)”的使用,必须声明在子类构造器的首行
3.3“super(形参列表)”和“this(形参列表)”只能二选一,不能同时出现
3.4在构造器的首行,没有显式的声明“super(形参列表)”或“this(形参列表)”则默认调用的是父类中空参构造器
3.5在类的多个构造器中,至少有一个类的构造器中使用了“super(形参列表)”调用父类中的构造器
ps:1.方法名,属性名前面的没有加,都默认this.对于子类没有重写的方法,前面加this加super都可以
2.空参构造器末尾不用加;
3.子类构造器是”super(形参,父类中有对应的形参)“ 这样的形式,即使父类没有提供空参构造器也没事
4.空参构造器被显式造出来之后在注释掉,系统不会在默认提供空参构造器了
(图解释了子类如何调用age的)
四。子类对象实例化的全过程
1.从结果上看:(继承性)
子类继承父类以后,就获取了父类中声明的属性或方法
创建子类的对象,在堆空间中,就会加载所有父类中声明的属性
2.从过程上看:
当通过子类的构造器创建子类时,一定会直接或间接的调用父类的构造器,进而调用父类的父类的构造器,直到调用到了java.lang.Object类中空参的构造器为止。正因为加载过所有的父类的构造器,所以才可以看到内存中有父类的结构,子类对象才可以调用
虽然创建子类对象时调用了父类的构造器,但是自始至终就创建过一个对象,即为new的子类对象