初步学习JAVA面向对象初步认识及面向对象内存分析图举例说明

  1. 说到面向对象, 一个绕不开的话题,就是面向过程.

  面向过程适合简单、不需要协作的事务。 面向过程 = 分解问题 + 逻辑为先 = 先细节,再整体。

  对比面向过程, 面向对象是模块化的, 当我们思考比较复杂的问题,比如“如何造车?”,就会发现列出1234这样的步骤,是不可能的。那是因为,造车太复杂,需要很多协作才能完成。此时面向对象思想就应运而生了。面向对象 = 多态 + 继承 = 先抽象,后具体.

  借参考资料描述对比:

  面向过程(Procedure Oriented)和面向对象(Object Oriented,OO)都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显的显示出来,出现了面向对象思想并成为目前主流的方式。两者都贯穿于软件分析、设计和开发各个阶段,对应面向对象就分别称为面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)。

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

  2. 面向对象是具有模块化, 也就是类.

  类就是一个模版, 一个集群事物的抽象集合.

  一个车类,所有车的抽象结合体,具体什么类看怎么区分. 车类的实体按照大小级别, 有轿车,面包车,火车,汽车等. 按照牌子分奔驰,奥迪,宝马,沃尔沃等等.

  在java中, 共同抽象的叫类,class.  具体有类产生的实体叫对象. object.

  总结一下:类和对象之间关系: 类是用于描述同一类型的对象的一个抽象概念,类中定义了这一类对象所应具有的共同的属性, 方法等.

  java类和对象例:

package cn.sxt.oop;

public class Test_s {
    int id;
    String name = "pikaqiu";
    double score;

    public static void main(String[] args) {
        System.out.println("面向对象的学习....");
        // 对于类,获取对象
        Test_s stu = new Test_s();
        System.out.println(stu.name);
    }
}

  2. 类的属性和方法

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

  在定义成员变量时,可以对其初始化, 如果不对其初始化, java使用默认值对其初始化.

数据类型 默认值
整型 0
浮点型 0.0
字符型 ‘\u0000‘
布尔型 false
所有引用类型 null

  方法用于定义该类或者该类实例的行为特征和功能是想.  方法是类和对象行为特征对抽象.

  方法很类似于面向过程中对函数.  面向过程中, 函数是最基本单位, 整个程序由一个或者多个函数调用组成.  面向对象中, 整个程序对基本单位是类,方法是从属于类和对象对.

  3. 面向对象对内存分析;

  Java虚拟机对内存可以分为三个区域: 栈stack, 堆heap, 方法区method area.

  栈对特点如下:

  (1). 栈描述对是方法执行对内存模型. 每个方法被调用都会创建一个栈桢(储存局部变量,操作数,方法出口等)

  (2). JVM为每个线程创建一个栈,用于存放该线程执行方法都信息(实际参数,局部变量等)

  (3). 栈属于线程私有, 不能实现线程间都共享

  (4). 栈都存储特性是“先进后出,后进先出”

  (5). 栈是由系统自动分配,速度快.  栈是一个连续都内存空间.

  堆都特点如下:

  (1). 堆用于存储创建好都对象和数组(数组也是对象)

  (2). JVM只有一个堆, 被所有线程共享

  (3). 堆是一个不连续都内存空间,分配灵活,速度慢.

  方法区(又叫静态区)特点如下:

  (1). JVM只有一个方法区,被所有线程共享

  (2). 方法区实际也是堆, 只是用于存储类,常量相关信息

  (3). 用来存放程序中永远是不变或者唯一都内容. (类信息[class对象], 静态变量static,字符串,方法等)

  例子一: Student类说明栈, 堆, 方法区  

package cd.bjtxt.array;

public class Student {
    String name;
    int id;
    int age;
    String gender;
    int weig?ht;
    static int number = 100; //静态常量存储在方法区

    public void study(){
        this.name = "高进";
        System.out.println(name+"正在学习中,请勿打扰...");
    }

    public void sayHello(String sname){
        System.out.println(name+"向"+sname+"问好");
    }

    public static void main(String[] args) {
        /*
         *    s1,s2是类构造等实例对象,它是一个指针,指向对中的一一对应对象
         *    name, id, age是实例对象的属性
         *    study() 和 sayHello()是实例对象的方法
         */
        Student s1 = new Student();
        s1.study();
        s1.sayHello("Tom");

        System.out.println("####################");
        Student s2 = new Student();
        s2.name = "皮卡丘";
        s2.sayHello("小儿");
    }
}

  控制台显示举例一打印结果

高进正在学习中,请勿打扰...
高进向Tom问好
####################3
皮卡丘向小儿问好

  参照举例一画的对应的面向对象内存分析图

 

 举例二, 集合举例一稍微改进, Student 和 Compuent类说明 栈, 堆, 方法区.

public class Student {
    String name;
    int id;
    int age;
    String gender;
    int weight;
    Computer comp; // 每人一台电脑,一个类可以作为属性

    public void study(){
        System.out.println("我们的学生学习都用"+comp.brand+" 电脑的cpu是" +comp.cpu);
    }

    public void sayHello(String sname){
        System.out.println(name+"向"+sname+"问好");
    }

    public static void main(String[] args) {
        Computer c = new Computer();
        c.brand = "联想";
        c.cpu = 920;

        Student s1 = new Student();
        // Student具有Computer这个属性
        s1.comp = c;
        s1.study();
        s1.sayHello("Tom");

        System.out.println("####################");
        Student s2 = new Student();
        s2.name = "皮卡丘";
        s2.sayHello("小儿");
    }
}

