面向对象

类与对象

类的修饰符可以是public、final、abstract或者完全省略这三个修饰符。

类定义包括三个最常见的成员:构造器、成员、方法,构造器用于构造该类的实例,Java通过new关键字来调用构造器。

static修饰的成员不能访问没有static修饰的成员。static修饰的成员,表明它属于类本身,而不属于该类的实例。因此把static修饰的成员变量和方法叫类变量、类方法。不使用static修饰的成员的方法叫实例变量、实例方法。

成员变量的修饰符可以是public、protected、private、static、final,其中public、protected、private只能出现一个,可以与static、final组合起来修饰成员变量。

方法的修饰符可以是public、protected、private、static、final、abstract,其中public、protected、private只能出现一个,abstract和final只能出现一个,它们可以与static组合起来一起修饰方法。

构造器的修饰符可以是public、protected、private其中之一,构造器无返回值,也不能使用void声明构造器没有返回值。

关键字this总是指向调用该方法的对象。this作为对象的默认应用有两种情形:1、构造器中引用该构造器正在初始化的对象。2、在方法中引用调用该方法的对象。

this关键字可以代表任何对象,当this出现在某个方法体中时,它所代表的对象是不确定的,但它的类型是确定的,它所代表的对象只能是是当前类;只有当这个方法被调用时,它所代表的对象才被确定下来,谁在调用this这个方法,this就代表谁。当使用this关键字调用另一个重载构造器,只能在构造器中使用,而且必须作为构造器执行的第一条语句。

静态成员变量不能访问非静态成员变量,因为对于static修饰的方法而言,可以使用该类来调用方法,如果在static修饰的方法中使用this关键字,则这个关键字无法指向合适的对象。

方法

没有static修饰的方法属于这个类的对象,不属于这个类的本身。因此没有使用static修饰的方法只能使用对象作为调用者来调用,不能使用类来调用,使用不同对象作为调用者来调用同一个普通方法,可能得到的结果也不同。

使用static修饰的方法属于类本身,既可以使用该类作为调用者调用,也可以使用对象作为调用者来调用,它们的执行结果相同。

同一个类中调用另一个方法,如果被调用方法是普通方法,则默认使用this关键字作为调用者;如果被调用方法是静态方法,则默认使用类作为调用者。

方法参数传递机制是值传递,即将实参的副本(复制品)传入方法内,而参数本身不会受到任何影响。

Java允许定义形参个数可变的参数,从而允许为方法指定数量不定的 形参个数。如果在定义方法时,在最后一个形参的类型后加三点(...),则表明该形参可以接受多个参数值,多个参数值被当成数组传入,一个方法最多之能有一个长度可变的形参,并且处于最后。

定义方法签名public static void test(int a,String ... books)等价于public static void test(int a,String[] books)

它们的调用分别为:test(5,"疯狂java讲义","企业管理器")、test(5,new String[]{"疯狂java讲义","企业管理器"})

Java方法的三要素:调用者、方法名、形参(个数,顺序,类型)

方法重载:同类同方法名不同形参列表,即两同一不同。

变量

所有变量分为成员变量和 局部变量,成员变量又分为类变量(static修饰的变量)和实例变量(没static修饰的变量);局部变量又分为形参、方法局部(方法内)、代码块局部(代码块内);类变量的作用域是该类的生存期,实例变量是该实例的生存期;方法局部变量在方法内有效,代码块局部变量在代码块内有效,局部变成存储在栈内存中。

访问控制符

private只能访问当前类,default同包访问,protected子类访问(同包不同类,不同包的子类),public公共访问,访问范围逐渐扩大。

局部变量不能使用访问修饰符,外部类只能用public、default访问修饰符。

模块设计追求高内聚,低耦合。

继承

继承用关键字extends实现,java子类扩展了父类,可以获得父类的全部成员变量和方法,但是不能获得父类的构造器,Java的单继承,即一个子类只能有一个直接父类,可以有多个间接父类。如果定义一个Java类时,并未显式指定这个类的父类,则这个类的默认扩展是Java.lang.object类。因此,Java.lang.object是所有类的父类。

方法重写要求:两同两小一大,即两同指方法名、形参列表相同。两小指子类方法的返回值类型比父类的返回值类型要更少或相等,子类方法声明抛出的异常要比父类方法声明抛出的异常要更少或相等。一大指子类方法的访问权限要比父类的访问权限要更大或相等。覆盖方法和被覆盖方法必须要么都是类方法,要么都是实例方法,不能一个是实例方法,一个是类方法。也就是要求子类与父类的方法名、返回值类型、形参列表相同。

当子类覆盖父类的方法后。子类无法访问父类被覆盖的方法,但可以在子类方法中通过使用super(被覆盖的方法是实例方法)或者父类类名(被覆盖的方法是类方法)来调用父类被覆盖的方法。如果被覆盖的方法有private修饰,那么子类方法无法访问,也无法重写。如果子类中定义了一个与父类具有相同的方法名 形参列表 返回值类型的方法,依然不是重写方法,只是在子类力重新定义了一个新方法。

方法重载主要发生在同一类中多个同名方法之间,方法重写主要发生在子类与父类同名之间。

调用父类构造器

子类不会获得父类的构造器,但子类可以调用父类的构造器的初始化代码。在一个构造器中调用另一个重载的构造器,用关键字this来调用。在子类构造器中调用父类构造器使用super调用来完成。使用super调用父类构造器必须放在子类构造器执行体的第一行。

创建任何对象总是从该类所在继承树最顶层类的构造器执行,然后依次向下执行。最后执行本类的构造器。如果某个父类通过调用同类中的重载构造器,就会依次执行此父类的多个构造器。

多态

Java中引用变量有两种类型:一个是编译类型,一个是运行类型。如果两者不一致,可能就会出现多态。引用变量在编译阶段只能调用其编译类型的方法,但运行时则执行它运行类型所具有的方法。对象的实例变量不具有多态性,通过引用变量来访问其包含的实例变量时,系统总是试图访问它编译类型所定义的成员变量,而不是运行时所定义的成员变量。

引用类型强制类型转换,只能在具有继承关系的两个类型之间进行,在强制类型转换前,使用instanceof运算符加以判断是否可以转换成功。instanceof的作用是:在进行强制类型转换之前,首先用instanceof旁段一个对象是否可以强制类型转换,然后再使用(type)运算符进行强制类型转换。

原文地址:https://www.cnblogs.com/fairy-0518/p/6947675.html