2021年1月24日23点20分 JAVA自学课程笔记2: 代码执行过程中的内存管理: 1.heap(堆区) 由A aa = new A();所new出来的东西 2.stack(栈区) 代码的局部变量 3.data segment(数据区) 存放静态变量、字符串常量 4.code segment(代码区) 存放代码 堆区存放的类(class)A aa1所指向其栈区存放的两个整型变量a、b (class A{int a;int b;}),若也让类A的aa2赋值以aa1,则aa2指向aa1其栈区的两个整型变量a、b。改变aa1的栈区变量,相当于改变aa2的栈区变量。 类的访问控制符: 在一个类的内部,所有的成员是可以互相访问,访问控制符是透明的;访问控制符是针对外部访问而言的。 外部访问包括两种方式: 通过类名访问内部的成员 通过类对象名访问内部成员。 1.默认(无任何修饰符,即default)。 允许外部直接访问。 2.protect 在不同包中不允许互相访问。 3.private 不可以通过外部访问方式访问内部private成员。 若定义一private变量a,则可以通过在a所在的类中构造一个public方法(public void set(int j){a=j;})来在外部改变变量a的值。 4.public 可以通过外部访问方式访问内部public成员。 构造函数: 构造函数在生成(new)一个新类时,该类中的构造函数会被调用。 class A { public A(){ System.out.println("无参构造函数调用"); } public A(int a,int b){ System.out.println("有参构造函数调用"); } } class Test { public static void main(String[] args) { A aa1 = new A(1,2); A aa2 = new A(); } } 运行结果: 有参构造函数调用 无参构造函数调用 构造函数是无返回值的,不需要void来定义。 构造函数的名称应与其所属的类相同。 如果不写构造函数,默认生产一个无参的构造函数(如果已写一个有参构造函数,用无参数外部调用,会报错)。 函数的重载: 功能相似的多个函数,可以在类型,形参个数,访问控制符不同的情况下,使用相同的函数名。(不违反查找冲突的情况下) class A{ public int f(int a, int b){ return (a + b); } } class B extends A{ public int f(double a, int b, int c){ return (int)(a + b + c); } } public class Test1{ public static void main(String[] args){ B bb = new B(); System.out.println(bb.f(1.7, 2, 3)); } } //输出结果:6 在类中定义一变量,该变量为此类的属性。在定义后不附值,外部引用时相当于已初始化(值可以为:0,0L,0.0F,0.0D,u0000(空),False,Null),因为其看作为类的属性。而若是在所引用的类中定义一变量不附值,则看作非初始化局部变量报错。(属性不初始化是零值,局部变量不初始化是垃圾值。) this指针: this == 当前对象 当创造于同一个类A上的两个不同对象aa1和aa2时,原先基础的类定义中的public整型i不被共用,但存在一非static方法public void show()(能打印出i)被aa1和aa2共用,show方法通过隐含的this指针知道目前正在调用该方法的对象。 定义时等同于: public void show(){ System.out.printf("i = %d ",i); } == public void show(A * this){ System.out.printf("i = %d ",(*this).i); } 调用时等同于: aa1.show(); == aa1.show(aa1); 若在一个类A中存在一个公共整型变量i,同时在该类的构造函数中也定义了一个形参i。当想要把构造函数中的i发送到公共变量i中时,可以使用this指针表示当前正在调用的对象aa1,this.i相当于对象aa1中的公共整型变量i。 class A{ public int i = 99; public A(int i){ this.i = i; //this代表目前正在创建的对象 System.out.printf("%d ",i); } public void show(){ System.out.printf("%d ",this.i); } } 通过A aa = new A(2);和aa.show();语句得到输出结果: 2 2