zoukankan      html  css  js  c++  java
  • 面向对象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年龄值。

    向成为千里马奋斗,为伯乐打call;
  • 相关阅读:
    基本技能训练之线程
    关于UEditor的使用配置(图片上传配置)
    PAT 乙级练习题1002. 写出这个数 (20)
    codeforces 682C Alyona and the Tree DFS
    codeforces 681D Gifts by the List dfs+构造
    codeforces 678E Another Sith Tournament 概率dp
    codeforces 680E Bear and Square Grid 巧妙暴力
    codeforces 678D Iterated Linear Function 矩阵快速幂
    codeforces 679A Bear and Prime 100 交互
    XTUOJ 1248 TC or CF 搜索
  • 原文地址:https://www.cnblogs.com/mhy666/p/9347291.html
Copyright © 2011-2022 走看看