类名是大驼峰
下面是一个类
类中name和age不要赋值,因为一个类可以创建多个对象。
变量定义在类中函数中的叫局部变量,定义在类中的函数外的叫成员变量。
成员变量的访问需要对象的引用来访问。
实例化:
由类产生一个对象。 person是一个引用变量,new创建出来的才是对象。
所以person 也可以指向空,代表不指向任何对象。
类占内存吗?
代码片段放在方法区,调用类中函数时函数会占内存,我们不用考虑类占不占内存,考虑类中成员进行。
上面的name和age都是普通成员变量。
下面的是静态成员变量。
count是静态成员变量,多个对象有相同的count。
静态成员变量也叫类变量。静态成员变量不是放在堆中,而是被放到方法区的。
方法区:1存储代码的片段。
一个类对应一个字节码文件,字节码文件会被加载到内存中,这个内存是JVM,可以使用类加载器加载字节码文件,加载后,方法区会存字节码文件。类相关的信息,存到方法区中。
静态成员成员变量也存在方法区。
它可以用Person直接访问。
使用静态成员变量也可以不用创建对象。
类中的静态成员变量会报错。
1.static定义的变量,类变量,属于类。
2.eat方法的调用,需要引用进行调用,但是如果可以定义static变量,Person就可以调用。
静态成员函数中定义静态成员变量也不行。因为static是属于类的,这样定义就属于方法了。
普通方法里能调用静态方法。
静态方法内部不能调用普通方法。
static是类变量,不能在函数中定义。
静态函数可以调用静态函数
让一个普通函数属于一个对象后,就能在静态函数中调用了。
main函数为什么是静态的 ?
main函数是不是静态的都行,这个取决于JVM,用static是规定。
引用不一定在栈上。
person是类的成员变量,new Person()在堆上会开辟新的内存,不在test对象里,test对象里只存了person的引用,person的引用不在栈上,在对象上,对象在堆上。
一个变量属于哪里,和是否被final修饰无关,被static修饰的变量在方法区中。
我们打印对象的引用。
结果如下
为什么是这样?我们转到定义看看。
最底层是这样的。
那如果我们在类中使用这个函数返回呢?
结果是这样的。
我们也可以让他自动生成。
这种让对象转变为字符串叫序列化。
字符串转为序列化叫反序列化。
正常被public修饰的成员变量是能被修改的。
而被private修饰后,就被封装了,类外就不能被修改了。
现在只有一个办法在类外获取或者改变name。
封装后,使用时只需要关注外面接口就行了,里面如何实现的使用是不需要关心,这样变得更安全了。
如果这样写是自己给自己赋值。
下面这样才是给成员变量赋值。
如果成员变量较多,外面该怎么大量生成操作这些变量的函数呢?
同样使用生成功能。
方法名和类名相同,切构造方法没有返回值。
一个对象的产生第一步会为对象分配内存,第二步是调用合适的构造方法。
合适意味构造方法不止一个。
之前没写任何构造方法,编译器会默认生成一个不带参数的构造方法。
构造方法之间可以构成重载。
下面这个this代表当前对象是错误的。因为构造方法结束后,对象才产生。
看个使用this的例子。
注意上面这种使用this调用构造函数的方法只能在构造函数中使用。
代码块包括本地代码块,实例代码块,静态代码块,同步代码块等。
我们主要学习实例代码块,静态代码块。
代码块是怎么被调用的?
在类中,代码块是默认最先调用的。
静态代码块只会执行一次。
不实例化对象,静态代码块也能被调用。
如果都是静态 ,那么count值和顺序有关。
如果count没有初始化,那么取代码块中的值。