看以下程序
public class Person {
private String name;
private int age;
public Person(String name, int age) {
name = name;
age = age;
}
public Person() {
}
public static void main(String[] args) {
Person person = new Person("name",18);
System.out.println(person.name);
System.out.println(person.age);
}
}
并没有把数据传入构造方法中,这也就证明,现在构造方法不能把传递进去的赋值给类的属性,这种错误通过this关键字来解决。
加入this关键字
建议以后访问类的属性时候加上this关键字
如果一个类中有多个构造方法,也可以用this相互调用。
下面使用this调用本类的构造方法
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this(); //在这调用person的午餐构造方法
this.name = name;
this.age = age;
}
public Person() {
System.out.println("我是无参构造方法,我被调用了!");
}
public static void main(String[] args) {
Person person = new Person("name",18);
System.out.println(person.name);
System.out.println(person.age);
}
}

注意:构造方法是在实例化对象时调用的,也就是说,在类的所有方法中,无参构造方法是最先被调用的,也就解释了为什么无参构造方法会被放在构造方法的首行,因为是最先被调用。
错误代码:
public Person(String name, int age) {
this.name = name;
this(); //在这调用person的午餐构造方法
this.age = age;
}
注意:提供无参的构造方法作为程序的出口,否则任意造成构造方法的递归调用。
在java中当前对象就是指当前正在调用类中的方法对象。
class Person {
public String getInfo(){
System.out.println("person类->"+this);
return null;
}
}
public class ThisDemo{
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1);
System.out.println("------------");
p1.getInfo();
System.out.println("------------");
System.out.println(p2);
p2.getInfo();
}
}

static属性称为全局属性(有些也称为静态属性)
class Person {
private String name;
private int age;
static String country = "A城";
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void info() {
System.out.println(this.name);
System.out.println(this.age);
System.out.println(country);
}
}
public class ThisDemo {
public static void main(String[] args) {
Person p1 = new Person("zhang",15);
Person p2 = new Person("lisi",19);
Person p3 = new Person("meimei",11);
p1.info();
p2.info();
p3.info();
System.out.println("-------");
Person.country = "B城";
p1.info();
p2.info();
p3.info();
}
}
多个实例化对象共享一个属性,当属性改变时,全部实例化对象对应的也跟着改变。

栈内存空间:保存所有对象的名称
堆内存空间:保存每个对象的具体属性内容
全局数据区:保存static类型的属性
全局代码区:保存所有的方法定义
static声明的方法称为类方法,可以直接用类对象名直接调用,不用实例化对象,注意非static的方法可以去调用static声明的方法或者属性,但是static声明的方法是不能调用非static的方法或者属性的。

因为在程序中所有的属性和方法必须在对象开辟堆内存之后才可以调用,而static类型的方法在对象没有实例化时就可以被类名直接掉调用。
可以试着分析main方法,理解main方法。
使用super关键字调用父类中指定的构造方法
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String Info(){
return this.getName() + "-" + this.getAge();
}
}
class Studnet extends Person{
private String school;
public Studnet(String name, int age, String school){
super(name,age);
this.school=school;
}
public String getSchool(){
return school;
}
public void setSchool(String school){
this.school = school;
}
@Override
public String Info(){
return super.Info() + this.getSchool();
}
}
public class OverrideDemo01{
public static void main(String[] args) {
Studnet studnet = new Studnet("zhangsan",30,"bbgu");
System.out.println(studnet.Info());
}
}
| this | super |
|---|---|
| 访问本类的属性,如果本类没有从父类中查找 | 访问父类的属性 |
| 访本类的方法,如果本类没有从父类中查找 | 直接访问父类的方法 |
| 调用本类的构造方法,必须放在构造方法的首行 | 调用父类的构造方法,必须放在子类构造方法的首行 |
| 表示当前对象 | 没有此概念 |