已经工作几年了,java,vue,python,C++各种项目都随叫随到,但除了C++其他都没有系统的学习过。这里仅记录下从头学习java基础的过程,和我认为值得记录的一些点,权当做一个备份和文档。
学习参考书:java核心技术 卷1 第九版。家里正好有这本书很多年了,也就看这个了,不是很推荐,原因:1,太厚,内容虽然详细但也很臃肿。2. 翻译,有些翻译不是很好理解。比如类中的数据,C++叫成员变量,这里翻译成域。
1 类的三种关系:use, has, is
2 封装:数据域私有,即隐藏数据的实现方式,只提供方法去操作。所有的使用者调用即可而不需要关心实现方法的都可以称为封装。
3 java的所有变量都是引用。这里的引用更类似于C++的指针,即每个java变量都是指向了一个内存中的对象(不深究的话可以简单的认为就是堆)。这里引申出来就很好理解java参数传递。java所有的参数都是变量的拷贝,而变量本身并不是对象而是对象的引用。举栗:
class A{
private int b=0;
pubic void setB(int b){ this.b = b;}
}
A isA = new A();
无论是isA,或是传递给fun(A paramA)后的paramA,只要明白改变的是isA,paramA,还是真正的实例E,这个问题就很简单了。(这编辑器图片怎么才能浮动???)
当我们调用isA.setB(1) 或者paramA.setB(2)时,我们调用的都是对象提供的修改器方法,改变了对象内部的属性,而两个变量仍然指向E。这时很明显我们修改的是对象。而当我们使用isA = new A(); 或其他返回A类型的方法时,这时我们改变的是isA,即让isA指向了其他对象。
(鉴于有人说看不懂?,补充下,果然表达是比较难的,我觉得写的很清楚明白,但从其他角度看可能很垃圾?)
所谓的java传参时可变类型/不可变类型,不过是实例对象没有修改方法,他也改不了,给变量付了另一个值罢了。这种说法很容易给人误导,也很难理解和记忆。
例如 String str = “hello world” , str指向一个字符串实例对象。这个对象没有提供修改方法,那想要改变字符串的内容只能让str指向另一个地方,即重新赋值: str = “beautiful world”。
所有的类型,包括不可变类型都可以按照上例A去理解。只不过是实例有没有提供修改方法罢了。
总之,变量是对象的引用,区分好变量与对象实例的关系,弄明白修改的是变量还是实例,这些问题都迎刃而解。
4 public:所有类可见,private:本类可见,protected:本包可见。本类可见和本包可见并不是指对象,同一类的两个对象A和B,A的方法中是可以访问B的private 数据的。
例如:
class A{
private int b=0;
pubic void setB(int b){ this.b = b;}
public boolean equals(A other){ return this.b ==other.b} //可以直接访问同类型other的数据
}
同样的包可见也可以,而且protected是默认的,只要在同一个包下就可以直接访问所有为protected的数据。
5 当类的数据包含可变对象时,最好不要编写可以直接返回该对象引用的方法,这会破环封装,可以使用clone()方法。原因跟上面一样。
6 static 修饰变量->类变量,修饰函数->类函数。static修饰的都属于类本身,而不是类实例。
7 方法的名称和参数构成了方法的签名。我们起名叫重载指的是同名不同参数的方法。但其实对于编译器来说它们就是两个不同的函数。方法名和参数类型构成了方法的唯一标识,跟返回值无关哦。
8 仅当没有提供任何构造器时,编译器才会提供默认的构造器。
9 初始化,在固定逻辑的数据进行初始化时,我们可以默认初始化,例如上面的 private int b=0; 同时也可调用静态方法初始化,例如 private int id = assignId(); private static int assignId(){//操作};
构造函数可以在第一句时使用 this(参数)的方式调用该类的另一个构造函数。
初始化块 :
class A{
private b = 1;
{b = 100;}
}
在构造对象的时候会按照在类声明中出现的顺序,依次执行所有初始化语句和初始化块。其实在这之前会赋值默认值,即上面的b会在初始化A类对象时,先b=0,再b=1,再b=100;
静态初始化块:
同样可以用以下块来初始化类型:
class A{
static{//这会在类加载时 执行,可用于初始化类变量等}
}
10 类路径,在配置java环境时可配置CLASSPATH,也可在运行时用 -classpath 参数指明。运行java程序时,虚拟机会首先查找jre/lib, jre/lib/ext 下的文件和rt.jar等运行时文件,之后查找类路径。如果没有设置类路径,类路径默认包含当前目录,如果设置了类路径却没有包含”.”, “.”代表当前目录,则不会查找当前目录。