Java面向对象的学习

由于类和对象这一部分的知识点,比较难,而且涉及的知识点很广、也很杂,在这里,单独作为一个知识点来学习。我会通过不同的视频,不同的资料,根据不同的特点来学这个方面的知识点。

一、理解什么是类和对象。

类是一类对象的模板,它定义了一类对象所以具有的属性和方法。

见下图:结合栈和堆的知识点,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。

 手动项目实训:(检验学习力度)

参考博客:

(47条消息) Java—尚硅谷客户信息管理系统【项目二】(熟悉框架、熟悉设计结构!!!!)_尚硅谷客户关系管理系_丿今朝的博客-CSDN博客

参考视频:

92-面向对象(进阶)-项目二:拼电商客户管理系统的演示及代码实现_哔哩哔哩_bilibili

任务目标:

  1. Customer为实体对象,用于封装客户信息
  2. CustomerList为Customer对象的管理模块,内部用数组管理一组Customer对象,并提供相应的添加、修改、删除和遍历的方法,供CustomerView调用
  3. CustomerView为主模块,负责菜单的显示和处理用户操作

 任务UML类图如下:

 

 这些方法的具体作用:

 后面三种就不讲了,很简单,就是和我们属性搭配的返回值。

等这些方法都写完了,我们可以进行单元测试

从第三步实现view视图页面,可以暂时不写。主要实现前面两个,前面两个的方法都讲过,写好前面两个页面就达到检验我们的效果了。 

这个是进入的主界面视图:这个视图所设计的知识点很有意思。可以单独拿出来尝试一下。

涉及了switch语句。选择方法的用途!思路很棒!

遇到的麻烦:

在删除方法里面。虽然想到了 要加一个判断语句,当只有一个元素的时候只进行赋值为null。但是最后就出问题了。最优的方式就是下面这种使用for循环也可以作为一种判定条件。

public boolean delete(int index){
   if(index<0 || index>total){
       return false;
   }
//涉及的思想就是,当只有一个元素时,这个for循环就不运行。(这个用法请牢记!)
//这样,直接运行下面,把这个元素赋值为null。
//删除的操作,有两步:第一步,找到删除的元素。将其指向下一位元素。(如果只有一个元素,这一步就跳)
                   第二步,将下一位元素指向null。并把元素总数减一。
   for(int i=index;i<total;i++){
       customers[i]=customers[i+1];
   }
   customers[total]=null;
   total--;
   return true;
}

猜你喜欢

转载自blog.csdn.net/qq_55928086/article/details/131903758