Java基础

目录

特点

堆和栈

类的访问控制符

构造函数

函数的重载

this的用法


特点

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用来对构造函数创建变量时进行初始化。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值