Java基础:16 类和对象

不羁的心 提交于 2019-12-20 01:46:16

1、类和对象

类(class)和对象(object)是面向对象方法的核心概念。

类是对一类事物描述,是抽象的、概念上的定义;
对象是实际存在的该类事物的每个个体,因而也称实例(instance)。

  • 面向对象开发(OOA)就是不断的创建对象,使用对象,指挥对象做事情。
  • 面向对象设计(OOD)其实就是在管理和维护对象之间的关系。
  • 面向对象特征:封装(encapsulation)、继承(inheritance)、多态(polymorphis)
  • 面向对象程序设计的重点是类的设计;
    类的设计,其实就是类的成员的设计

2、类

常见的类的成员有:

  • 属 性:对应类中的成员变量

(1)语法格式:

修饰符 数据类型 属性名 = 初始化值 ; 

(2) 修饰符
常用的权限修饰符有:private、缺省、protected、public
其他修饰符:static、final
(3)数据类型 :任何基本数据类型(如int、Boolean) 或 任何引用数据类型。
(4)属性名:属于标识符,符合命名规则和规范即可。
(5)变量的分类:成员变量(方法体外)与局部变量(方法体内)
在这里插入图片描述

  • 行 为:对应类中的成员方法(详见13)

类的定义:

修饰词 class 类名{
     属性声明;
     方法声明;
}

创建Java自定义类步骤:

  1. 定义类(考虑修饰符、类名)
  2. 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
  3. 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)

3、对象

创建对象语法:

 类名 对象名 = new 类名(); 

访问对象成员(包括属性和方法)的方式:

对象名.对象成员

说明:

  • 一个类可以创建N 个对象,成员变量只属于当前的对象(只属于对象,不属于类),只有通过对象才可以访问成员变量,通过类不能直接访问成员变量;
  • 如果创建了一个类的 多个对象,对于类中 定义的属性,每个对 象都拥有各自的一套 副本,且互不干扰。
  • 对象的属性存储在堆内存,栈内存内存储对象在堆内的地址。当遇到创建对象就去方法区的class区查找所需要的对象的class文件,如果找到了 就直接使用,否则就通知类加载器去硬盘将所使用的class文件加载进来。如果累加器在硬盘也没有找,那就报错。
  • 当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。
    在这里插入图片描述

匿名对象:
我们也可以不定义对象的句柄,而直接调用这个对象的方法。这 样的对象叫做匿名对象。 如:

new Person().shout();

使用情况 :如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
我们经常将匿名对象作为实参传递给一个方法调用。

4、类的访问机制

(1)在当前类访问

  • 在当前类中访问成员属性/方法(没有使用static修饰的属性或方法),直接访问

(2)在其他类中访问

  • 在其他类中访问该类的成员,是不能直接访问的
  • 访问方式:
    ① 创建该类对象 new 类名()
    ② 使用该对象来访问该类的成员 对象名.属性名/方法名
    如果成员方法中有参数,需要在调用的使用传入对应类型的实参

5、有关的内存使用

  • 堆(Heap),此内存区域的唯一目的 就是存放对象实例,几乎所有的对象 实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的 对象实例以及数组都要在堆上分配。
  • 栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。 局部变量表存放了编译期可知长度的 各种基本数据类型(boolean、byte、 char 、 short 、 int 、 float 、 long 、 double)、对象引用(reference类型, 它不等同于对象本身,是对象在堆内 存的首地址)。 方法执行完,自动释放。
  • 方法区(Method Area),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

6、例子

public static void main(String[] args) { 
    Person obj = new Person(); //对象
    obj.age = 5; 
    System.out.println("修改之前age = " + obj.age);// 5 
    // x是实参 
    change(obj); 
    System.out.println("修改之后age = " + obj.age);// 3 
} 
public static void change(Person obj) { 
    System.out.println("change:修改之前age = " + obj.age); 
    obj.age = 3; 
    System.out.println("change:修改之后age = " + obj.age); 
} 
//Person类定义为: 
class Person{ 
    int age; 
}

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!