我这些学习笔记,记录的都是我自己认为的知识点,可能以后再看的时候还要翻书,但是可以用来定位到准确的书中示例的位置,减少翻书重找的时间,利于自身知识体系的搭建。 self-transcendence
第7章 类和对象
java中类和对象被常提,实质上类可以看作是对象的载体,他定义了对象具有的功能。
面向对象设计实质上就是对现实世界的对象进行建模操作。
7.1.1 对象
对象通常会被划分成两个部分,静态部分和动态部分,静态部分就是“属性”,动态部分就是“行为”。
类实质上就是封装对象属性和行为的载体,而对象则是类抽象出来的一个实例。
7.1.2 类
不能将一个事物描述成一类事物,一只鸟不能称为鸟类。
7.1.3 封装
面向对象程序设计的特点:
封装性、继承性、多态性
封装是面向对象的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。封装的思想保证了类内部数据结构的完整性,应用该类的用户不能轻易地直接操作此数据结构,只能执行类允许公开的数据。这样就避免了外部操作影响内部数据,提高程序的可维护性。
7.1.4 继承
继承关系可以用树形来表示,父类与子类存在一种层次关系,一个类处于继承体系中,他可以是其他类的父类,也可以是其他类的子类。
三角形类是图形类的子类,也是等边三角形的父类
7.1.5 多态
将父类对象应用于子类的特征就是多态。
7.2 类
7.2.1 成员变量
类中的属性,就是成员变量,也就是全局变量。
7.2.2 成员方法
类中的方法,就是成员方法
7.2.3 权限修饰符
java的权限修饰符主要有
private:该成员变量或方法只能在本类中使用,对其他所有包的类都是不可见的
public:所有的包的类都可以使用
protected:只有本包内的该类的子类或其他类可以访问成员变量和方法
权限修饰符控制着对类和类的成员变量以及成员方法的访问。
public和protected修饰的类可以被子类访问,但是如果子类和父类不在一个包中,那么只有public才能被子类访问。如果父类不允许通过继承产生的子类访问它的成员变量,那么就用private声明。
访问包位置 |
类修饰符 |
||
Private |
Protected |
Public |
|
本类 |
可见 |
可见 |
可见 |
同包其他类或子类 |
不可见 |
可见 |
可见 |
其他包的类或子类 |
不可见 |
不可见 |
可见 |
当声明类不用权限修饰符设置类的权限,则这个类预设的包存取范围只有一个包中的类可以调用这个类的成员变量或成员方法。
类的权限设定会约束类成员的权限设定。类如果是private,那方法public也还是private。
7.2.6 this关键字
java规定this关键字用来代表本类对象的引用。
事实上。this引用的就是本类的一个对象,在局部变量或方法参数覆盖了成员变量时,如就要添加this关键字明确引用的是类成员还是局部变量或方法参数。
this除了可以调用成员变量或成员方法,还可以作为方法的返回值。
public Book getBook(){
return this;
}
获得的返回值就是Book。
7.3 类的构造方法
类中除了成员方法,还有一种构造方法。构造方法是跟类同名的方法,对象的创建就是由构造方法完成的。每次类实例化一个对象,类都会自动调用构造方法。
构造方法没有返回值,构造方法要与类同名。
在构造方法中可以为成员变量赋值,这样当实例化一个本类的对象的时候,相应的成员变量也将被初始化。如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认构造方法。(只有类中没有定义任何构造方法的时候,编译器才会自动创建,只要有任一带参构造方法,在调用无参构造方法时就会报错)
7.4 静态变量、常量和方法
被static修饰的变量、常量和方法才被称为静态变量、常量和方法。
静态成员同样遵循public、private、protected修饰符的约束。
静态方法中不能使用this关键字。
静态方法中不能直接调用非静态方法。
局部变量不能声明static。
在执行类时,先执行类的初始化动作,可以使用static定义一个静态区域:
public class example{
static{
}
}
这段代码被执行时,首先执行static快中的程序,并且只会执行一次。
7.5 类的主方法
主方法是类的入口,它定义了程序从何处开始;主方法提供对程序流向的控制,java编译器通过主方法来执行程序。
Public static void main(String[] args){
}
a. 主方法是静态的,只能调用其他的静态方法
b. 主方法没有返回值
c. 主方法的形参是数组,可以使用args.length获取参数个数
7.6 对象
7.6.1 对象的创建
Java中用new操作符调用构造方法创建对象,每实例化一个对象就会自动调用一次构造方法。对象被创建出来,Test test=new Test();test就是对一个对象的引用,引用的对象会在内存中占有存储空间。
7.6.2 访问对象的属性和行为
类number有一个int属性值为0,
创建两个number对象,给number1的int赋值为2,给number2的int赋值为3,分别打印得到number1.int=2,number2.int=3,
如果int是static属性,
那么给number1的int赋值为2,打印number2.int则也会等于2,给number2的int赋值number1打印为number2的int值。
类中的属性,在创建出来的对象中是独立的;但静态属性,在所用创建出来的对象中是通用的。
7.6.3 对象的引用
Java中的一切都可以看做对象,但真正的操作标识符实质上是一个引用。
Book book=new Book();
Book只是存放了new出来的Book的对象的地址,Book对象是存在内存中的。
严格的说,引用和对象是不同的,但是可以将这种区别忽略,简单的说book是Book类的一个对象,事实上应该是book引用了Book类的一个对象的存储地址。
7.6.4 对象的比较
Java中有两种对象的比较方式,==和equals(),这两种方法有着本质的区别:
==比较的是两个引用地址是否相同,equals()比较的是引用的内容是否相同。
7.6.5 对象的销毁
Java有一套完整的垃圾回收机制,当对象的生命周期结束时,分配给该对象的内存地址将会被回收。
什么样的对象会被java虚拟机视为垃圾,主要是以下两种:
a. 对象超过作用范围
b. 对象被赋值为null
但是垃圾回收机制只能回收由new创建的对象,如果不是通过new在内存中获得了一块内存,就不行。所以java中提供了finalize()属于object类,被声明为protected,用户如果在类中定义了finalize()方法,在垃圾回收时首先会调用该方法,在下一次垃圾回收动作发生时,才能真正回收被对象占用的内存。但是如果java虚拟机内存损耗殆尽时,就无法垃圾回收。