217课程回顾:
一:类和对象
- 类:一类事物统称
- 对象:实例
- 创建类:
public class Person{
//属性
String name;
Int age;
//行为
public void work(){ }
}
- 创建类的对象:
Person p;------声明
P = new Person(); -------实例化
Person p = new Person();
p,name=”zhangsan”;
p.work();
218课程开始:
一. 类的成员之一:属性
-
对象的属性,也称为成员变量,又称为实例变量。
-
对象属性的初始化,即初始赋值,有以下两种方法:
默认初始化赋值:对象被创建时,不同类型的属性首先被赋予不同的缺省值。
显示初始化赋值:如果在类中声明属性时指定了初始值,那么在对象被创建时,相应的属性就被显示地赋予此初始值。 -
语法格式:修饰符 数据类型 属性名 = 初值;
-
String引用类型 初始值为null
-
习题:
class Test(){
String name;
int age;
double money;
int id;
public static void main(String[] args){
Test t = new Test();
t.name = ”zhangsan”;
t.id = 20;
system.out.print(t.name);
system.out.print(t.id);
system.out.print(t.age);
system.out.print(t.money);
}
}
结果为:zhangsan 20 0 0.0
二. 对象
- 对象的产生:
class Person{
int age;//栈(由操作系统自动分配释放,用于存放函数的参考值、局部变量等)
void shout(){
system.out.println(“oh,my god!I am ”+age);
}
}
Person p1 = new Person();//堆(由开发人员分配和释放,若开发人员不释放,程序结束时由OS回收)
- 对象的使用
class TestPerson(){
public static void main(String[] args){
Person p1 =new Person();
Person p2 =new Person();
p1.age=-30;
p1.shout();
p2.shout();
}
}
三. 变量的分类:
- 成员变量(全局变量):实例变量(不以static修饰) ; 类变量(以static修饰);(常量)
- 局部变量:形参(方法签名中定义的变量) ; 方法局部变量(在方法内定义) ; 代码块局部变量(在代码块内定义)
- 注意:两者在初始值方面的异同:
同:都有生命周期。 异:局部变量除形参外,需显示初始化。 - 在方法体外,类体内声明的变量称为成员变量。
在方法体内部声明的变量称为局部变量。
四. 例:
public class Student {
String name; //实例成员变量
int age; //实例成员变量
int id; //实例成员变量
String gender; //实例成员变量
boolean b; //实例成员变量
static double score;//类变量不属于对象属于类
public static void main(String[] args) {
Student s1=new Student();
s1.age=20; //实例成员变量(需要实例化才能访问)
s1.score=100;
System.out.println(s1.score + “ ”+s1.age);//100.0 20
Student s2=new Student();
s1.score=200;
s2.age=30;
System.out.println(s1.score+ “ ”+s1.age);//200.0 20
System.out.println(s2.score+ “ ”+s2.age);//200.0 30
}
} 运行结果: 100.0 20 200.0 20 200.0 30
五. 成员变量(属性)和局部变量的区别
- 成员变量:成员变量定义在类中,在整个类中都可以被访问。
成员变量分为类成员变量和实例成员变量,实例变量存在于对象所在的堆内存中。
成员变量具有默认初始化值。
成员变量的权限修饰符可以根据需要,选择任意一个。
2. 局部变量:局部变量只定义在局部范围内,如:方法内,代码块内等。
局部变量存在于栈内存中。
作用的范围结束,变量空间会自动释放。
局部变量没有默认初始化值,每次必须是显示初始化。
局部变量声明时不指定权限修饰符
六. 面向对象特征之一:封装和隐藏
使用者对类的内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题。
(因该将legs属性保护起来,防止乱用。保护方式:信息隐藏。 问题:xb.legs=-1000;)
public class Animal {
public int legs;
public void eat(){
System.out.println("eating");
}
public void move(){
System.out.println("Moving");
}
}
public class Zoo {
public static void main(String[] args) {
Animal xb = new Animal();
xb.legs=4;
System.out.println(xb.legs);
xb.eat();xb.move();
}
}
信息的封装和隐藏
public class Animal {
private int legs;//将legs定义为private只能被Animal类访问
public int getLegs() {
return legs;
}
public void setLegs(int i) {
if(i!=0&&i!=2&&i!=4){
System.out.println("Wrong number of legs!");
return;
}
legs=i;
}
}
public class Zoo {
public static void main(String[] args) {
Animal xb = new Animal();
xb.setLegs(4);
//xb.legs=-1000; //非法
System.out.println(xb.getLegs());
}
}