Java08--构造方法+构造代码块和局部代码块+this
1 构造方法
1.1 概念
构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的创建或者对象的初始化。当类实例化一个对象时会自动调用构造方法。
构造方法和其他方法一样也可以重载。
1.2 形式
可以无参也可以有参
修饰符 类名(【参数】){
代码……
}
1.3 练习1:构造方法创建对象
创建对象时的两种方法
package day006;
public class Test2_构造方法 {
String name;
//当存在一个含参的构造方法时,无参构造将不再自动生成...
//public Test2_构造方法(){}
//含参构造
public Test2_构造方法(String n){
name=n;
}
void eat(){
System.out.println("Test2_构造方法.eat()");
}
}
class tt{
public static void main(String[] args) {
//注释掉无参的构造也可以运行,说明系统会自动提供一个无参的构造方法
Test2_构造方法 t2 = new Test2_构造方法();
t2.eat();
//t是引用变量,引用的是对象的地址值。
//根据地址值找到对象,并获取对象的数据
Test2_构造方法 t = new Test2_构造方法("张三");
System.out.println(t.name);
}
}
1.4 练习2:构造方法赋值
package day006;
public class Test3_成员变量赋值 {
String name;
int age;
//赋值方式1:通过含参构造方法赋值
public Test3_成员变量赋值(String name,int age){
this.name=name;
this.age=age;
}
//赋值方式2:通过setXxx()方法赋值
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
}
class Test3Demo{
public static void main(String[] args) {
//赋值方式1:通过无参构造方法赋值
Test3_成员变量赋值 t1= new Test3_成员变量赋值();
System.out.println(t1.name);
System.out.println(t1.age);
//赋值方式1.1:通过含参构造方法赋值
Test3_成员变量赋值 t2= new Test3_成员变量赋值("zhangsan",30);
System.out.println(t2.name);
System.out.println(t2.age);
//赋值方式2:通过setXxx()方法赋值
Test3_成员变量赋值 t3= new Test3_成员变量赋值();
t3.setName("rose");
t3.setAge(25);
System.out.println(t3.name);
System.out.println(t3.age);
}
}
2 构造代码块和局部代码块
2.1 构造代码块
1、 在类的内部,方法外部,的代码块。
2、 通常用于抽取构造方法中的共性代码。
3、 每次调用构造方法前都会调用构造代码块
4、 优先于构造方法加载
class c{
String country;
{
country="中国";
}
public c() {
System.out.println("1号选手,来自"+country);
}
public c(int a) {
System.out.println("2号选手,也来自"+country);
}
}
2.2 局部代码块
1、 在方法里面的代码块
2、 通常用于控制变量的作用范围,出了括号就失效
3、 变量的范围越小越好,成员变量会有线程安全问题
4、 总结:执行顺序:
构造代码块是最优先的,局部代码块顺序执行
2.3 练习1:代码块加载顺序
package day99999;
public class TT {
public static void main(String[] args) {
Student s = new Student();
s.init();
}
}
class Student{
{
System.out.println("构造代码块1");
}
public void init(){
{
System.out.println("局部代码块");
}
}
{
System.out.println("构造代码块2");
}
}
3 this 关键字
3.1 概念
this代表本类对象的一个引用对象。
构造函数中,this()必须放在第一行。
3.2 形式
//name=name;
//age=age;
其实是想把Student类的局部变量name的值赋值给成员变量,相当于你想操作是这样的:
//Student.name=name;
但是你不能直接写类名,这时候就用代表本类的对象this来完成。代码变成了:
this.name=name;
3.3 练习1:当变量名相同时
当局部变量和成员变量同名时,用于区分。
如果附近有同名变量,会遵从变量的就近原则,那么怎么调用成员变量呢?
package day99999;
public class T {
public static void main(String[] args) {
Animal a = new Animal();
a.run("大黄");
System.out.println(a.name);
}
}
class Animal{
String name;
/*
//当局部变量的名字和成员变量不一样时简单,拿着局部变量的值直接给成员变量赋值就行了
public void run(String n){
name=n;
}*/
//问题来了,当局部变量和成员变量同名时呢??
public void run(String name){
//name=name;//变量的就近使用原则,这样用的都是最近的也就是一直在用局部变量的
this.name=name;//this调用成员变量
}
}
3.4 练习2:构造方法间的调用
package day99999;
public class T {
public static void main(String[] args) {
Animal a = new Animal();
// Animal a2 = new Animal("旺财");
}
}
class Animal{
public Animal(){
this("来福");//调用本类中的含参构造
System.out.println(name);
}
public Animal(String name){
System.out.println(name);
}
}