private关键字
- 类中不需要对外提供的内容都私有化,包括属性与行为,一般而言,都会将成员变量私有化
- 给成员变量+private是彻底不想给外界,对于内部而言private是没有什么作用的,是不想随意的给外界修改,如果要想访问私有成员变量,则可通过getter和setter。
访问器与修改器
- getter 成员变量访问器 因成员变量被私有化,而只想外界访问不想外界修改
public int get(){
return this.x;
}
- setter 成员变量修改器 无返回值,得传要修改的值
public void set(int x){
this.x=x;
}
成员变量的初始化
对象在堆中创建 其成员变量有默认初始化
默认初始化-显式初始化-针对性初始化
-
默认初始化:初始的状态
-
显式初始化:在成员变量中给赋值
-
针对初始化:对象调用时给成员变量赋值 或者调用构造函数时传参
构造函数
如果一个类里面没有定义任何构造函数,则会有一个隐藏的无参构造函数
权限修饰符 类名(参数列表){
this.参数=参数
return;
}
- 构造函数没有返回值类型。也不需要写返回值。因为其是为构建对象的,对象创建完,函数就执行结束
- 构造函数名称必须和类保持一致
- 一个类中可以有多个构造函数,多个构造函数是以重载的形式存在的
- 构造函数中也是有return语句,用于结束初始化动作
- 构造函数是可以被private修饰的,作用:其他程序无法创建该类的对象
构造函数与成员函数的区别
-
外界调用角度
构造函数只能在创建对象时调用,对象创建完毕之后不能被已创建的对象调用
成员函数只能在对象创建之后调用,可以重复的 -
返回值
构造函数不需要返回值
成员函数可需可不需 -
权限修饰符
构造函数可以用任意权限修饰符
成员函数也可以用任意权限修饰符
构造函数与成员函数的调用
-
构造函数可以调用成员函数
但是这个成员函数一般不会当做对象行为去看待
-
构造函数可以调用构造函数
this(参数列表) 调用当前类中的其他构造函数
构造函数之间不能相互调用会无限递归
this(…)必须在第一句!就是对另一个构造函数的调用必须在第一句,防止值的覆盖 -
成员函数可以调用成员函数
成员函数与成员函数之间通过对象调用
-
成员函数不能调用构造函数
不能 但是可以new
(构造函数可以和成员函数重名!)如果一旦定义出其他的构造函数 则默认的无参构造函数不存在了!
所以建议一般把无参构造函数都写出来
static与final关键字
- static
如果若干个同类对象当中存在相同的属性值的话, 那么这个属性值就可以被抽取出来定义为静态变量。
可直接通过类来调用,比较方便
- final
修饰变量,表示该变量所存储的地址不可改变,但可以更改地址所对应的数据中的值,修饰的变量必须初始化,一旦初始化就不能修改其地址,所以一半而言,不会给成员变量+final。
对象的创建流程
public class Main{
public static void main(String[] args){
Person p=new Person("张三",30);
p.speak();
System.out.println(Person.country):
Person.getCountry();
}
}
class Person{
public static final String country="China"
provate String name;
private int age;
public Person(){
}
public Person(String name,int age){
this.name=name;
this,age=age;
}
public void speak(){
System.out.println(name+":"+age);
}
public static void getCountry(){
System.out.println("Person的国籍是"+country);
}
}
如图所示:
-
javac 编译 Main.java 生成两个字节码文件Main.class Person.class
-
java 运行 Main.class将Main.class和Person.class文件加载进JVM具体加载进了方法区
// 内存分为:
寄存器 :直接与CPU进行数据交互
本地方法区:主要临时存储OS(操作系统)的可执行代码
方法区:主要临池存储App的可执行代码
栈:函数栈 用于运行函数
堆:对象堆 主要存储对象数据 // -
方法区中分为
静态方法区 主要存放静态变量和静态函数
非静态方法区 主要存放,构造函数,成员变量及成员函数 -
java Main
让虚拟机在静态方法区中的Main所属空间里找主函数 -
将主函数加载进栈,开始运行
-
执行主函数中的第一句
在堆内存中开辟空间并分配地址
按照类的描述 创建成员变量并对其进行默认初始化 -
相应的构造函数进栈,从非静态方法区中的相应的类空间里读取相应的构造函数并加载进栈
-
构造函数刚进栈 则进行显式初始化
-
开始执行构造函数中的代码,针对性初始化
-
构造函数执行完毕弹栈,将对象的地址赋予左边
-
在主函数中创建Person类型的p变量空间,空间里存的是该对象的地址
-
p对象调用speak()方法,则从非静态方法区中加载speak()的代码进栈
-
在调用静态成员时,可以直接去静态方法区中找
调用静态函数中的打印变量 局部->静态 与堆无关 因为无对象影响
静态函数有没有this!! 没有this因为无对象 不用去堆里面找去了
调用成员函数中的打印变量时,局部->堆->静态方法区(可以理解为静态方法区有全局变量)