初步学习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