行为:使用方法表示行为。
//类体 class关键字 Person类名(首字母大写,驼峰命名)
class Person{
//属性(成员变量) 变量类型 变量名
String name;
int age;
//类体中,方法外
//行为(成员方法) 方法
void eat(){
System.out.printLn(name+"在吃饭");
}
int getAge(){
return age;
}
}
创建类后,如何创建出这个类的对象呢,如何使用这个对象呢。
创建对象使用 类名 对象名 = new 类名 ();
得到对象的成员变量 对象名.属性名;
调用对象的方法 对象名.方法名;
public static void main(String []args){
Person person = new Person();
//创建对象
person.name = "张三";
person.age = 18;
//对象属性赋值 person的名字为张三年龄为18
pserson.eat();
//对象调用方法 张三吃饭
}
成员属性的默认初始值
从上面Person类可以得知name和age属性成员变量不必直接进行初始化,实际上创建对象时jvm会对对象的属性进行默认初始化,那么我们就来测试下各种类型不同的默认值吧。
/**创建Test测试类,分别对基本类型和引用类型进行测试*/
public class Test {
//基本类型
//整型
byte aByte;
short aShort;
int anInt;
long aLong;
//浮点型
float aFloat;
double aDouble;
//字符型
char aChar;
//布尔型
boolean aBoolean;
//引用类型
//字符串
String aString;
//数组
int [] arr;
}
//创建Test对象,测试默认初始值
成员变量可以不给初始值,是存在默认值的,在创建对象时会对其赋值默认初始化值。
数据类型
默认值
基本数据类型
整型(byte、short、int、long)
0
浮点型(float、double)
0.0
字符型(char)
'\u0000'或 0
布尔型(boolean)
false
引用类型
String、数组、类、接口
null
内存图
使用new Person()创建一个Person对象时,jvm会在堆内存中创建一个Person对象,这时,Person person=new Person(),栈空间中的Person类型的person引用就会指向堆内存中的Person对象的地址。
这时person对象创建出来了,但还没由对person对象进行赋值,这时堆内存中的person对象的两个属性name,age分别为null和0,执行person.name = "张三";和person.age = 18;"张三"和18会分别覆盖掉null和0。这时person对象有值了,这时访问person.name或者person.age就能分别打印出"张三"和18了。对象调用方法时,就会到一个堆方法区的堆栈中了。先进入main()方法压栈,执行person.eat();eat方法就会进入栈中,执行完毕出栈,在执行下一个方法在入栈,直到执行完毕main()方法出栈。
但多个引用指向同一个对象时,实际上就是多个对象的引用指向了堆内存中的同一个内存空间,变量所记录的地址值是相同的。只有在使用new关键字创建了对象,才会在堆内存中开辟一个对象空间。所以只要有一个对象引用拿着地址去修改了对象的值,那么内存中对象的值就改变了,随后的每个引用访问的这个对象的对应值都是修改之后的。
成员变量和局部变量的区别
根据变量在类中的位置不同,我们将变量分为成员变量和局部变量,同样方法的参数也有形参和实参。
public class Car{
//变量在类体中,方法外称为成员变量
String name;
int price;
....
public void run(String name//形参,也属于局部变量){
int price = 10000;
//方法中的变量,被称为局部变量
...
}
}
区别
成员变量
局部变量
在类中的位置
类中方法外
方法中,形参
作用范围
类中
方法中
初始值
默认值
没有默认值,必须先定义赋值才能使用
在内存中的位置
堆内存
栈内存
生命周期
随对象的创建而存在,随着对象的消失而消失
随着方法的调用而存在,随着方法的调用结束而消失
java只有值传递
封装
面向对象的重要特征之一:封装。既然在类中定义成员变量和方法是为了方便使用,那么为什么要设定限定修饰符来修饰变量和方法呢。这是为了不让别的类随意调用和随意破坏对象的数据,所以将数据进行封装起来,细节隐藏起来,那么如何能够访问隐藏起来的数据,将数据的访问和赋值交给方法来实现,使用赋值和访问方法来类的属性进行赋值,这就是封装,为了数据的安全。原则:合理隐藏,合理暴露。实现方法:我们需要将成员变量(属性)隐藏起来,若需要访问某个成员变量,暴露公共方法对其访问。我们可以在赋值的时候对值进行检测,虽然平时不这样做。
public class Student{
private String name;
private int age;
public String getName(){
return this.name;
}
public void SetName(String name){
this.name = name;
}
public int getAge(){
return this.age;
}
public void SetAge(){
this.age = age;
}
}
封装的使用步骤:
1.将成员变量使用private修饰,private修饰的成员变量只能在当前类使用,而不能对别的类使用。
2.使用private将变量封装起来,将访问和赋值方法使用public修饰供别人使用,getter/setter方法具有固定的格式,getter方法将访问该方法的对应成员变量值获取到,所以getter方法具有一个对应成员变量类型的返回值,getter方法的格式是get+属性(首字母大写),setter方法就是将对应类型的值赋值给那个成员变量,所以没有方法值但有参入参数,setter方法的格式set+属性名(首字母大写)。