class Computer{
    String brand;
    int cpu;
}

  控制台显示举例一打印结果

我们的学生学习都用联想 电脑的cpu是920
null向Tom问好
####################
皮卡丘向小儿问好

   参照举例二画的对应的面向对象内存分析图

   

原文地址:https://www.cnblogs.com/yyy6/p/8975506.html

时间: 2024-10-11 03:32:12

初步学习JAVA面向对象初步认识及面向对象内存分析图举例说明的相关文章

大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)

一,总体概要 1,笔者浅谈 我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭(面向对象式编程因为引入了类.对象.实例等概念,非常贴合人类对于世间万物的认知方式和思考方式.对于复杂的事物,人类是如何去认识.归纳.总结的?面向对象式编程就是在努力回答这个问题,而答案的核心就是两个字:抽象.所以面向对象式编程特别适合处理业务逻辑,因此被广泛应用于目前的软件开发当中.因为我们开发软件就是为了解决问题,面向对象式编程符合人类对于“问题”的认知方式),因为我早

Java深度历险(三) Maven初步学习

这几天接触这个词,很多遍了,只是浅显的体会到它在GXPT中的好处,功能之强大,又通过网络查询了资料进一步的认识学习了,和大家分享. Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 在gxpt中的体现 1. 父子关系 一个多模块项目通过一个父POM 引用一个或多个子模块来定义. a. 在父目录中分别创建子项目 b. 父项目,通过以下配置,将子项目关联: 如下: <span style="font-size:18px;"

好程序员Java学习路线分享JS中的面向对象

好程序员Java学习路线分享JS中的面向对象,在JS中,一般情况下我们都是直接写函数,直接调用,但是发现JS中也有new关键字,那么new关键字作为创建对象的关键字,给我们的感觉就是在JS中可以定义一个类,然后用new创建对象,那么在JS中如何做呢?我们先看如下案例,下面的案例是写一个简单的喷泉效果的. window.onload = function(){ // 创建一个画布对象var canvas = document.createElement("canvas");// 设置大小

java初步学习hello word

java初步学习hello word 发表于 2012-08-16 08:05:12 by 月小升 1.下载 java JDKhttp://www.oracle.com/technetwork/java/javase/downloads/index.html 2.安装 JDK 3.打开命令行 输入 java 按下 Enter 你会看到 Usage: java [-options] class [args...] (to execute a class) or java [-options] -j

Java基础学习第六天——二维数组与面向对象入门

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.02.25 lutianfei none 二维数组 格式1(动态初始化) 格式:数据类型[][] 变量名 = new 数据类型[m][n]; m表示这个二维数组有多少个一维数组 n表示每一个一维数组的元素个数 举例: int[][] arr = new int[3][2]; 定义了一个二维数组arr 这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2] 每个一维数组有2个元素,可以通过arr[m]

201671010116. 2016-2017-2《Java程序设计》初步认识Java

初步认识Java        鉴于自己是一名Java的初学者,对这门课程感到茫然,不知所措.但通过一周的学习,我对Java这门课程有了初步的的认识.Java虽然与C语言有诸多相似的地方,但相似不等于相同.相对于C语言,Java的使用更加广泛灵活,且适用于大型程序设计,而且Java是严格区分大小写的语言,书写时大小写不能混淆.        Java是一种计算机程序语言,可以编写嵌入在Web网页中运行的Java Applet小程序,也可以编写独立运行的Java Application应用程序,它

初步学习C++:C++的基本概念

开始学习C++,先从最基本的概念开始,让自己有一个系统的知识概念. 1.对象: 在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体.对象可以认为是:数据+操作(对象所能完成的操作表示它的动态行为,也成为方法). 2.类: 在面向对象程序设计中,类就是具有相同的数据和相同的操作的一组对象的集合,类是对具有相同数据结构和相同操作的一类对象的描述. 3.消息: 在面向对象程序设计中,一个对象向另一个对象发出的请求被称为"消息".当对象接收到发向它的

LinQ的初步学习与总结

嘿嘿,说起来ORM和LinQ,就感觉离我好遥远的,在学校是没有学习的,所以总感觉学习了LinQ就是大神,现在嘛,终于也体会一点,感觉LinQ只是初步学习,没有太难,当然以后使用在项目中就没有这样的简单啦,下面就全面的总结一下LinQ的其中一部分,LinQ有三部分:LinQ TO Object:LinQ TO SQL ;LinQ TO XML.而在这里我先来总结一下LinQ TO Object的学习吧 一.初步认识LinQ to Object static void Main(string[] a

Java的初步认识

PS:弥补那些错过的时间,弥补那些本是决定做而没有做的事情,当初说好了学习编程要把自己学到的或是理解的写到博客中记录下来,可是由于各种缘由最终是没有实现...经过几番周折决定把那些丢掉的重新捡起来.对于Java的文章已经是大雪纷纷满天飞到处都是,但那毕竟不是属于自己的,只有当自己能说出来,能够表达出来那才算是真正属于自己的,所以决定自己也来扯扯,再次来过并且记录下,弥补那些已经错过的,并且告诫自己不要在找各种借口了,在找各种借口就要被淘汰了...以此时刻提醒自己,激励自己,博客要坚持进行下去.