怎么用c的思路来理解java,写给有c基础且要开始学习java小白。
相信一些从有过c基础的小伙伴,在学java的时候会非常的纠结,想要找指针,但是无论如何都找不到。毕竟c语言的精髓就是指针(pointer)和结构体(structure),你可能会问都已经学java了,为什么一定要找指针呢?一来,因为以前学c语言对指针很熟悉,没有指针感觉什么都做不了,连数组后来多数时候都用指针代替;二来,从一个已经熟悉的点开始逐渐的把知识进行填充,我觉得应该能使我学得更快,更何况在国外,直接看的是英文,本来理解就有难度。
我刚学java在网上找了很多文章,看各位大神秀操作强行在java中使用地址,看得是云里来雾里去,知其型不知其意,硬着头皮到最后终于取得真经:不建议使用云云。正如很多人说的那样java中把指针进行了封装,看不见摸不着了,美其名曰:安全。(并不是贬低java语言,存在即合理,只是本人更喜欢c的大力出奇迹。)java中的private和public在c中实现需要很多工作量
但在java中不难发现c的影子。
就拿我刚开始最头疼的object来举例子吧,中文是对象,因为java里全是object,所以就是面向对象编程。我们经常能看到如下的java class 结构:
class Student{
private String name;
public Student(){}
public String getName(){
return name;
}
public void setName(int name){
this.name = name;
}
}
每次在想要使用object的时候都要调用constructor来生成一个object。这时候就要用:
Student student = new Student();
解释起来就是定义一个student 的variable,类型是Student(这是一个class名)new就是一个给这个variable分配空间的关键字。好比c中的malloc一样:
int *p = (int *)malloc(sizeof(int));
这个大家都懂吧,个p指向的位置分配一个int大小的空间。如果大家直接打印java中的student就会发现这个输出的内容有点像一个地址,和大多数情况下地址的表示0x1234有些出入。当然在c中,分配了空间就一定要记得free(p);
这很关键,在java中就不用这样操心了,但这也是java在大工程中容易造成内存泄露的原因吧。
再来说这个object,其实就很像c中的结构体,c中的结构体对新手不友好,当年我也是花了些功夫的。但java中的object就非常的容易使用。
c中每次想使用什么结构体中的内容都需要
p->name 或 p.name
java中只是用”.”(dot notation)
student.getName(); //因为java中只能调用方法(方法就是c中所说的函数)
当然object直接输出object的名字是可以获得一个地址的,比如我们使用
System.out.println(student);
会得到一个地址如:Student@xxxxxx -------> class名@伪地址
这个地址看起来有点魔幻而且根本就无法进行操作,在java中能查到的东西是hashcode
这东西也不是地址,hashcode
只是方便代码查找数据的一串数字。这段数字的产生跟我们存值有关。所以会出现撞hashcode的情况,java有避免这种情况出现的处理方法,所以一般不用担心。object能够看到上面说的伪地址,int/double/boolean… 这种很基础的数据类型声明的变量地址就不用找了。
在java的class中的属性 String name;
(field)这个就好比C中的全局变量。只要申请的object存在,该object中的name就会一直存在。就跟C中一样定义个全局变量在一般情况下就是懒省事的办法。
但java中定义属性的时候,一般会定义为 private String name;
或 public String name;
涉及到了private
这个说法,就是说除了这个class其他的无法直接调用。而往往一个class都是写在一个单独的文件中的,是不是有种哦的感觉。
当然如果想让说有人都可以随便调用可以把它定义为public
,java中存在一个继承的概念,所以如果只想让直系亲属调用,可以定义为protected
.
搞懂这一点,java就不难了。