一、关键字this:
1.this:
this关键字在方法的内部使用,表示调用该方法的对象;this在构造器中使用,表示该构造器正在初始化的对象;this可以调用成员变量、方法和构造器;常用于setXxx()方法中区分是成员变量还是传递的参数
2.this的理解:当前(在方法中调用时)或正在创建(在构造器中调用时)的对象;
3.this调用属性和方法(非static修饰的方法):
一般情况下通过对象调用方法,可以在方法内调用当前对象的属性或其他方法,此时可以在属性和其他方法前使用"this."表示当前属性或方法所属的对象,但是一般情况下可以省略该结构;如果方法的形参和对象的属性同名,则必须使用"this."结构进行区分,使用"this."修饰的变量即为属性(或成员变量),没有使用"this."修饰的变量即为局部变量;
通过构造器创建对象时,可以在构造器内调用当前正在创建的对象的属性或方法。此时可以在属性和方法前使用"this.",表示当前属性或方法所属的对象。一般情况下都选择省略此"this."结构;如果g构造器的形参与对象的属性同名,则必须使用"this."进行区分。使用"this."修饰的变量即为属性(或成员变量),没有使用"this."修饰的变量即为局部变量;
4.this调用构造器:
a.可以在类的构造器中使用"this(形参列表)"的格式调用当前类中指定的其他构造器;
b."this(形参列表)"必须声明在当前构造器中的首行;
c."this(形参列表)"在构造器中只能声明一次
d.如果一个类中声明了N个构造器,则最多有N-1个构造器中可以声明"this(形参列表)"的结构
二、面向对象特征二:继承性(Inheritance)
1.Java继承的概述:
自上而下:定义了一个类A,在定义另一个类B时,发现类B的功能与类A相似,考虑类B继承于类A
自下而上:定义了类B,C,D等,发现B、C、D有类似的属性和方法,则可以考虑将相同的属性和方法进行抽取,封装到类A中,让类B、C、D继承于类A,同时B、C、D中相似的功能就可以删除了;
多个类中存在相同的属性和行为时,将这些内容抽取到单独的一个类中,那么多个类中无需定义这些属性和行为,只需要和抽取出来的类构成继承关系;
2.Java中继承的好处:
(1)继承的出现减少了代码冗余,提高了代码的复用性;
(2)继承的出现更有利于功能的扩展;
(3)继承的出现让类与类之间产生了is-a关系,为多态的使用提供了前提;
3.Java中继承的语法:
public class A{
//属性和方法
}
public class B extends A{
//属性和方法
}
类A:父类、superClass、超类、基类;
类B:子类;
子类获取到父类中声明的所有的属性和方法,但是由于封装性的影响,可能子类不能直接调用父类中的属性和方法;子类在继承父类以后还可以扩展自己特有的功能,增加特有的属性和方法;
4.默认的父类:Java中声明的类如果没有显式的声明其父类时则默认其继承于java.lang.Object类;
5.补充说明:
(1)Java支持多层继承(继承体系):子类和父类是一种相对的概念,存在直接父类和间接父类;
(2)Java中一个父类可以声明多个子类,反之一个子类只能有一个父类(Java的单继承性);
三、方法的重写(overwrite):
父类所有声明的方法子类都会继承,但是当某个方法被继承到子类之后,子类可以对从父类中继承的方法进行改造,称之为方法的重写(overwrite),也称为方法的重置、覆盖;在程序执行时,子类的方法将会覆盖父类的方法;
1.重写的定义:
子类对父类继承过来的方法进行的覆盖、覆写的操作称为方法的重写;
2.方法重写的规则:
(1).父类被重写的方法与子类重写的方法的方法名和形参列表必须相同;
(2).子类重写方法的权限修饰符不小于父类被重写的方法的权限修饰符,但是子类不能重写父类中声明为private权限修饰符修饰的方法
(3).父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型必须是void
(4).父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须和父类被重写的方法相同
(5).父类被重写的方法的返回值类型是引用数据类型(class),则子类重写的方法的返回值类型可以与被重写方法的返回值类型相同,或者是被重写方法返回值类型的子类;
(6).子类重写的方法的方法体与被重写方法的方法体之间没有要求;
(7).子类重写的方法抛出的异常的类型可以与父类被重写方法抛出的异常类型相同,或者是父类被重写方法抛出的异常的子类
3.重载和重写的区别:
(1)重载:两同一不同;
(2)重写:继承以后子类覆盖父类中同名同参数的方法
四、super关键字:
子类中通过super调用父类的方法、属性以及构造器;
1.super可以调用的结构:
(1)属性、方法
子类继承父类以后,可以在子类的方法或构造器中调用父类中声明的属性或方法(满足封装性的前提下),调用时需要使用"super."的结构表示调用父类的属性和方法;一般情况下可以考虑省略"super."的结构,但是如果子类重写了父类的方法或子类中出现了同名的属性时则必须使用"super."的结构加以区分;
(2)构造器
a.子类继承父类时,不会继承父类的构造器,但可以通过"super(形参列表)"的形式显式调用父类中指定的构造器;
b.规定:"super(形参列表)"的格式必须声明在构造器的首行;
c.如果在子类构造器的首行既没有显示调用"this(形参列表)",也没有显式调用"super(形参列表)",则子类此构造器默认调用"super()",即调用父类中空参的构造器;
d.在子类的任何一个构造器中,要么会调用本类中重载的构造器,要么会调用父类的构造器,只能是这两种情况之一;
e.一个类中声明了n个构造器,最多有n-1个构造器使用"this(形参列表)",则剩下的那个一个一定使用"super(形参列表)";
在通过子类的构造器创建对象时,一定在调用子类构造器的过程中,直接或间接调用到父类的构造器,也正因为调用过父类的构造器,才会将父类中声明的属性或方法加载到内存中供子类对象使用;
2.子类对象实例化的全过程(类的继承性):
创建子类对象后,子类对象就获取了其父类中声明的所有属性和方法,在权限允许的情况下可以直接调用;当通过子类的构造器创建对象时,子类的构造器一定会直接或间接的调用到其父类的构造器,而其父类的构造器同样会直接或间接的调用到其父类的父类的构造器,直到调用到Object类中的构造器为止;
五、面向对象特征三:多态性
1.多态性的形式和体现:
多态性:一个事物的多种形态
2.Java中多态性的体现:
子类对象的多态性:父类的引用指向子类的对象(子类的对象赋给父类的引用)
3.多态性的应用:虚拟方法调用
在多态的场景下调用方法时:编译看左边,执行看右边
编译时,认为方法是左边声明的父类的类型的方法
执行时,实际执行的是子类重写父类的方法
4.使用多态性的前提:(1)有类的继承关系;(2)有方法的重写
5.多态的适用性:适用于方法,不适用于属性
6.多态的好处和弊端:
(1)极大地减少了代码的冗余,不需要定义多个重载的方法;
(2)在多态的场景下,创建子类的对象和加载子类特有的属性和方法,但是由于声明为父类的引用,导致无法直接调用子类特有的属性和方法;
7.向上转型与向下转型:
(1)向上转型:左边的变量类型(父类)大于右边的变量类型(子类)
此时,编译时按照左边变量的类型来处理,无法调用右边对象特有的属性和方法
(2)向下转型:左边的变量类型(子类)小于右边的变量类型(父类)
可能会出现类型转换异常(ClassCastException),建议在向下转型之前使用instanceof进行判断(a instance of A),避免出现类型转换异常;
如果对象a是类A的实例(a instanceof A返回true),那么对象a也是类A父类的实例(a instanceof superA同样返回true)
六、Object类的概述:
1.理解根父类:
类java.lang.Object是类层次结构的根类,即所有其他类的父类,每个类都使用Object作为超类;任何一个Java类(除Object)都直接或间接的继承于Object类,Object类称为Java类的根父类;
Object类中声明的结构(属性、方法)具有通用性:
(1)Object类中没有声明属性;
(2)Object类提供了一个空参构造器
2.Object类中常用的方法
(1)equals()方法
适用性:
任何引用数据类型都可以使用
equals()方法使用说明:
a.自定义的类在没有重写Object中的equals()方法时调用的就是Object中声明的equals(),此时比较的是两个对象的引用地址是否相同(比较两个对象是否指向了堆空间中同一个对象实体)
b.对于String,File,Date和包装类等,它们都重写了Object类中的equals()方法,用于比较两个对象实体内容是否相等
c.实际开发中,针对于自定义的类,常常会判断两个对象是否相等,此时主要判断两个对象的属性值是否相等,所以需要重写Object类中的equals()方法
==运算符:
a.使用范围:基本数据类型、引用数据类型
b.基本数据类型判断数值是否相等,引用数据类型变量比较两个引用变量的地址值是否相等(比较两个引用是否指向同一个对象实体)
equals()方法:
a.使用范围:只有引用数据类型
b.对于类来说,重写equals()方法和不重写equals()方法之间存在区别
(2)toString()方法
Object中toString()的定义:
public String toString(){
return getClass().getName()+ "@" + Integer.toHexString(hashCode())
}
在调用System.out.println()打印对象引用变量时,其实调用了对象的toString()方法
自定义的类在没有重写toString()方法时,此时默认调用的时Object类中的toString()方法,像String,File,Date或包装类等Object的子类都重写了Object类的toString(),在调用该方法时返回当前对象的实体内容,一般在实际的开发过程中需要重写该方法,确保输出的内容是当前对象的实体内容
(3)clone()方法:复制一个给定的对象,返回值类型为Object
(4)finalize()方法:当垃圾回收器回收此对象时便会调用该方法,子类重写此方法后可在释放对象前进行某些特定的操作