类与对象
- 类声明的对象被称为对象变量,简称对象
- 局部变量无默认值,成员变量有默认值(
boolean
——false
;byte,short,int,long
——0
;float,double
——0.0
;引用型变量——null
) - 类体由两个部分组成:变量的声明的方法的定义
- 构造方法
- 无返回类型
- 不能用
final
修饰 - 不能被继承
- 不编写,则默认提供一个无参的,编写则不提供
- 声明对象后该对象为空对象,使用
new
运算符为其分配内存空间(先为成员变量分配,再执行构造方法中的语句),最终将引用赋值给该对象 new
标识符只能和类的构造方法进行运输,得到的值是一个引用- 一个类声明的两个对象如果具有相同的引用,两者就具有完全相同的变量(实体)
- 可变参数
- 这些参数类型必须相同
- 必须是参数列表的最后一个
- 实例变量和类变量(
static
修饰)
- 实例变量属于对象(只能通过对象访问),类对象既属于对象也属于类(既能通过对象访问,也能通过类名直接访问)
- 所有对象共享类变量
- 实例方法和类方法(
static
修饰)
- 只有当该类创建对象时,类的实例方法才会被分配入口地址,而且只分配一次
- 实例方法既可以操作实例变量,也可以操作类变量,既可以调用类中的实例方法,也可以调用类方法(构造方法除外),实例方法只能通过对象调用;类方法不可以操作实例变量,也不可以调用实例方法,只能调用类方法
- 方法重载
- 名字相同
- 参数个数或者类型不同
- 不考虑返回类型
this
关键字
- 不可以在类方法中使用(因为
this
表示的是某个对象,类方法可以直接通过类名调用,可能该时还没有任何对象产生)
import
语句必须写在package
语句和类的定义之间- 访问权限(
private,protected,public
)
- 类只能有两种访问权限,
public
和缺省 - 可以修饰成员变量,不可以修饰局部变量;可以修饰方法(包括构造方法,构造方法的访问权限与类一致)
- 方法内部变量不能用public,static,private等修饰,只能用final修饰(或者直接不写)
public>protected>友好的>private
var
局部变量
- 不可以用来声明成员变量,只能在方法体中使用来声明局部变量
- 声明时必须显式的给出初值,不能为
null
子类与继承
- 单继承
- 关键字
extends
- 子类父类不在同一个包中,子类继承父类中的非
private
变量和方法,继承过来访问权限保持不变。 - 子类父类不在同一个包中,子类只继承父类中的
protected
和public
访问权限的方法。(这也体现出了protected
和友好访问权限的区别)。 - 当创建一个子类对象时,子类和父类中都被分配了内存空间,但只是将父类中被子类继承的那一部分成员变量分配给子类。
- 子类继承的方法只能操作子类继承的成员变量或未继承的成员变量,不能操作子类新声明的变量。
- 子类继承的方法所操作的成员变量一定是被子类继承或者隐藏的成员变量。(采用
super
关键字可以操作子类隐藏的成员变量) - 方法重写:
- 类型一致或者是其子类型
- 方法的名字,参数个数及类型完全相同
-
final
方法不能被重写 - 重写的方法中所操作的成员变量一定是子类新声明的成员变量
- 不允许降低方法的访问权限,必须大于等于
- 当子类用构造方法创建一个对象时,子类的构造方法总是先调用父类的某个构造方法。
super
关键字
- 当
super
调用被隐藏的方法时,该方法中出现的成员变量是被子类隐藏的成员变量或者继承的成员变量 - 由于子类不继承父类的构造方法,所以在子类中需要用
super
来调用父类的构造方法,如果没有明显的指出调用哪个构造方法,则默认调用无参的构造方法,而且该语句必须是子类构造方法中头一个语句,并且如果没有显示的写出,则默认有super()
,若显式的写出了则不提供默认的super
语句。
final
关键字
-
final
类不能被继承 -
final
不能修饰构造方法 - 若父类中有被
final
修饰的方法,那么该方法只能被子类继承,不能被重写 - 当修饰成员变量或局部变量时,则为常量,不允许发生变化,而且在声明时指定该值,不提供默认值
- 上转型对象
- 普通子类对象和上转型对象访问的变量和方法范围的区别
- 普通子类对象:继承的变量,新增的变量,继承或重写的方法,新增的方法
- 上转型对象:隐藏的变量,继承的变量,继承或重写的方法
- 如果子类重写了父类的某个实例方法,当上转型对象调用这个实例方法时一定是调用了子类重写得实例方法**(静态方法除外,调用的是父类原有的静态方法)**
abstract
类和abstract
方法
-
abstract
方法只允许声明,不允许实现 - 不允许用
final
修饰一个抽象方法或者抽象类,也不允许用static
和private
修饰一个抽象方法(抽象方法必须是非private
的) -
abstract
类中可以有抽象方法也可以有非抽象方法,也可以无抽象方法,且有抽象方法的一定是抽象类 -
abstract
类不能使用new
标识符创建对象,可通过使其变成该抽象类的一个子类的上转型对象的方法,来调用子类重写的方法 - 非
abstract
类继承abstract
类,必须重写父类的abstract
方法;abstract
类继承abstract
类,既可以重写父类中的abstract
方法,也可以继承abstract
方法 - 抽象类封装了子类必须要有的行为准则,
abstract
类只关心操作,而不去关心操作的细节,具体细节由实现类去实现
接口与实现
- 所有方法都是
public abstract
的,所有变量都是public final statc
的,而且可以省略 - 接口中可以定义
default
方法,default
不能省略 - 非
abstract
类实现某个接口,那么这个类必须重写该接口的所有abstract
方法 -
abstract
类实现某个接口,那么这个类既可以重写也可以拥有abstract
方法 - 类实现后,并不拥有
static
方法和private
方法,default
方法既可以重写也可以拥有,重写方法不可以省略public
- 接口也可以被继承,子接口将继承父接口中的全部方法和常量
- 接口回调
- 将实现某一个接口创建的对象的引用赋值给接口声明的接口变量
- 该变量可以调用实现的接口方法,接口提供的
default
方法以及重写的default
方法 - 接口·无法调用类中其它的非接口方法,只能调用实现的方法
- 一个接口中只有一个
abstract
方法称为单接口,也叫函数接口 - 接口可以抽象出重要的行为准则
- 如果一个方法的参数是接口类型,就可以将任何实现该接口的类的实例的引用传递给该接口参数