继承
- 好处:
- 减少冗余,提高了代码的复用性
- 便于功能的扩展
- 为多态的使用提供了前提
- 格式:
class A extents B{ }
A:子类 B:父类
一旦子类A继承了父类B 之后,就获取了父类中声明的属性、方法。特别的,父类中声明为private的属性或方法,子类仍然继承,但因为封装性的影响,子类不能直接调用
子类继承父类之后,也可以声明自己独有的属性或方法
- 规定
- 一个类可以被多个子类继承
- 一个类只能有一个父类:单继承
- 子类继承父类之后,就获取了直接父类以及所有间接父类声明的属性及方法
- Object
如果我们没有显式声明一个类的父类,则此类继承于java.lang.Object
所有类都直接或间接继承于java.lang.Object
方法的重写
-
子类继承父类之后,可以对父类中同名同参数的方法,进行覆盖操作
-
重写之后,当创建子类对象之后,通过子类对象调用子父类中同名同参数的方法时,实际执行的是子类重写父类的方法
-
重写的规定
方法的声明:权限修饰符 返回值类型 方法名(形参列表){ }
子类重写的方法的方法名和形参列表与父类被重写的方法名和形参列表相同
子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
子类不同重写父类中声明为private的方法
返回值类型:
- 父类被重写的方法的返回值类型是void,子类的返回值类型也只能是void
- 父类被重写的方法的返回值类型是A类型,子类的返回值类型可以是A类或A类的子类
- 父类被重写的方法的返回值类型如果是基本数据类型,子类的返回值类型必须相同
- 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
super
-
super理解为父类的
-
可以用来调用属性、方法、构造器
-
super的使用
-
可以在子类的方法或构造器中,通过使用super.属性或者super.方法,显式的调用父类中声明的属性或方法,但通常情况下,习惯省略super
-
特殊情况下,当子类和父类中定义了同名的属性,必须显式使用 super.属性 的方式,表面调用的是父类中声明的属性
-
当子类重写了父类的方法以后,我们想在子类的方法调用父类被重写的方法时,必须显式使用super.方法的方式,表面调用的是父类声明的方法
-
-
super调用构造器
- 可以在子类的构造器中显式的使用super(形参列表)的方式,调用父类中声明的指定的构造器
- super(形参列表)的使用,必须声明在子类的构造器的首行
- 在类的构造器中,this(形参列表)或super(形参列表)只能二选一
- 在构造器的首行,没有显式声明this(形参列表)或super(形参列表),则默认调用的是父类中空参的构造器
- 在类的多个构造器中,至少有一个类的构造器使用了super(形参列表),调用父类的构造器
子类的对象实例化的过程
-
从结果上来看,子类继承父类后,就获取了父类中声明的属性或方法
创建子类的对象,在对空间中,就会加载所有父类中声明的属性
-
从过程上看,当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器,指导调用了java.long.Object类中空参的构造器为止
多态
-
可以理解为一个事物的多种形态。父类的引用指向子类的对象。
-
多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法——虚拟方法调用
-
有了对象的多态性之后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法,总结为,编译看左边,运行看右边
-
多态性的使用前提:类的继承关系、方法的重写
-
对象的多态性只适用于方法,不适用于属性
instanceof
a instanceof A :判断对象a是否为类A的实例,如果是,返回ture,如果不是,返回false
为了避免在向下转型时出现异常,在向下转型之前先进行instanceof判断
向下转型举例:
Person p1=new Woman();
Man m1=(Man) p1;//错误
Person p1=new Man();
Man m1=(Man) p1;//正确
Object类
Object类是所有Java类的根父类
-
==与equals()区别
-
==:可以使用在基本数据类型变量和引用数据类型变量中
如果比较的是基本数据类型变量,比较两个变量保存的数据是否相等
如果比较的是引用数据类型变量,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
-
equals()
是一个方法,而非运算符
只适用于引用数据类型
String、Date、File、包装类等都重写了Obiect类中的equals()方法,重写之后,比较的不是两个引用的地址是否相同,而是比较两个对象的实体内容是否相同
自定义类对equal()方法进行重写,比较两个对象实体内容是否相同
-
-
toString()
- 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()方法
- 像String、Date、File、包装类都重写了toString()方法,使得调用对象的toString()时,返回实体内容信息
- 自定义类也可以重写toString()方法,当调用此方法是,返回对象的实体内容
包装类
-
Java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征
-
基本数据类型、包装类、String三者之间的相互转换
- 基本数据类型——>包装类:调用包装类的构造器
int num1=4;
Integer in1=new Integer(num1);
System.out.println(in1.toString());
-
包装类——>基本数据类型:调用包装类的xxxValue()Integer in1=new Intger(12);int i1=in1.intValue();
-
自动装箱
int num2=0;
Integer in1=num2;
-
自动拆箱
int num3=in1;
-
包装类——>String类:调用String重载的valueOf(Xxx xxx)
-
连接运算
String str1 =num1+" ";
-
调用valueOf(Xxx xxx)
float f1=12.3f;
String str2 = String.valueOf(f1);
-
-
String类——>包装类:调用包装类的parseXxx()
-
str1 = “123”;
int num2 = Integer.parseInt(str1);
-