Java基础-构造方法、初始化

本文介绍了Java中构造方法的基本概念,包括构造方法的作用、特点、重载以及与初始化的关系。详细讨论了构造方法的权限修饰,如private在单例模式中的应用。还提到了初始化数据域的三种方式:构造器中设置、声明时赋值和初始化块。此外,文章解释了子类继承父类时构造方法的调用规则,以及super和this关键字的区别。
摘要由CSDN通过智能技术生成

构造对象
想使用对象,就必须先构造对象。
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);
		}

	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值