class people{
//代表一个类:具有属性和行为
String name=“lisi”;
int age=10;//称为实例变量或者成员变量
//称为成员变量或者成员方法
void eat(){
System.out.println(“吃饭”)
}
}
这是一个类,但是并没有实现,即没有占内存,不占空间;从类里面抽象出来的东西,是对象,对象占一定的内存。
由类变成对象的过程称为实例化。实例化的方法:People p=new People; p是引用数据类型,即p是引用变量占据四个字节;引用数据类型一直占据的都是四个字节
new出来的p是一个people类,那么p在堆上面所占据的字节数?
已知:short占据2个字节,int占据4个字节,long占据8个字节
对象大小:头(8个字节)+实例变量大小字节数+内存填充(为了凑齐8的倍数)
-
定义一个空类时显示该类占据8个字节//每个对象都有一个头,头占据了8个字节
-
在该类中定义一个整形变量(即一个属性)占16个字节//按道理一个整形变量占据4个字节,加上对象头应该是12个字节。但是其中涉及内存对齐问题,规定字节数必须是8的倍数(以8个字节为单位),现在不是8的倍数,所以进行字节填充,补上4个字节,变成16个字节。
-
定义两个整形变量(两个属性)占据16个字节
-
定义三个整形变量(三个属性)占据24个字节
-
定义三个整形变量(三个属性)并在该类中增加eat方法,在eat方法中定义一些整形变量,即void eat(){ int a=10,
intb=10; int c=10;} 依旧占据24个字节
//表明类中的函数不在堆中开辟内存,函数在栈中开辟内存。
java不能使用一个未经定义的变量:int a=10;可以 int b;不可以,只是进行了声明;如果使用b,那么b未赋初值,默认为0;引用数据类型的默认值全部为空,null。
如何访问成员变量或者成员方法?
People p=new People();
通过new出来的这个对象p 点出来,即p.后面会出现类中含括的变量和方法。通过对象调用变量和方法。
提问:People p=new People();这个()的作用?
class People{
String name=“lisi”;
int age=10;
void eat(){
System.out.println(“吃饭”)
}
}
这种情况下,People这个类中名字就固定成了lisi,年龄变成了10,不活便。作为一个类,往后运用时,不可能所有人的名字都是lisi、,年龄都为10;
但是如果,不给年龄和姓名赋值的话,只是单单进行声明,系统默认赋值为0和null;
所以定义一个函数专门给类中的属性赋值。通过new出的people对象p调用函数init,即p.init(写要赋的值),传入参数,每次新new一个people,可赋一次值
class People{
String name;
int age;
void init(String a,int b){
name=a;
age=b//赋值
}
void eat(){
System.out.println(“吃饭”)
}
}
但是,每个人定义的初始化函数名称不一样,所以为了规范,不定义函数名字(在这里是 void init),定义一个构造方法,专门初始化实例变量(为了统一,规定构造方法的名字和类名一样,这里类名为People,构造方法名称也为People,无返回值,省去void。即 People(){} 。所以在问题中的这个People p=new people();调用的是这个构造方法 )
因此,题目中这个()的作用是调用当前People类中的无参的构造方法/构造器。(也可有参,但是如果构造方法有参数,题目中的()里面什么也没有,参数不能匹配,这时候需要在()里加入要写入的参数)
class People{
String name;
int age;
People(String name,int age){
name=name;
age=age;//这个时候出现赋值混乱,无法判断是传进来的name,还是实例变量的name。这个时候引入this关键字,代表当前对象,纠正为this.name=name;this.age=age;
}
void eat(){
System.out.println(“吃饭”)
}
}
p.eat();//实际上eat§;把p传进去了,然后People类中的 void eat()函数,实际上void eat(this)接受传进来的p;
私有private:只有当前类可以调用私有函数,离开这个类,其他都不可以调用。同理,定义私有属性 private String name;一旦初始化,离开这个类都不能修改name,外部也不能访问。
但是某些时候需要访问名称但是不能修改
所以这个时候可在People类中定义一个公有函数 public String getName(){return name;}在外部函数中只需要调用p.getName函数就可以顺利访问。
相同包路径下类可以互相访问,不同包路径下,要想访问其他类,要通过引用,快捷键alt+Enter。