一、对象与类
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传参是值传递,变量那个地址保存的东西才是变量的值。基本类型直接保存值,类类型保存实例引用(这其实算是一个不可见的基本类型,可以理解为实例地址)。
所谓的java传参时可变类型/不可变类型,这种理解和记忆的方式我自己本身是记不住的。但是只要理解传参传递的是变量的值,明白变量真正的值是什么,也就不需要去记忆了。
总之,变量是对象的引用,区分好变量与对象实例的关系,弄明白修改的是变量还是实例,这些问题都迎刃而解。
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包含包可见和子类可见。包可见同上,子类可见时(即子类不在本包中),只能访问子类对应的数据而不能访问父类及其他兄弟类的数据。例:
class A{ protected int b=0; pubic void setB(int b){ this.b = b;} public boolean equals(A other){ return this.b ==other.b;} } |
class Ason extends A{ ..... public boolean equals(A other){ return this.b == other.b; //这里 this.b是可以的,但other.b 是错误的。 Ason与A不在同一包中。 } } |
|
|
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等运行时文件,之后查找类路径。如果没有设置类路径,类路径默认包含当前目录,如果设置了类路径却没有包含".", "."代表当前目录,则不会查找当前目录。