目录
特点
Java取消了C++中复杂的指针、多重继承等操作,增添了安全机制,是纯粹的面向对象编程语言,相比C++复杂度大幅降低。作为混合型语言,由于Java虚拟机的应用,它可以一次编译,处处运行,具有很好的跨平台性,还增加了垃圾回收机制,实现自动管理内存,但这同时也为其带来了局限性,相比C++不适合大型程序的开发。
堆和栈
aa堆内指向了A(A在栈中)的地址,在java中,aa相当于引用了A,不需要加*来改变它的值;而在C语言中,使用aa代表A时,还需要加*。
系统从堆内分配一块内存作为A的一个对象,再将这块内存的地址传给栈中的一块地址(变量名),即实现该变量名aa代表了堆中的内容。引用本身就是一个指针,aa是一个静态变量,A则是被动态分配的,是真正实际的变量内存空间,这里用静态变量代表动态内存空间。
所有new出来的东西都是放在堆区的,是被动态分配的。在C++中,所有堆区分配的内存都需要程序员手动释放,而栈(stack)区的内存系统会自动释放。但是在java中,堆(heap)里分配的系统也会自己回收。堆和栈还有一个重要区别是,在栈中分配的内存,不能跨函数使用,而在堆中分配的内存,可以跨函数使用。
类的访问控制符
public > protect > default > private,在一个类的内部,访问控制符是完全透明的,可以随便调用。访问控制符是针对外部访问而言的。不能通过外部访问方式(通过类名访问/通过类的对象访问)访问类内部的private成员。
构造函数
构造(直译)本意就是生成,在生成一个对象的时候,自动调用该方法。如果没有生成对象的代码,该函数不会执行。可以在构造函数里面对对象中的属性进行初始化,这样,一定义对象,就立马被初始化。(A aa = new A(1, 2),这里的1,2是传递给构造函数赋初值用的)
构造函数的名字必须和类名是一样的,不能有返回值。
如果没有写构造函数,在生成对象时系统会自动生成并调用一个无参构造函数,如果写了,系统就不会默认生成了,还需要自己写无参的。因此,如果写了含参构造函数,并且没有写无参构造函数,那么在生成类的对象时,编译器就会报错。
变量的初始化:Java中,如果局部变量没有被初始化而输出,那么编译器就会报错,但是如果是类的一个属性没有被初始化,将其输出并不会报错。这是因为,Java默认为没有被初始化的属性赋值,这也就是默认的无参构造函数,如果int类型,就赋为0,如果是bool类型,就赋为false,等等。如果定义属性时时对属性赋了初值,构造函数中也对属性赋了初值,那么程序先执行定义中的,然后再执行构造函数中的,所以最终属性的值是构造函数中赋的。
如果构造函数是private,那么在生成对象时编译器会报错,不能new出对象。(分有无参具体讨论)
bb2.i的值是20,因为bb1 = bb2,相当于将bb2所指向的空间赋给了bb1,所以bb1和bb2所指的空间是一样的,因此修改bb1的值就也修改了bb2的值。
函数的重载
函数的名字一样,但是参数不同(参数个数不同或参数类型不同或参数的顺序不同)。如果在C语言中,函数名相同就意味着同一个函数,而在Java中,函数的重载是两个不同的函数,不会报错。
重载定义:同名的函数通过不同的形参做类似的事情。
如果两个函数只有返回值类型不同,其余都相同,编译器会报错,不能构成函数的重载。
启动类的前面要加public,并且类名必须与包名相同。
this的用法
show方法里面的i也可以换成this.i。每个非静态方法中都隐含了一个this指针,指向调用该方法的对象。
这里的this用来对构造函数创建变量时进行初始化。