java基础
补充一下java的基本语法与概念,防止以后敲代码的时候稀里糊涂
一、类(class)、对象(object)、实例(instance)
Student s = new Student();就是用学生类创建了一个学生对象,这个过程叫做对象的实例化。
其中Student为类,s为对象,new Student为实例,s赋值后也就是实例了
类不用多说就是个calss;
对象就是类的个体;
实例就是实现的对象
类:学生;
对象:一群学生;
实例:一个学生;
二、对象的创建过程
Student s;
s = new Student();
s.name = orlion;
s = new Student();
在内存中表示:
三、对象的实例化过程
Step1:在创建类之前检查类是否加载(是否将硬盘中的.calss文件加载到内存中),如果没有就加载这个类,在这个类加载之前要加载父类
java加载时采用懒惰式加载即按需加载:如果第一遇到就加载,只加载一次。通过CLASSPATH指定的路径去寻找类文件(.class)加载后是一个对象,类型是Class。
Step2:在内存堆中分配对象空间。递归分配所有父类和子类属性空间。属性默认自动初始化。
(这里的属性赋值是类属性,例:
class Demo{
a = 1; // 在内存堆中分配对象空间时,a初始化为0,第3步才赋值为1
}
)
Step3:进行属性的赋值
Step4:递归调用父类构造器(默认调用父类无参的构造器)
Step5:调用本类构造器
四、构造方法可以重载
java类中可以写多个参数不一样的构造器,(方法也可以重载)
方法签名 = 方法名+参数类型列表,java中不允许出现相同方法签名的方法
五、==与equals方法的区别
==用来比较两个变量的值是否相等也就是比较变量对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,智能用==。
如果一个变量指向的数据是对象类型的那么这时候就涉及到了两块内存,对象本身占用堆内存,变量占用一块栈内存例Object obj = new Object();
变量obj是一个内存,new Object()是另外一块内存,此时变量所对应的内存中存储的数值就是对象new Object();占用的内存的首地址。如果要比较两个变量是否指向一个对象,即要看这两个变量所对应的内存中所存储的地址值是否相同就用==
equals方法是用来比较两个独立对象的内容是否相同
String a = new String("demo");
String b = new String("demo");
这时a和b指向了两个对象。由于两个对象的内存首地址是不同的所以a和b中所存储的地址值也是不同的,所以a==b为false;由于这两个对象中存储的内容是相同的所以a.equals(b)为true;
实际开发中经常要比较传递进来的字符串是否相等,例:
String input = ...;
input.equals("demo");
如果一个类没有定义equals那么它将继承object类的equals()方法,这个方法是这样的:
boolean equals(Object o){
return this==o;
}
所以如果自己创建的对象需要比较两个实例对象的内容是否相同时就需要自己重写equals方法了。
七、Overload(重载)和Override(重写)
重载是指一个类中可以有多个方法名相同的方法,但这些方法的参数列表不同(参数类型或者是参数个数不同)
重写是子类重写父类方法(方法名和参数列表相同),需要注意子类重写的方法只能抛出比父类方法更少的异常