1. /*
  2. * 三、面向对象的两个要素:
  3. * 类:对一类事物的描述,是抽象的、概念上的定义
  4. * 对象:是实际存在的该类事物的每个个体,因而也称为实 例(instance)。
  5. * 可以理解为:类= 抽象概念的人;对象= 实实在在的某个人
  6. * 面向对象程序设计的重点是类的设计;
  7. * 设计类,其实就是设计类的成员。
  8. */

1、类与对象的创建以及使用

  1. /*
  2. * 一、设计类、其实就是设计类的成员
  3. * Field = 属性 = 成员变量 = 域、字段
  4. * Method = (成员)方法 = 函数
  5. *
  6. * 创建类 = 类的实例化 = 实例化类
  7. *
  8. * 二.类和对象的使用(面向对象思想落地的实现)
  9. * 1.创建类,设计类的成员
  10. * 2.创建类的对象
  11. * 3.通过“对象.属性”或“对象.方法”调用对象的结构
  12. * 三、如果创建类一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非 static 的)
  13. * 意味着:如果我们修改一个对象的属性 a,则不影响另外一个对象属性 a 的值。
  14. */
  15. //测试类
  16. public class PersonTest {
  17. public static void main(String[] args) {
  18. //2.创建 Person 类的对象
  19. //创建对象语法:类名对象名= new 类名();
  20. Person p1 = new Person();
  21. //Scanner scan = new Scanner(System.in);
  22. //调用类的结构:属性、方法
  23. //调用属性:“对象.属性”
  24. p1.name = "Tom";
  25. p1.age = 25;
  26. p1.isMale = true;
  27. System.out.println(p1.name);
  28. //调用方法:“对象.方法”
  29. p1.eat();
  30. p1.sleep();
  31. p1.talk("chinese");
  32. //**********************
  33. Person p2 = new Person();
  34. System.out.println(p2.name); //null
  35. System.out.println(p2.isMale);
  36. //**********************
  37. //将 p1 变量保存的对象地址值赋给 p3,导致 p1 和 p3 指向了堆空间中的一个对象实体。
  38. Person p3 = p1;
  39. System.out.println(p3.name);
  40. p3.age = 10;
  41. System.out.println(p1.age); //10
  42. }
  43. }
  44. /*
  45. * 类的语法格式:
  46. * 修饰符 class 类名{
  47. * 属性声明;
  48. * 方法声明;
  49. * }
  50. * 说明:修饰符 public:类可以被任意访问类的正文要用{ }括起来
  51. */
  52. //1.创建类,设计类的成员
  53. class Person{
  54. //属性:对应类中的成员变量
  55. String name;
  56. int age;
  57. boolean isMale;
  58. //方法:对应类中的成员方法
  59. public void eat(){
  60. System.out.println("吃饭");
  61. }
  62. public void sleep(){
  63. System.out.println("睡觉");
  64. }
  65. public void talk(String language){
  66. System.out.println("人可以说话,使用的是:" + language);
  67. }
  68. }

2、对象的创建和使用:内存解析

image.png

  • 堆(Heap),此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在 Java 虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
  • 通常所说的栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不等同于对象本身,是对象在堆内存的首地址)。方法执行完,自动释放。
  • 方法区(MethodArea),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
    1. Person p1= newPerson();
    2. p1.name = "Tom";
    3. p1.isMale = true;
    4. Person p2 = new Person();
    5. sysout(p2.name);//null
    6. Person p3 = p1;
    7. p3.age = 10;
    image.png
    1. Person p1= newPerson();
    2. p1.name = "胡利民";
    3. p1.age = 23;
    4. Person p2 = new Person();
    5. p2.age = 10;
    image.png

    3、类的成员之一:属性

    属性(成员变量) vs 局部变量
  1. 相同点:

    1. 定义变量的格式: 数据类型 变量名 = 变量值
    2. 先声明,后使用
    3. 变量都有其对应的作用域

      1. <br />** 2.不同点:**<br /> **2.1 在类中声明的位置不同**<br /> 属性: 直接定义在类的一对{}内<br /> 局部变量: 声明在方法内、方法形参、构造器形参、构造器内部的变量<br /> <br /> **2.2 关于权限修饰符的不同**<br /> **属性:可以在声明属性时,指明其权限,使用权限修饰符。**<br />** 常用的权限修饰符:private、public、缺省、protected**<br /> **局部变量:不可以使用权限修饰符。**<br /> <br /> **2.3 默认初始化值的情况:**<br /> **属性:类的属性,根据其类型,都有默认初始化值。**<br /> 整型(byte、short、int、long):0<br /> 浮点型(float、double):0.0<br /> 字符型(char):0(或‘\u0000’)<br /> 布尔型(boolean):false<br /> 引用数据类型(类、数组、接口):null<br /> ** 局部变量:没有默认初始化值**<br /> **意味着:在调用局部变量之前,一定要显式赋值。**<br /> 特别地:形参在调用时,赋值即可。例,45 行<br /> **2.4 在内存中加载的位置,亦各不相同。**<br /> 属性:加载到堆空间中(非 static)<br /> 局部变量:加载到栈空间

      ```java public class UserTest { public static void main(String[] args) { User u1 = new User(); System.out.println(u1.name); System.out.println(u1.age); System.out.println(u1.isMale);

      u1.talk(“俄语”); } } class User{ //属性(或成员变量) String name; //不加 private 即为缺省 public int age; //不加 public 即为缺省 boolean isMale;

    public void talk(String language){//language:形参,也是局部变量

    1. System.out.println("我们使用" + language + "进行交流。");

    }

    public void eat(){

    1. String food = "石头饼"; //石头饼:局部变量
    2. System.out.println("北方人喜欢吃:" + food);

    } } ```