面向对象0---总体概述

第一章、   面向对象和面向过程的区别

一、面向过程和面向过程的区别

(1)首先编程思想(举一个贴近生活的例子)

面向过程:是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程。他是一个人做全部事情;

面向对象:是遇到一件事时,思考“如何把这件事划分成多个小事情,然后每个小事情让某个对象来做,最后一群对象合力能把事。”

 

(2)代码质量来说

A:面向过程的代码缺乏对数据的封装,并且不安全;

B:面向过程的变量是多个完全独立的变量, 并不是一个整体;操作过程让代码变得复杂,不好维护;

例如方法中需要多个参数的时候等,面向过程需要定义多个参数,面向对象只需要定义一个对象就会;

案例:

  1. /** 打印员工信息的方法   */
  2. public static void printEmpInfo(String name,int age,
  3. char gender,double salary) {
  4. System.out.println("--------------------");
  5. System.out.println("姓名: " + name);
  6. System.out.println("年龄:" + age);
  7. System.out.println("性别:" + gender);
  8. System.out.println("薪水:" + salary);
  9. }
  1. ** 打印雇员信息    */
  2. public  static  void  main  (String[ ]  args ){
  3.       //雇员1
  4.       String emp1Name = "黄河大虾";
  5. int emp1Age = 25;
  6.       char emp1Gender = '男';
  7. double emp1Salary = 8000.00;
  8.     
  9.       //打印员工信息

10. printEmpInfo(emp1Name, emp1Age, emp1Gender, emp1Salary);

  1. 11.       
  2. 12.       //修改员工工资(增长20%)并打印
  3. 13.       emp1Salary *= 120.0 / 100.0;

14. printEmpInfo(emp1Name, emp1Age,emp1Gender, emp1Salary);

15. }

二、面向对象在工作中对于一个需求的开发思路

(1)   分析需要的对象:

先按照名词提炼问题领域中的对象

(2)   分析对象的属性和方法

(3)   分析问题流程,通过new对象来,调用对于的属性和方法;

三、相关概念

1抽象数据类型

可以理解为:将不同类型的数

据的集合组成个整体用来描述一种新的事物。

像如上程序中,可以将姓名、年龄、性别、工资这4个不同类型的数据组成一个整体来描述雇员这个新事物。

   

四、类和对象的区别

4.1概念

类是对某一类事物的抽象描述;描述多个对象的共同特征,它是对象的模板

对象用于表示现实中该类的具体事物;

例如:动物是类,毛、狗等是对象;

4.2开发使用

类中可以定义事物的属性和行为;

对象是使用new关键字创建出来,通过对象引用就可以调用该对象具体的属性和功能了。

第二章、基本类型和引用类型作为参数传递

A:基本类型:

作为参数传递时,其实就是将基本类型变量x空间中的值复制了一份传递给调用的方法的变量;

在方法中对于变量的操作,不会影响原来变量的值;

B:引用类型:

当引用变量作为参数传递时,这时其实是将引用变量空间中的内存地址(引用)复制了一份传递给了方法的引用变量。

这时会有两个引用同时指向堆中的同一个对象。不管是哪一个引用改变了引用的所指向的对象的中的值,其他引用再次使用都是改变后的值。

第三章、面向对象三大特征:

一、封装

l       封装概念

n  封装,把对象的属性与方法的实现细节隐藏,仅对外提供一些公共的访问方式

l  封装表现:

n  1、方法:封装的是具体的业务逻辑实现

n  2、类:封装的是对象的属性和行为变量

n  3、变量:使用 private 修饰,这就是变量的封装

n  4、访问控制修饰符:封装的是访问的权限

l  封装的好处:

n  1、提高了代码的复用性。

例如需要某些功能,值需要通过对象调用对于方法就好,而不需要直接写方法的具体算法;

n  2、提高了代码的安全性。

n  隐藏了实现细节,还要对外提供可以访问的方式,便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。

二、继承:

2.1)作用:代码的复用

2.2)父类/基类:共有的属性和行为

子类/派生类:特有的属性和行为

2.3)子继承父之后,子具有:父+子

2.4)传递性、单一继承,多接口实现

三、多态:

1)意义:行为的多态、对象的多态

2)转换向上造型、强制类型转换、instanceof判断

3)多态的表现形式:

重写:根据对象来多态

重载:根据参数来多态

第四章、特殊的操作工具代码

一、This

1、概述

作用:为了解决方法的局部变量和成员变量的混淆;

工作原理:指代当前对象,哪个对象调用方法指的就是哪个对象

2、使用位置

2.1使用在方法体中:

this关键字用在方法体中,用于指代调用该方法的当前对象;为了方便可以省略;

简单的说:哪个对象调用方法,this指的就是哪个对象。严格来讲,在方法中需要通过this关键字指明当前对象

2.2使用在构造方法中

在构造方法中,用来初始化成员变量的参数一般和成员变量取相同的名字,这样会有利于代码的可读性,但此处就必须通过this关键字来区分成员变量和参数了

2.3对于成员变量、方法、构造方法的调用

3使用方式

1)this.成员变量名------------访问成员变量

2)this.方法名()--------------调用方法

3)this()---------------------调用构造方法

4、注意事项

调用其他构造方法的语句必须定义在构造方法的第一行,原因是初始化动作要最先执行

二、supper

1、super:指代当前对象的父类对象

