目录
上期回顾
- 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();
-
new 在堆中开辟空间
-
成员变量的赋值是在构造方法中进行的
即: 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());