zoukankan      html  css  js  c++  java
  • 初步学习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问好
    ####################
    皮卡丘向小儿问好

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

       

  • 相关阅读:
    iostream、printf/wprintf和中文输出【转】
    java命令行运行错误:ClassNotFoundException【转】
    一致性代码段和非一致性代码段【转】
    Winform disign tips(转)
    WinForm下多层架构的实现(转)
    如何在GPU上产生随机数
    最快速度找到内存泄漏
    给定单链表的头结点,如何快速的找到倒数的第n个节点?
    DX11_基于GPU_GeometryShader的3D精确拾取
    Directx11:基于GPU_GeometryShader的Billboard公告板绘制
  • 原文地址:https://www.cnblogs.com/yyy6/p/8975506.html
Copyright © 2011-2022 走看看