面向对象基础学习笔记

 理解面向对象: 

       1.面向对象具有三大特征:封装性继承性多态性,面向过程没有继承性和多态性,并且面向过程的封装只是封装功能,而面向对象可以封装数据和功能。所以面向对象优势更明显。

  2.一个经典的比喻:面向对象是盖浇饭、面向过程是蛋炒饭。盖浇饭的好处就是“菜”“饭”分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是“可维护性”比较好,“饭” 和“菜”的耦合度比较低

       3.对象也是一种数据结构(对数据的管理模式),将数据数据的行为放到了一起。在内存上,对象就是一个内存块,存放了相关的数据集合。对象的本质就一种数据的组织方式

  理解类与对象:

       1.对象是具体的事物;类是对对象的抽象。

  2.类可以看成一类对象的模板,对象可以看成该类的一个具体实例

  3.类是用于描述同一类型的对象的一个抽象概念,类中定义了这一类对象所应具有的共同的属性、方法

  如何定义一个类:

      1.每一个源文件必须有且只有一个public class,并且类名和文件名保持一致。一个Java文件可以同时定义多个class

        2.我们需要在类体中定义类的具体信息。对于一个类来说,一般有三种常见的成员:属性field方法method构造器constructor。这三种成员都可以定义零个或多个。

 属性field属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体

                   格式:[修饰符]  属性类型  属性名 = [默认值] 

方法method:方法是类和对象行为特征的抽象。面向对象中,整个程序的基本单位是类方法是从属于类和对象的。

                        格式:[修饰符]  方法返回值类型  方法名(形参列表) {}

                        main方法作为程序执行的入口,必须要有,放在哪个类里都可以。格式为:public static void main(String[] args) { }

构造器constructor:构造器的方法名必须和类名一致,用于创建对象。

                                  格式为:[修饰符] 类名(形参列表){}

  如何定义一个对象:

        可以在main方法中开始定义我们的第一个对象。

        格式为:类名 对象名 = new 类名()

        根据某类(图纸)创建对象(实例)。我们可以在对象后面定义他的属性: 对象名.属性名=xxx,也可以调用类中的方法:对象名.方法名()

        类与类可以嵌套,具体看下面这个例子:

  面向对象的内存分析:

    Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。

栈:JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)

堆:用于存储创建好的对象(包含其地址)。JVM只有一个堆,被所有线程共享。

方法区(静态区):JVM只有一个方法区,被所有线程共享。方法区实际也是堆,用于存储类、常量相关永远不变或唯一的内容

  方法的重载(overload):

  指一个类中可以定义多个方法名相同,但参数不同的方法。 调用时,会根据不同的参数自动匹配对应的方法。

    1.不同的含义:形参类型、形参个数、形参顺序不同

    2.只有返回值不同不构成方法的重载

    3.构造方法也可以重载。

   垃圾回收机制:

任何一种垃圾回收算法一般要做两件基本事情:

  1. 发现无用的对象

  2. 回收无用对象占用的内存空间。

相关算法:1. 引用计数法 2. 引用可达法(根搜索算法)

   通用的分代垃圾回收机制:

我们将对象分为年轻代年老代持久代三种状态。

垃圾回收过程:

    1、新创建的对象,绝大多数都会存储在Eden中。

    2、当Eden满了(达到一定比例)不能创建新对象,则触发垃圾回收(GC),将无用对象清理掉,

           然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区。

    3、当Eden区再次满了,会将S1中的不能清空的对象存到另外一个Survivor中,如S2,

          同时将Eden区中的不能清空的对象,也复制到S1中,保证Eden和S1,均被清空

    4、重复多次(默认15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured)区中。

    5、当Old区满了,则会触发一个一次完整地垃圾回收(FullGC),之前新生代的垃圾回收称为(minorGC)。

  this关键字:

 创建对象分为如下四步:

  1. 分配对象空间,并将对象成员变量初始化为0或空

  2. 执行属性值的显式初始化

  3. 执行构造方法(此时对象已经创建好)

  4. 返回对象的地址给相关的变量

this的本质就是“创建好的对象的地址”。由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。

  static 关键字:

用static声明的成员变量为静态成员变量,也称为类变量。 类变量的生命周期和类相同,在整个应用程序执行期间都有效。

static成员变量只有一份,被该类的所有对象共享。

static修饰的成员变量和方法,从属于类。普通变量和方法从属于对象的。

注意:一般用“类名.类属性/方法”来调用,在static方法中不可直接访问非static的成员。this不能用于static方法中。

   静态初始化块:

静态初始化块,用于类的初始化操作。在类之前运行,不能调用类的普通属性。

  参数传值机制:

方法中所有参数都是“值传递”,也就是“传递的是值的副本”。但是引用类型指的是“对象的地址”。因此,副本和原参数都指向了同一个“地址”,改变“副本指向地址对象的值,也意味着原参数指向对象的值也发生了改变”。

  包(Package):

包:类 = 文件夹:文件

1. 通常是类的第一句非注释性语句。

2. 包名:域名倒着写即可,再加上模块名,便于内部管理类。

JDK中的主要包如下:

其中lang包不需要导入,可以直接使用。而其他的类,需要通过import导入。

同一个包里的类可以直接引用,引用别的包里的类需要在引用时写明包名,或者在程序开头用import导入。写*表示导入该包下的所有类。

如果出现重名的类,则在引用时还是要写明是哪个包的哪个类

静态导入(static import):是在JDK1.5新增加的功能,其作用是用于导入指定类的静态属性,这样我们可以直接使用静态属性。

posted @ 2020-03-10 22:50  菅兮徽音  阅读(179)  评论(0)    收藏  举报