学习目标
- 面向对象的基本概念(是什么,为什么要用,怎么用)
- 面向对象的主要组成内容(类、对象)
- 类的定义和组成部分(是什么,为什么使用,如何定义)
- 对象(是什么、为什么使用,如何使用对象、对象的引用和this引用)
- 类的成员变量、局部变量
- 类的方法详解
- 类的构造器初始化详解
面向对象程序设计
面向对象是一种程序设计方法。
因为1)它与人类思维方法有好的相似度,主谓宾一目了然 2)一切以对象为中心,只需关心对象能完成哪些工作、具有什么功能 所以面向对象更容易设计程序。
通常我们使用单位 类 来实现面向对象。
- 类是具有某种特征数据的一类事物。如苹果类有名字、甜度、品种等等
- 因为一个类的事物具有它独特的数据和行为,所以采用 类 来区分不同的事物是自然界最常见的方法。(动物类、电子科技类、衣服类、食物类)
- 如何定义类? 类是由构造器、成员变量、方法组等组成
类与对象
对象是 类的实体化的表现,例:这个苹果是 苹果类的 对象,是单一独立存在的,独一无二存在的,客观世界就只存在这个苹果
对象只能通过”引用“来访问它们。就像 要访问老板,先通过秘书预约,通过秘书“引用”才能访问到老板。所以创建好一个对象,都需要一个引用变量来访问。
对象的this 引用代表 this.成员变量 或 this.方法。 只能表示是当前类的实例
(使用this有什么好处?:因为在同一个类中,无需在重复创建新的对象来访问自己的方法和成员变量,造成内存的浪费)
使用场景:1)构造器中引用该构造器初始化的对象 2)在方法中引用该方法的对象
如何创建对象?
1)创建一个引用类型变量 ,如 Object o
2)使用 new 关键字创建对象本身,如 new Object() 注:实际是使用了Object的构造器创建,保存在堆内存里
3)使用 ” = “ 将引用变量指向对象。即 Object o = new Object();
类的成员变量定义
类的成员变量 用于定义该类的实例所包含的属性数据,定义格式为:
【修饰符】 数据类型 变量名 (= 默认值 )
public class Test()
{
public String s;
public int i;
private double d;
private char c;
protected char[] c;
public int[] arrayi;
}
成员变量和局部变量
将变量分为成员变量和局部变量两大类。
成员变量包括(static 声明的)类变量、实例变量(在类之中),无需显示初始化
局部变量有在 形参列表中的变量、方法体内的变量、代码块体内的变量,需要显示初始化,否则会报错。
注:成员变量和局部变量 根据变量的位置 ,其生命周期不同,例:
成员变量的类变量声明需修饰符,随着类销毁而销毁,实例变量随着实例销毁而销毁
局部变量声明无需三大修饰符,随着方法体结束而结束、代码块体结束而结束
成员变量和局部变量的初始化 ,内存中的运行机制
)当系统加载类或创建该类对象时,JAVA系统自动为成员变量分配内存空间(堆区),自动为成员变量指定初始值。
)当局部变量赋初始值时,系统才会为局部变量分配内存(栈区),并将初始值保存到这块内存中。局部变量总是保存在其所在方法的栈内存中
if(局部变量 = 基本数据类型)
{
直接将 值 保存在变量内存中
}
else if(局部变量 = 引用数据类型)
{
通过 地址 引用到 相对应 实际的对象堆区 或数组
}
如何正确使用合适的变量?
原则:变量在内存停留的时间越短,程序运行的性能就越好。
先谈谈差异:
【成员变量适用场景】
)描述某个对象或类的固有信息。(如人的身高、体重等信息),如果再判断自然界固定的事实,如人有两个眼睛,太阳升起方向是东边, 这类事实 应使用 类变量。多变的固有信息使用实例变量即可
)用来保存类或实例一直运行的状态信息。(如红绿灯不断切换的灯色,棋盘棋子一直变化的位置)
)某信息用于类内多个方法的共同使用的信息()
【局部变量使用场景】
)算术数据处理
)待补充
局部变量 通常只存放基本数据类型值或对象的引用,所占内存区较小,而内存停留的时间短,性能越好。
类的方法定义和详解
类的方法 是对类的行为特征的抽象描述,用来表达类或对象的功能。所以方法要么属于类,要么属于对象。,由static 关键字来决定。如果该方法用static 修饰则是类方法,否则就是对象实例的方法 。定义格式为:
【修饰符】 返回类型 方法名 (形参列表)
public class Test{
//通过对象实例访问的方法
public void test(){}
//通过类直接访问的方法
public static void alltest();
}
方法的参数传递:值传递
方法只有一种参数传递方式:值传递。值传递是 将实际参数值的副本 复制传入到方法内,而实际参数 本身并不发生改变。
例如: 像忍者一样,实参 产生了 影分身,这个影分身 在方法体内做过什么都不关本体的事,仅仅是复制品,有本体的数据和实际数值罢了
1)基本数据类型的值传递
输出结果: 9,6
6,9
swap方法传入的是 (6,9)的副本,执行完成后,并不影响其原有的基本数值。
public class Test()
{
public swap(int sa, int sb)
{
int temp = sa;
sa = sb;
sb = temp;
System.out.println("执行swap 方法后的a 的值"+ a +",b 的值为:"+ b);
}
public static void main(String[] a)
{
int a= 6;
int b= 9;
swap(6,9)
System.out.println("执行swap 交换后的 a,b 值为"+ a+","+b);
}
}
2)引用数据类型的值传递
如果一个方法的形参是 引用类型 ,如 public void test(Object o),它的实参传进来是实际把Object 对象的地址值也传进来了,操作的始终是所引用的 对象堆区内的数据
public class TransTest{
public static void swap (DataWrap dw)
{
int tmp = dw.a;
dw.a = dw.b
dw.b = tmp;
System.out.println("swap方法里,a 成员变量值为:"+dw.a +",b 的值为"+dw.b);
}
public static void main(String[] args)
{
DataWrap dwa = new DataWrap();
dwa.a = 6;
dwa.b = 9;
swap(dwa);
System.out.println("交换结束后的a值为:"+ dwa.a +"交换后的b值为:"+dwa.b;
}
class DataWrap{
int a;
int b;
}
}