Java自学课程笔记2

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\n",i);
            }

            ==
            
            public void show(A * this){
                System.out.printf("i = %d\n",(*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\n",i);
                }

                public void show(){
                    System.out.printf("%d\n",this.i);
                }
            }
        通过A aa = new A(2);和aa.show();语句得到输出结果:
            2
            2

 

posted @ 2021-04-12 14:31  katachip  阅读(56)  评论(0编辑  收藏  举报