类
组成
成员变量
//成员变量与局部变量的不同
- 声明位置不同
前者在类中,方法外. 后者在定义方法时,或者方法体内- 内存位置不同
前者在堆中,与对象有关, 后者在栈中,与方法有关.- 初始化不同
前者在创建对象时可以不用初始化,后面通过地址值赋值. 后者在使用前必须初始化.- 生命周期不同
前者随着对象的创建而存在,空闲时被垃圾回收器处理. 后者随着方法的结束而消失
/成员变量与静态变量的不同
- 内存位置不同
前者随着对象创建存储在堆中,后者随着类的加载存储在方法区中- 访问方式不同
前者根据地址值指向堆中进行访问,后者根据堆中的静态标记指向方法区. 前者多个对象的值可以不同,后者有一个对象改变其值,其他对象指向的值也随着改变- 生命周期不同
前者随着对象的创建而存在,被垃圾回收器回收. 后者随着类的加载且只加载一次
//父类成员变量与子类成员变量还有局部变量名
//访问顺序如下
- 寻找栈中的局部变量,如果无
- 寻找堆中子类的成员变量,如果无
- 寻找判断父类中是否有该成员变量名
如果父类成员变量与子类成员变量还有局部变量名相同
//就需要区分访问
this.xxx
super.xxx
构造方法
//无参构造
public 类名{} //jvm默认提供,如果有了有参构造则不提供. 故需要显示写出
//有参构造
public 类名(String name,int age){
this.name = name; //当局部变量与成员变量相同,需要用this区分
this.age = age;
}
成员方法
//get与set方法
(私有化成员变量,需要提供公开的属性赋值访问方法)
(Alt + Fn + Insert
)
public void setName(String name){
this.name = name;
}
public String getName(){
return name; //一般由子类调用,因为本类可以直接访问,不同调用该方法
}
//方法
public void method(){
System.out.println(age);
}
public String method(){
return name;
}
代码块
静态代码块 > 构造代码块 > 构造方法
父类静态代码块 > 子类静态代码块 > 父类构造代码块 > 父类构造方法 > 子类构造代码块 > 子类构造方法
// 静态代码块随着类的加载而加载
static {}
// 构造代码块执行构造方法前(每一次new对象)执行,,
可以对类成员进行初始化
class Demo{
{
name = "damary";
}
}
// 方法中使用限定局部变量的生命周期
public void method(){
//方法体
{
按照顺序执行,无特殊优先级
}
}
特征
封装
- 私有化成员变量,只通过公共方法对其进行访问调用
保证安全性 - 也可以对方法进行封装私有化,然后通过该类中的公共方法调用该私有化方法
继承
:is a
子类继承父类[实现接口]后,
重写后的方法修饰权限必须>=
父类方法
-
作用
保证代码复用性,后期便于维护代码
-
特点
- 单继承
- 多层继承
- 所有的类默认继承object类
-
成员变量
(可以通过super,this区分调用)
- 父类的非私有成员变量,子类直接继承
- 父子类无重名,子类可以直接访问该变量.
- 如果与子类重名,通过this.xxx与super.xxx区分
- 父类的私有化成员变量通过get与set公共方法来访问
- 父类的非私有成员变量,子类直接继承
-
构造方法
每一个类都必须写自己的构造方法,无法继承
- 默认先走父类的无参构造(如果没有就会报错,所以父类无参构造必须写出来)
- 如果子类构造方法第一句指明super(xxx)[this(xxx)] (如果走this(xxx), 则必须保证子类有参构造初始化完成父类构造方法) 则根据指明的先走,走完然后对
子类属性进行初始化,最后走子类构造方法中剩下的语句
//一般代码习惯
class Zi extends Fu{ public Zi(){} //子无参调用父无参(系统默认产生) public Fu(String name,int age,char sex){ super(name,age); //子有参调用父有参 this.sex = sxe; } }
-
成员方法
(不能通过this,super区分调用,只能有一个入口)
- 父类的方法不重名,直接继承
- 重写方法
(方法名,参数列表,返回类型必须一毛一样,不一样会报错
)该方法,通过子类对象调用该方法表现子类方法- 需要调用父类方法,则加入super.method()
-
方法重写与方法重载 ~~ 雷峰塔与雷锋
- 重写:继承关系中,方法名,参数列表,返回值必须完全一样
- 重载:方法名一样,和参数列表,返回值无关.
保证方法扩展性,一个方法可以有不同的参数列表
多态
- 前提
继承
方法重写
父类引用指向子类对象 - 格式
Animal cat = new Cat();
- 访问特点
子类伪装成父类
- 成员变量表现的是父类
- 但是一旦运行重写后的方法,表现的是子类
- 不能访问子类独有的方法. 需要通过
向下转型
- 异常
ClassCastException (类转换异常)
无继承关系的两个类进行多态格式,虽然编译时不报错
,运行就会抛出异常 - 作用
一个方法传递的参数为父类,其子类通过多态依然可以被这个方法调用. 但是在运行时,子类表现的是其重写后的方法
接口多态
- 格式
JumpI cat = new Cat();
- 格式
关键字
super 与 this
- super
super.变量名 //当子类与父类变量重名,通过super可以访问父类变量名,与子类进行区分 super() //父类无参构造 super(name,age) //父类有参构造 super.method() //重写方法后,需要在方法体中沿用父类方法体
- this
当前对象值地址的引用 - 用在构造方法中:用于区分成员变量与局部变量 - 当变量名与父类变量名重名,区分子父类的变量名
static
- 特点
- 共享的
- 随着类的加载而加载
- 不能和this共用
静态方法只能访问静态方法,静态成员变量 非静态方法既能访问静态也能访问非静态
- 访问过程
- 推荐类名直接访问
- 随着类被加载在方法区初始值为null或者其他各类型初始值,静态成员由创建对象的静态标记指向来访问.
对象间对静态成员变量的修改会互相影响
- 用途:一般为工具类
私有化构造方法
直接使用类方法,此时类需要被标记为静态类
final
最终的,无法被更改的,一般和static一起使用
//修饰类,表示类无法被继承
public final Student {
final CONSTANT = 3; //final修饰变量,变量为常量,且必须要初始化.
public final void method(){
//修饰方法:该方法不能被重写
//保证父类方法的安全性
}
}
//a为基本类型,其值无法改变
public static final int a = 9;
//a为引用类型,其地址值无法改变,但是值可以变
public static final Integer a = new Integer(10);
abstract
- 定义
只能用来修饰类,方法
- 格式
//抽象方法无大括号 public abstract void method();
- 特点
- 有抽象方法一定是抽象类,是抽象类不一定有抽象方法
- 抽象类不能被实例化
- 其子类可以是抽象类也可以非抽象类,但子类中一定要有具体类
- 子类必须重写抽象方法
冲突词
- final:抽象方法必须要被继承来重写抽象方法.final不能被继承,冲突!
- static: 抽象类中的抽象方法无方法体,故不能通过类名直接访问,冲突!
- private:抽象类的方法必须要被子类继承重写,私有化后则无法重写.冲突!
- 抽象类多态
通过多态方式来实例化具体类,达到访问抽象类属性的目的.
interface
:like a
比抽象类还抽象
- 定义
- 满足一定条件才具备的某种额外的功能
没有构造方法
interface Jump{ //成员变量是static final [public static final] 成员变量; //方法必须是抽象的 [public abstract] void jump(); }
特点
- 方法只能是抽象方法 //要被重写
静态常量
//只能访问不能修改- 多继承
instanceof
判断对象类型是否为指定数据类型
Dog a = new Dog();
//如果a是B的子类[`继承与实现`],那么结果为true
if(a instanceof B){}
else{}