JavaSE基础知识(5)—面向对象(5.1类和对象概念、创建及内存分配)

一、类和对象的相关概念

1、面向对象和面向过程的理解

面向对象和面向过程都属于解决问题的思考方式。
面向过程:以执行者的角度思考问题,侧重于“怎么做”,比较适合解决小型项目
面向对象:以指挥者的角度思考问题,侧重于“谁来做”,比较适合解决中大型项目
面向对象和面向过程不能分割开来,二者相辅相成,缺一不可!
宏观上通过面向对象思考,微观上通过面向过程思考!

2、类和对象的概念、关系、区别

(1)概念

对象:客观世界中所有可以被描述的事物都称为对象(万物皆对象)。
类:具有相同属性和方法的一组对象的集合称为类

(2)关系

对象:通过类创建出来的具体的实例
类:属于对象所属的类型

(3)区别

对象:具体的、实际存在的
类:抽象的、模板性质的

3、如何区分开每一个对象?

通过对象的特征(属性和方法)

属性:
  对象的外观特征
  比如:姓名、年龄、颜色、价格等
方法:
  对象的行为特征或功能
  比如:能装水、吃、喝、能计算

二、类和对象的创建和使用★

1、类的创建

步骤:
  ①通过class关键字定义
  ②编写属性(外观特征)
  ③编写方法(行为功能)
  示例:
    [public] class 类名{
      String name;//属性
      int age;//属性
      public void show(){//方法
      }
    }

2、对象的创建

步骤:
  ①创建对象
    类型 对象名 = new 类型();
  ②使用对象
    为对象的属性赋值
      对象名.属性 = 值;
      System.out.println(对象名.属性);
    调用对象的方法
      对象名.方法();

注意:
  ①不同对象是独立的,他们的属性值互不影响,其中一个更改,不影响另外的对象
  ②对象的属性可以不用赋值,有默认值

int——0
double——0.0
char——\u0000
boolean——false
引用类型——null

3、基本类型与引用类型比较  

  使用步骤 称呼 存储位置 访问方式
基本类型 int i = 100; 变量名和变量值 直接访问i即可
引用类型
Student s = new Student();

s.name="xiaoming"


变量名—>对象名或引用名

变量值—>对象


对象名存在栈

值存在对

一般访问s的属性,如s.name

三、类和对象的内存分配★

1、类仅加载一次★

每次创建对象,都需要先判断类是否已经加载过,如果已经加载过,则不需要再次加载;如果没有加载过,则需要通过类加载器将字节码文件加载到方法区中;
然后在堆中创建对象

2、存储★

栈中存储的是对象的引用(对象名)和局部变量
堆中存的是对象和对象的属性
方法区存的是类的结构信息

3、不同对象是独立的,互不影响

【补充】内存分配图

原文地址:https://www.cnblogs.com/truthseeking/p/9507838.html

时间: 2024-10-09 02:43:47

JavaSE基础知识(5)—面向对象(5.1类和对象概念、创建及内存分配)的相关文章

JavaSE基础知识(7)—常用类

一.包装类 1.理解 java为八大基本数据类型一一对应提供了引用类型,方便使用里面的属性和方法 2.包装类型 byte-->Byteshort-->Shortint-->Integerlong-->Longfloat-->Floatdouble-->Doublechar-->Characterboolean-->Boolean 3.常用方法 (1)Integer/Byte/Short/Long/Float/Double/Boolean 以Integer为例

Java基础知识:面向对象&类图

类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称.在系统中,每个类都具有一定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务.一个类可以有多种职责,设计得好的类一般只有一种职责.在定义类的时候,将类的职责分解成为类的属性和操作(即方法).类的属性即类的数据职责,类的操作即类的行为职责.设计类是面向对象设计中最重要的组成部分,也是最复杂和最耗时的部分. 1.面向对象特性 1)抽象 2)继承 3)封装 4)多态 2.类图: 在软件系统

java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

 *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时候才能消费,仓空则等待. *3.当消费者发现仓储没有产品可消费的时候,会唤醒等待生产者生产. *4.生产者在生产出可以消费的产品的时候,应该通知等待的消费者去消费. 下面先介绍个简单的生产者消费者例子:本例只适用于两个线程,一个线程生产,一个线程负责消费. 生产一个资源,就得消费一个资源. 代码如下: pub

java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)

1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以可以被任意对象调用的方法,定义在Object基类中. wait()方法:对此对象调用wait方法导致本线程放弃对象锁,让线程处于冻结状态,进入等待线程的线程池当中.wait是指已经进入同步锁的线程,让自己暂时让出同步锁,以便使其他正在等待此锁的线程可以进入同步锁并运行,只有其它线程调用notify方

java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数封装的代码操作tickets,同步代码块中的锁我们可以指定.假设我们事先不知道同步函数用的是什么锁:如果在同步代码块中指定的某个锁(测试)和同步函数用的锁相同,就不会出现线程安全问题,如果锁不相同,就会发生线程安全问题. 看下面的代码:t1线程用的同步锁是obj,t2线程在操作同步函数的资源,假设不

java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提

这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提: * 1.必须要有两个以上的线程,才需要同步. * 2.必须是多个线程使用同一个锁. * 3.必须保证同步中只能有一个线程在运行,锁加在哪一块代码 那么我们要思考的地方有:1.知道我们写的哪些是多线程代码 2.明确共享数据 3.明确多线程运行的代码中哪些语句是操作共享数据的.. 4.要确保使用同一个锁. 下面的代码:需求:两个存户分别往银行存钱,每次村100块,分三次存完. class bank{ private int

java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)

上一节售票系统中我们发现,打印出了错票,0,-1,出现了多线程安全问题.我们分析为什么会发生多线程安全问题? 看下面线程的主要代码: @Override public void run() { // TODO Auto-generated method stub while(true){ if(ticket > 0){//当线程0被调起的时候,当执行到这条判断语句的时候,线程1被调起抢了CPU资源,线程0进入冻结状态. try { Thread.sleep(100);//中断当前活跃的线程,或者

java基础知识回顾之java Thread类学习(把)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解

看API文档介绍几个方法:  JDK1.5中提供了多线程的升级解决方案: 特点: 1.将同步synchronized显示的替换成Lock                    2.接口Condition:Condition替代了Object监视器方法(wait.notify.notifyAll),分别替换成了await(),signal() (唤醒一个等待线               程),signalAll() 唤醒多个线程.一个锁可以绑定多个condition对象,可以对应好几组wait,

java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)

死锁:是两个或者两个以上的线程被无限的阻塞,线程之间互相等待所需资源. 线程死锁产生的条件: 当两个线程相互调用Join()方法. 当两个线程使用嵌套的同步代码块的时候,一个线程占用了另一个线程的锁,互相等待阻塞,就有可能产生死锁. 下面看代码: 代码1:死锁的案例 package com.lp.ecjtu.Thread; /* 死锁:常见情景之一:同步的嵌套. */ class Ticket implements Runnable { private int num = 100; Object