构造方法 this关键字 和 代码块

上期回顾

  • static与对象无关,直接通过类名称访问静态变量和静态方法(包含该类的null引用)
  • 局部变量必须赋值后使用,不存在默认值

static -> 和对象无关,表示一个类的属性和方法

  • 1.static属性表示共享变量 的概念,Person country,存在于方法区中,所有该类的对象 共享此变量,直接使用类名称访问

  • 2.static方法表示工具方法,直接通过类名称访问你,与具体的某个对象无关,Arrays.sort;Arrays.copyOf()

  • 3.static不能直接修饰一个外部类 -> 编译出错

  • 静态方法中不能调用非静态方法或属性,但是可以访问静态变量和方法。

  • 成员方法中既可以调用成员变量或方法,也可以调用静态变量和方法

//例题
public class Test {
    private float f= 1.0f;
    int m=12;
    static int n =10;

    public static void main(String[] args) {
        Test t = new Test();
        //System.out.println(this.n);//this是非静态的,静态方法中不能调用非静态方法或属性
        //System.out.println(Test.m);//必须通过对象对象访问   m是非静态的
        System.out.println(Test.n);//n是静态的,可以通过类名访问,和直接访问
        System.out.println(n);
    }
}

private:当前类的内部可见,除了这个类就无法使用

当一个属性被private封装后,外部要想使用必须通过该类提供的getter和setter方法

private不能修饰外部类(外部类需要调用使用,必须公开才可调用)


一、构造方法

构造方法:是类中非常特殊的一类方法,使用关键字new实例化对象时实际上就调用的是该类的构造方法

构造方法的作用是:产生对象

使用关键字new产生一个对象时,大致分两步:

  • 1.为对象在堆中分配空间;

  • 2.调用对象的构造方法为对象成员变量赋值

1. 构造方法语法规则

  • 方法名称与类名称完全相同

  • 构造方法没有返回值声明

  • 一个类中至少存在一个构造方法,如果没有显示定义,编译器会生成一个默认的无参构造。

  • 当类中自定义了构造方法,则默认的无参构造就不再生成

class Person{
    private String name;
    private int age;
    
    public Person(){//此为无参构造  没有返回值声明!!!
        
    }
    public Person(String name){//有参构造
        
    }
}
class Person {
    private String name = "铭哥";
    private int age = 18;
    private String sex = "男";
    public Person() {//成员变量的默认值是在构造方法中赋值的  name = null; age = 0;
    	System.out.println("Person 的无参构造。");
    }
}
  • 1.先在堆上开辟一块空间(大小由该类中成员变量的属性决定)
  • 2.调用对象的构造方法为所有成员变量赋值
  • 3.当构造方法调用结束,该对象就初始化完成
public static void main(String[] args){
	Person person = new Person();//在堆上开辟一块空间  并且Person构造方法会被调用    
}

2. 构造方法可以重载

构造方法是为了类中的成员变量赋值的,此时的重载只可能是参数的个数不同

class Person {
    private String name = "铭哥";
    private int age = 18;
    private String sex = "男";
    public Person() {
        // name = null,age = 0,sex = null
        System.out.println("Person的无参构造。");
    }
    public Person(String n) {
        // name = null,age = 0,sex = null
        name = n;
        System.out.println("name = " + name);
        System.out.println("Person的一个参数的有参构造");
    }
    public Person(String n,int a) {
        // name = null,age = 0,sex = null
        name = n;
        age = a;
        System.out.println("name = " + name + ",age = " + age);
        System.out.println("Person的两个个参数的有参构造");
    }
}
	Person person = new Person();
	Person person1 = new Person("铭哥");
	Person person2 = new Person("铭哥",18);
	//这三个对象构造方法都已经调用结束,初始化完成
	//person.Person();  // JVM产生对象时调用构造方法,对象实例化结束,无法在程序中手动调用构造方法再次实例化对象!!!   构造方法就是产生对象,我产生我自己。。。

3. 小问题

提问:如果在成员变量定义时就赋值,那是怎么运行的?

	private String name = "铭哥";//成员变量只有在产生对象时,才会在堆中分配空间
    private int age = 18;
    private String sex = "男";
    public Person() {
        // name = null,age = 0,sex = null
        System.out.println("Person的无参构造。");
    }

Person person = new Person();

  1. new 在堆中开辟空间

  2. 成员变量的赋值是在构造方法中进行的

即: name = “铭哥”;

​ age = 18;

​ sex = “男”;


二、this关键字

在这里插入图片描述

1. 调用当前对象的成员变量

在这里插入图片描述

2. this调用类中的方法

2.1 this调用类中的成员方法

在这里插入图片描述

2.2 this表示构造方法间的相互调用

  • 若不同参数的构造方法之间出现了重复的调用,可以使用this(参数)调用其他的构造方法

比如下方代码:

public Student() {
    System.out.println("********************");
}
public Student(String name) {
    System.out.println("********************");
    this.name = name;
}
public Student(String name, int age) {
    System.out.println("********************");
    this.name = name;
    this.age = age;
}

可以改成:

public Student() {
    System.out.println("********************");
}
public Student(String name) {
	this();//this调用的其他构造方法必须放在当前构造方法的首行
    this.name = name;
}
public Student(String name, int age) {
    this(name);
    this.age = age;
}
  • this调用构造方法不能成"环"

3. this表示当前对象的引用 ->了解即可

在这里插入图片描述

三、代码块

概括

代码块:使用{}括起来的一段代码

根据定义的代码块的位置以及关键字的不同分为以下四中代码块

在这里插入图片描述

1. 构造块

构造块:直接定义在类中,不加任何修饰符的代码块,优先于构造方法执行,有几个对象产生就调用几次构造块。

在这里插入图片描述

2.静态代码块

静态代码块:定义在类中,使用static修饰的代码块,在类加载时只执行一次

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • static int age 与 Animal 类绑定,是默认就有的

  • 如果不调用类,则static代码块不会加载

匿名对象 --> new 出来的对象,没有引用指向,使用一次后就销毁了

new Person();

匿名对象常用于测试类中的某些功能,使用一次后就被JVM销毁。

四、toString方法

当一个引用类型的变量调用println函数打印时,默认输出的都是引用类型的地址(不是真正的内存地址)

System.out.println(new Animal());
System.out.println(new Animal());

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值