构造对象
想使用对象,就必须先构造对象。
Java中使用构造器构造新的实例。
构造器是一种特殊的方法
so,构造方法也是方法,也可以用public、private进行修饰。
例如:对比
1、可以理解为格式一样,因为构造方法返回的类必定是该构造方法所构造的类,所以省略
2、省略return
3、构造器方法方法名为大写,其他方法为小写
public Thread(String name) {
init(null, null, name, 0);
}
private void init(ThreadGroup g, Runnable target, String name,
long stackSize) {
init(g, target, name, stackSize, null, true);
}
当用private修饰构造方法时
1、用于单例模式
如:
public class Elvs {
private static final Elvs INSTANCE = new Elvs();
private Elvs() {}
public static Elvs getInstance() {return INSTANCE;}
public void sys() {
System.out.println("******");
}
}
2、 通过类的私有构造函数来强调类的不可实例化
例如在实际的应用中,工具类,或者整个工程的常量类,在类中只有静态常量,
构造器的名字应该和类名相同
如果不写构造方法,有默认构造方法吗?构造方法是什么?有参还是无参?
有,
系统提供一个无参构造器。
注意:如果类中显式的编写了一个构造器,那么系统将不再提供无参构造方法
什么是重载?
如果方法具有相同的名称,不同的参数,便产生了重载。
所以,构造器方法可以重载,其他方法也可以重载。
完整的描述一个方法
1、方法名;
2、参数类型;
没有返回类型和private、public修饰符
默认域初始化
如果在构造器中没有显式赋值,那么自动赋值为初始值。
构造器中的this
1、使用this代表所构造的对象
public Employee(String name, double salary){
this.name = name ;
this.salary = salary;
}
2、调用另一个构造器
public Employee(double s){
this("Employee"+nexId,s);
nexId++;
}
初始化数据域的三种方法:
1、在构造器中设置值;
2、在声明中赋值;
3、初始化块
初始化块
位置位于类的属性下面,用{}包起来;
什么时候执行?
构造类的对象时就会执行。
初始化块也可以用static修饰
那么类第一次被加载时将会执行。
子类继承父类时的构造方法相关
new MyThread(runnable, “myThread” + currentPoolSize).start();//会报错
因为, MyThread(runnable, “myThread” + currentPoolSize)是想调用父类Thread的构造方法,但是MyThread没有权限去修改父类的私有属性,所以报错。
所以,要想使用该构造方法,要显式地用super去调用父类构造方法
private void addThread(Runnable runnable) {
new MyThread(runnable, "myThread" + currentPoolSize).start();//
currentPoolSize++;
}
// ??这个thread lambdal 是怎么写的,是和用的构造方法是Thread(runnable)相关吗?
class MyThread extends Thread {
Runnable runnable;
@Override
public void run() {
runnable.run();
try {
Runnable todoRunnable = todoWorks.take();
while (todoRunnable != null) {
runnable.run();
}
System.out.println(this.toString());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public MyThread(Runnable runnable) {
this.runnable = runnable;
}
}
子类继承父类的构造方法后,子类调用自己的构造方法,那么父类的构造方法是否会被调用呢?
理解:
假设不调用,那么在父类中的属性没有被初始化,根本没办法用的吧,所以是调用了。
答案:是先调用最上层的父类构造方法,再调用子类的构造方法。
那么调用的是哪一个父类构造方法呢?无参吗?
例如:使用new MyThread()时,调用父类的哪个构造方法呢?
答案:无参,如果父类没有无参构造器,将会报错
class MyThread extends Thread {
Runnable runnable;
@Override
public void run() {
runnable.run();
try {
Runnable todoRunnable = todoWorks.take();
while (todoRunnable != null) {
runnable.run();
}
System.out.println(this.toString());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public MyThread(Runnable runnable) {
this.runnable = runnable;
}
}
关于super关键字和this关键字的区别
Java核心技术中说到:
有些人认为super和this引用时类似的概念。实际上这样比较不恰当。这是因为super不是一个对象的引用,不能将super赋值给另一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字
例如:
MyThread size = this;
Thread sThread = super;此处会报错
理解:假如Thread sThread = super,那么意味着new一个MyThread类实例对象时,也new了一个Thread对象,那么这样太浪费资源了。。
class MyThread extends Thread {
Runnable runnable;
@Override
public void run() {
if (runnable != null) {
runnable.run();
}
try {
while (true) {
Runnable todoRunnable = todoWorks.take();
todoRunnable.run();
System.out.println(this.toString());
MyThread size = this;
Thread sThread = super;
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public MyThread(Runnable runnable) {
this.runnable = runnable;
}
public MyThread(Runnable runnable2, String name) {
super(runnable2, name);
}
}
本文介绍了Java中构造方法的基本概念,包括构造方法的作用、特点、重载以及与初始化的关系。详细讨论了构造方法的权限修饰,如private在单例模式中的应用。还提到了初始化数据域的三种方式:构造器中设置、声明时赋值和初始化块。此外,文章解释了子类继承父类时构造方法的调用规则,以及super和this关键字的区别。
1909

被折叠的 条评论
为什么被折叠?



