目录
构造对象
-
要想使用对象,必须先创建对象,并指定其初始状态,然后对对象应用方法
-
在Java中,使用构造器(或者构造函数)构造新实例,构造器是一种特殊方法,用来构造并初始化对象
//学生类 public class Student { }
-
构造器的名字应该与类名相同,因此Student类的构造器名为Student。想要构造一个Student对象,需要在构造器前面加new操作符
new Student();
-
这个表达式构造了一个新对象
-
-
像这样构造的对象只能使用一次,我们希望构造的对象可以使用多次,因此需要将对象放在一个变量中
Student Mike = new Student();
-
对象变量Mike,它引用了新构造的对象
-
-
对象变量和对象的区别
Student Mary;
-
这里定义了一个对象变量Mary。它可以引用Student类型的对象。但一定要认识到:变量Mary不是一个对象,而实际上它也没有引用任何对象,因此还不能在这个变量上引用Student类的方法
-
必须先初始化对象变量Mary,才能调用类的方法这里有两个选择:
-
让其引用一个新构造的对象
Mary=new Student();
-
让其引用一个已有的对象
Mary=Mike;
-
-
-
注意:
-
对象变量并没有实际包含一个变量,他只是引用一个对象
-
任何对象变量的值都是对存储在另外一个地方的某个对象的引用
Student Mike=new Student();
-
这里有两个部分,表达式 new Student()构造了一个Student类型的对象,它的值是对新创建的对象的引用。这个引用存储在变量Mike中
-
-
用var声明局部变量
-
在Java10中如果可以从变量的初始值推导出它们的类型,那么可以用var关键字声明局部变量,而无需指定类型
//例子 Teacher zhangsan=new Teacher(); //可以转化为以下代码 var zhangsan=new Teacher();
-
不要对数值类型(int,long,double等)使用var关键字
-
注意var关键字只能用于方法中的局部变量。参数和字段的类型必须声明
重载
-
什么是方法的重载?
-
如果多个方法有相同的名字,不同的参数,便出现了重载
-
编译器必须挑选出具体调用哪个方法,它用各个方法首部中的参数类型与特定的方法调用中所使用的值类型来进行匹配
//方法一 public a(){ } //方法二 public a(String name){ }
-
Java允许重载任何方法,而不只是构造器方法,因此完整的描述一个方法需要指定方法名和参数类型
-
默认字段初始化
-
如果在构造器中没有显式的为字段设置初始值,那么就会被自动的设置初始值
-
数值被默认为0
-
布尔值被认为是false
-
对象引用被认为是null
注意:这里的name实际上是String类的一个实例,属于对象引用
-
无参数的构造器
-
很多类都包含一个无参数的构造器在Java文件中无法查看,需要在class文件中查看,由无参构造器构造对象时,对象的状态会被设置为适当的默认值
-
注意:仅当类没有任何其他构造器时,才会得到一个默认的构造器,在编写程序时,如果自己写了一个构造器,若还想使用默认构造器,就必须显式化定义构造器
//有其他构造器,需要显式定义默认构造器 public a(){ } public a(String name){ }
显示字段初始化
-
如果需要将某一实例字段都定义为某一个确切的值,就需要显示字段初始化(就是在定义类的实例字段时直接赋值)
//定义一个类 public class Teacher{ //定义实例字段 String Work="teach Student";//这里将老师的工作直接定义为教学生 }
-
初始值不一定是常量值,可以利用初始化方法初始化一个字段
-
顺序调用对象后实现了id的自增
-
参数名
-
参数名做到见名知意
public Teacher(String name,int age,int id){ }
构造器调用另一个构造器
-
如果构造器的第一个语句,形如this(....),这个构造器将调用同一个类的另外一个构造器
-
采用这种this关键字非常有用,这样对公共的构造器代码只需要编写一次就行了
初始化块
-
两种初始化数据字段的方法
-
在构造器中设置值
-
在声明中赋值
-
-
实际上,Java还有第三种机制,称为初始化块,在一个类的声明中。可以包含多个代码块,只要构造这个类的对象,这些块就会被执行
class Teacher{ int age; String name; String work; private static int nextId; int TeacherId; //初始化块 { TeacherId=nextId; nextId++; } }
-
无论使用哪个构造器构造对象,TeacherId都会在对象初始化块中初始化,首先运行的时初始化块,然后才运行构造器的主体部分,通常这种方法不常见,会直接将初始化块中的内容放进构造器里面
-
静态代码块:
static{ ....; }
-
在实例化类后,先调用的时静态代码块,再调用代码块,最后调用构造器
-
静态代码块值被执行一次
-
调用静态包
import static java.lang.Math.PI;
-
-
-
调用构造器的具体处理步骤:
1.如果构造器的第一行调用了另一个构造器,则基于所提供的参数执行第二个构造器
2.否则
-
所有数据字段初始化为其默认值(0,false,null)
-
按照在类声明中出现的顺序,执行所有字段初始化方法和初始化块
3.执行构造器主体代码
-
参考书籍:Java核心技术 卷1(原书第11版)