/*
* 三、面向对象的两个要素:
* 类:对一类事物的描述,是抽象的、概念上的定义
* 对象:是实际存在的该类事物的每个个体,因而也称为实 例(instance)。
* 可以理解为:类= 抽象概念的人;对象= 实实在在的某个人
* 面向对象程序设计的重点是类的设计;
* 设计类,其实就是设计类的成员。
*/
1、类与对象的创建以及使用
/*
* 一、设计类、其实就是设计类的成员
* Field = 属性 = 成员变量 = 域、字段
* Method = (成员)方法 = 函数
*
* 创建类 = 类的实例化 = 实例化类
*
* 二.类和对象的使用(面向对象思想落地的实现)
* 1.创建类,设计类的成员
* 2.创建类的对象
* 3.通过“对象.属性”或“对象.方法”调用对象的结构
* 三、如果创建类一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非 static 的)
* 意味着:如果我们修改一个对象的属性 a,则不影响另外一个对象属性 a 的值。
*/
//测试类
public class PersonTest {
public static void main(String[] args) {
//2.创建 Person 类的对象
//创建对象语法:类名对象名= new 类名();
Person p1 = new Person();
//Scanner scan = new Scanner(System.in);
//调用类的结构:属性、方法
//调用属性:“对象.属性”
p1.name = "Tom";
p1.age = 25;
p1.isMale = true;
System.out.println(p1.name);
//调用方法:“对象.方法”
p1.eat();
p1.sleep();
p1.talk("chinese");
//**********************
Person p2 = new Person();
System.out.println(p2.name); //null
System.out.println(p2.isMale);
//**********************
//将 p1 变量保存的对象地址值赋给 p3,导致 p1 和 p3 指向了堆空间中的一个对象实体。
Person p3 = p1;
System.out.println(p3.name);
p3.age = 10;
System.out.println(p1.age); //10
}
}
/*
* 类的语法格式:
* 修饰符 class 类名{
* 属性声明;
* 方法声明;
* }
* 说明:修饰符 public:类可以被任意访问类的正文要用{ }括起来
*/
//1.创建类,设计类的成员
class Person{
//属性:对应类中的成员变量
String name;
int age;
boolean isMale;
//方法:对应类中的成员方法
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public void talk(String language){
System.out.println("人可以说话,使用的是:" + language);
}
}
2、对象的创建和使用:内存解析
- 堆(Heap),此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在 Java 虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
- 通常所说的栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不等同于对象本身,是对象在堆内存的首地址)。方法执行完,自动释放。
- 方法区(MethodArea),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
Person p1= newPerson();
p1.name = "Tom";
p1.isMale = true;
Person p2 = new Person();
sysout(p2.name);//null
Person p3 = p1;
p3.age = 10;
Person p1= newPerson();
p1.name = "胡利民";
p1.age = 23;
Person p2 = new Person();
p2.age = 10;
3、类的成员之一:属性
属性(成员变量) vs 局部变量
相同点:
- 定义变量的格式: 数据类型 变量名 = 变量值
- 先声明,后使用
变量都有其对应的作用域
<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:形参,也是局部变量
System.out.println("我们使用" + language + "进行交流。");
}
public void eat(){
String food = "石头饼"; //石头饼:局部变量
System.out.println("北方人喜欢吃:" + food);
} } ```