由于类和对象这一部分的知识点,比较难,而且涉及的知识点很广、也很杂,在这里,单独作为一个知识点来学习。我会通过不同的视频,不同的资料,根据不同的特点来学这个方面的知识点。
一、理解什么是类和对象。
类是一类对象的模板,它定义了一类对象所以具有的属性和方法。
见下图:结合栈和堆的知识点,user4 存放在栈中,new Class(~)存放在堆中。
面向过程和面向对象:
构造器(构造方法):
一般来说,类的属性也称为成员变量。属性的作用范围是整个类体,在定义成员变量时,如果没有对齐初始化,Java会使用默认的值。例如:o、null(null一般是对象的默认值。)
而怎么在类中对属性,进行初始化呢? 使用构造器!
概念:
创建构造器的一些注意事项:
例如:看第二张图,double x,y;相当于已经创建了两个空间。并且命名为x,y.
比较Getter and Setter方法和构造器方法:
JVM内存分析:
Java虚拟机的内存可以简单的分成三个部分:
虚拟机栈(JVM Stack)、堆heap、方法区method area。
它们的介绍见下图:
程序执行的过程内存分析(重点):
这一节的知识点,将前面学过的知识点都进行了总结。通过下面这个例子,很好的解释了在程序执行过程中,各个部分的内存变化。!
小结:(需要记一下)
同一个类的每个对象都有不同的成员变量来存储空间。
同一个类的每个对象都共享该类的方法。
类中属性(仅考虑实例变量)赋值过程:
这个其实就是初始化和实例化的一点区别。类中属性,称为实例变量,也叫成员变量。
参数传值机制:
分为两种传值。不过,它们的共性是所有的传值都是“值传递”。
不同的地方:
而且,因为引用类型参数进行传参的话,就会导致原来的参数对象 指向一个null空间。这就涉及到了Gc机制。(也就是垃圾回收机制。)
垃圾回收机制:
Java的内存管理,很大程度上,其实就是堆中对象实例的管理。其中包括对象空间的分配和释放。(注意!一定是对象空间的分配!不是初始化,也不是创建。创建是例如有一个Person类。那么创建一个对象就是:Person user。Person本身就已经创建好空间了,user是这个空间的名称。在前面关于变量的理解,那个停车位的例子很好的解释了这个名称。)
面试题:初始化和实例化的区别?
内存泄漏:
以下这三种情况,最可能造成内存泄漏:
其实,后面一种,或者说包括第二种,生命周期过长都有可能造成内存泄漏、尤其是连接未关闭的进程。
static和this:
this的本质是:创建好的对象的地址。(其实就是当前对象的地址。)
this不能用于static方法中。
static声明的成员变量为静态成员 ,也称为类变量。(类变量的生命周期和类相同)
特点:为该类的共用变量,被所有实例共享。
对该类的所有对象来说,static成员变量只有一份,被该类所有对象共享。
它不需要进行实例化,直接用类名调用。
静态方法中不能放非静态的属性和方法。
构造方法用于对象的初始化。
变量:
变量在整体上划分为局部变量(存放在栈中)、成员变量(也称为实例变量,存放在堆中)和静态变量(也称为类变量,存放在栈中)。
包机制:
包机制,解决类重名的问题。包对于类,就相当于文件夹对文件的作用。
使用import可以导入包。当使用import com.util.* 需要注意:使用*的用法会降低编译速度,但不会降低运行速度。
题目:它还可以导入静态属性。Java.lang的包不需要导入就能直接使用。
二、面向对象编程的三大特性
面向对象编程有三大特性:继承、封装、多态。
继承extends:
Java中 类没有多继承,接口有多继承。
子类继承父类,可以得到父类的全部属性和方法(私有的不行)
如果定义的类,没有调用extends,它的父类就是:java.lang.Object。
instanceof运算符:
它是一个布尔类型的二元运算符,左边是对象,右边是类。当左边的对象是右边的类所创建的对象时,返回True。
方法的重写:
就三个要点。记不起来自己去查。这个讲过一遍了。
final关键字:
继承和组合:
通过继承可以方便复用定义好的类的代码,当然,也可以使用组合的方式也能复用代码。
组合,其实就是在一个类中去创建另一个类的对象实例化,在测试类中则添加这个对象。如下图:
小结:组合比较灵活,而继承只有一个父类,但是组合可以有多个属性,并且各有各的优点。OB
封装性:
为什么需要学习封装性?
什么是封装性:
如何实现封装性:
其实就是使用权限修饰符定义。
举例使用封装性:
组合还有一个应用场景,使用在组合的关系里面,比如,创建顾客类、账户类。这两个类是独立的。怎么使得顾客和账户类相互联系。就设计到组合的知识点:
权限修饰符:
当设置类的属性为私有,在测试类中只有通过setter方法才能访问到类的属性。
优先级:private>缺省(默认无修饰符)> protected > public
类:只能使用public、缺省修饰。
类的内部成员:可以使用4种权限修饰。
在JSP里面,体现封装性:
比如连接数据库,POJO类,就称呼为JavaBean。
Object类:
它是所有Java类的根基类。除了构造方法之外的所有属性和方法都被继承。但是,不是所有类都能使用。
toString():
定义在Object类里面,它的返回类型是String类型。返回内容是类名和它的引用地址。不过,在实际应用里面,我们经常重写toString方法。
equals和==:
在对象里面,==表示判断是不是同一个对象。equals判断两个对象 在逻辑上的值是否相同。
区别:“==”用于基本数据类型,equals用于引用数据类型。例如:String,就属于引用数据类型。比较字符串是否相等,用的是equals。