2、super的用法: 1)super.成员变量名----------访问父类的成员变量 2)super.方法名()------------调用父类的方法 3)super()-------------------调用父类的构造方法

三、package:

1)作用:避免类的命名冲突

 2)类的全称: 包名.类名

 3)包名可以有层次结构,同包中的类不能同名 4)建议:包名所有字母都小写

四、import:

1)同包中的类可以直接访问 不同包中的类不能直接访问,若想访问有如下两种方式:

1.1)先import声明类再使用----建议

1.2)类的全称----------------太繁琐,不建议

第五章、对象内存管理

一、背景

1代码的编译运行

在JAVA中,有java程序、虚拟机、操作系统三个层次,其中java程序与虚拟机交互,而虚拟机与操作系统交互。编译好的java字节码文件运行在JVM中。

2存储位置

程序中无论代码还是数据,都需要存储在内存中

3内存分配原理

java程序所需内存均由JVM进行管理分配,开发者只需关心JVM是如何管理内存的,而无需关注某种操作系统是如何管理内存的,这就保证了java程序的平台无关性。

4内存划分

JVM会将申请的内存从逻辑上划分为三个区域:堆、栈、方法区。这三个区域分别用于存储不同的数据。

二、内存分类介绍

1、堆内存

1.1概述

3.1.1概念:JVM在其内存空间开辟了一个称为“堆”的存储空间

1.1.2存储内容

(一)存储使用new关键字所创建的对象

(二)成员变量亦在此分配,并赋初始值(根据类型赋值);

注:是基本数据类型的成员变量

1.1.3生命周期

(一)对象:当一个对象没有任何引用时,该对象被视为废弃的对象,属于被回收的范围;开发中就是将该引用赋值为null;

(二)成员变量:从对象在堆中创建开始到对象从堆中被回收结束

1.2内存问题

1.2.1垃圾回收机制

(一)概念:垃圾回收器(Garbage Collection,GC)是JVM自带的一个线程(自动运行着的程序),用于回收没有任何引用所指向的对象

(二)运行原理:GC线程会从栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的,若GC无法跟踪到某一块堆内存,那么GC就认为这块内存不再使用了,即为可回收的。

(三)应用:java程序员不用担心内存管理,因为垃圾收集器会自动进行管理

1.2.2 Java程序的内存泄露问题

(一)概念:内存泄露是指,不再被使用的内存没有被及时的回收,严重的内存泄露会因过多的内存占用而导致程序的崩溃。在程序中应该尽量避免不必要的内存浪费。

(二)内存泄漏减少:GC线程判断对象是否可以被回收的依据是该对象是否有引用来指向,因此,当确定该对象不再使用时,应该及时的将其引用设置为null,这样,该对象即不再被引用,属于可回收的范围。

1.2.3System.gc()方法

GC的回收对程序员来说是透明的,并不一定一发现有无引用的对象就立即回收。一般情况下,当我们需要GC线程即刻回收无用对象时,可以调用System.gc()方法。此方法用于建议JVM马上调度GC线程回收资源,但具体的实现策略取决于不同的JVM系统。

2、栈内存

1.1概述

1.1概念:JVM在其内存空间开辟一个称为”栈”的存储空间

2. 2存放内容

(一)用于存储程序运行时在方法中声明的所有的局部变量、参数等;

注:

局部变量:方法中声明的变量即为局部变量

变量的值:若变量为基本类型,则在栈中存储的就是该变量的值。若变量为引用类型,则在栈中存储的是堆中对象的地址

2.1.3生命周期

JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧。一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据。

当某一个方法调用完成后,其对应的栈帧将被清除,局部变量即失效。

1、 方法区

5.1概述

5.1.1概念:JVM在其内存空间开辟一个称为”栈”的存储空间

5.1.2原理:先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区。

5.1.3存放内容

(一)类的各种信息(包括类的类型信息、方法、字节码文件等)都在方法区存储

(二)static变量

(三)常量

5.1.4特征

(一)方法只有一份:多个对象会拥有各自在堆中的空间,但所有实例对象是共用在方法区中的一份方法定义的。意味着,方法只有一份

(二)方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。 

五、程序执行流程

class Person {

    private int age;

    public int getAge() {

        return this.age;

    }

    public void setAge(int age) {

        this.age = age;

    }

}

public class PersonDemo {

    public static void main(String[] args) {

        Person p = new Person();

        p.setAge(30);

        System.out.println("大家好,今年我" + p.getAge() + "岁");

    }

}

    下图为程序中内存对象的创建使用过程。

 

图1-1   内存对象创建使用过程

程序执行流程说明:

1、 先执行main方法(压栈),执行其中的 Person p = new Person();

2、 在堆内存中开辟空间,并为其分配内存地址0x1234,紧接着成员变量默认初始化(age = 0);将内存地址0x1234赋值给栈内中的Person p 变量

3、 继续执行p.setAge(30)语句,这时会调用setAge(int age)方法,在栈中给该方法开辟一个内存空间;将30赋值为setAge方法中的“age”变量;执行this.age = age语句,将age变量值30 赋值给成员变量this.age为30;

4、 setAge()方法执行完毕后(弹栈),将该方法的内存空间释放;回到main()方法,执行输出语句System.out.println(),控制台打印p对象中的age年龄值。

猜你喜欢

转载自www.cnblogs.com/mhy666/p/9347291.html
今日推荐