对象概述
对象是类的实例表现形式
创建对象通过类中的构造方法完成
一个类可以创建多个对象,每个对象相对独立
访问对象成员
引用对象的成员变量
对象名.变量名
引用对象的成员方法
对象名.方法名(参数)
Vector v = newVector();
v.addElement(“helloworld”);
int[] a ={1,2,3,4,5};
int size =a.length;
System.out.println();
对象内存结构
创建对象将在JVM堆内存中开辟对应的成员变量内存存储空间,并对其进行初始化值的设定
所有的对象均在于堆内存中,即便是static修饰的对象,内存存储位置也在堆内存,只是外部引用指向该位置
对象内存回收
对象的引用一旦不存在,该对象所占用的内存空间将永远不会被JVM访问到,该空间即变为垃圾内存,垃圾内存可以通过JVM自动回收的方式进行清理,也可以通过JVM自动回收的方式进行清理,也可以由程序员手动清除,具体的操作步骤见System类中的gc方法
存在引用的对象内存空间将永远不被回收,如果内存中存在的此类对象过多,将造成内存不足的情况发生
对象作为方法的参数
类是一种数据类型,在进行方法参数设计时,可以为类传递对象作为参数,即对象作为方法的参数
对象作为方法的参数与基本数据类型作为方法的参数不同,基本数据类型传递的数据为对应的值,而对象作为方法的参数传递的是对象内存空间的引用
对象作为方法的返回值与对象作为方法的参数十分相似,返回的也是该对象的引用。
数组对象
数组在进行内存空间的创建时,占用的内存空间位于堆内存范围内,数组可以看做是一种特殊的对象,操作数组同样也是使用引用的格式进行
对象数组
对象数组是一种特殊的数组,即数组中保存的元素是对象,在数组的内存表示格式中,对应的值不再是一个基本数据类型对应的二进制表示形式,而是一个对象的引用地址
this
为加强程序的阅读性,在类的实例方法中,为每一个实例变量或实例方法的引用前面添加this关键字,指代该调用使用的是当前类的实例
this关键字可以理解为成员的调用者对应的内存空间,简单来说A对象调用function(),在方法中所有的this指代的就是A对象,如果换B对象调用该方法,所有的this指代的就是B对象
this关键字在某些情况下不能省略
匿名对象
匿名对象即没有名称的对象,也可以称为没有引用的对象,匿名对象仅在创建时有效,在其内存空间被使用完毕前,如果没有对其进行引用,则匿名对象将永久性成为垃圾内存
封装
封装的实现原理
Java语言中为实现对实体的封装,可以对类内的成员进行私有化(private)声明,使其功能对外不可见,然后为其提供对应的访问器,对原始被封装的实体进行操作
访问器分为两种
获取访问器
修改访问器
封装的标准实现
class Person
{
private String namel;
public void setName(String name)
{
this.name = name;
}
public StringgetName()
{
return this.name;
}
}
继承
继承概述
继承描述的是一种类间关系
通过继承可以减少模型内部结构的重复描述,加强代码的复用性
继承语法结构
class 子类名称 extends 父类名称{
}
继承作用
子类可以继承父类所有的成员
成员变量
成员方法
子类可以添加父类没有的成员
子类可以对父类中已有的成员变量进行重定义
子类可以对父类中已有的成员方法进行重定义
重写
重写是指子类对父类中已有的实例方法进行重定义,称子类对父类的指定方法进行重写
重写只发生在继承关系中,重写描述的是子类方法对父类方法的关系
重写时子类重写方法控制权限必须大于父类的访问控制权限
重写误区
静态方法的覆盖称为子类隐藏了父类的静态方法,而不是重写了父类方法
父类的私有方法,子类是无法继承的,因此父类私有方法不能被重写
javap指令
实例方法在重写时不能添加static修饰符,静态方法被重新定义时不能定义为非静态的方法
重写的应用
装饰模式
super
子类对父类的某些实例方法进行覆盖后,在子类中将无法直接调用父类被覆盖的方法,可以通过super关键字,对父类的成员进行引用
super.父类成员变量
super.父类成员方法
最终方法
如果父类中的方法不允许被它的子类重写,可以将其声明为最终方法,表示该方法不允许被覆盖
final修饰符可以将一个方法定义为最终方法
最终方法不允许被重写
最终类
final 对类进行final修饰符的添加,表明该类是一个最终类,不允许被继承
final总结
修饰变量 最终变量 不允许修改值
修饰方法 最终方法 不允许被重写
修饰类 最终类,不允许被继承
继承中的构造方法
创建子类对象时,首先要创建父类的对象,默认子类对象构造方法第一句会对父类对象的构造方法进行调用
当子类的构造方法没有显式的调用父类构造时系统会为每一个子类的构造方法第一行添加默认的super();来调用父类的构造方法,如果在子类的构造方法中声明了调用父类构造方法,则系统将不再为子类构造方法生成对父类构造方法的默认调用语句
继承的基础
创建继承关系时,首先要确认所继承的父类是否存在可以访问的构造方法,如果父类不存在可以访问的构造方法,那么继承也将无法实现
继承关系内存结构
在创建子类对象之前,一定会先创建一个父类的对象,该父类的对象存在于子类对象之内,伴随着子类对象的消失而消失,此对象通过super关键字可以查找到其内存所在位置
继承中的对象关系
子类继承自父类,子类将具有父类的形态,可以说子类也是父类的对象,可以使用关键字instanceof来判定某个对象是不是某种类类型