类与对象
1、类是抽象的,概念的,代表一类事物,比如人类,猫类,狗类 他是数据类型!!
2、对象是具体的,实际的,代表一个事物,既是一个实例!万物皆对象!
3、类是对象的模板。对象是类的一个个体,对应着一个实例!
属性/成员变量
属性时类的一个组成部分,一般时基本数据类型,也可以是引用类型(对象,数组)。 属性给也叫做成员变量!
属性的注意事项:
- 属性的定义同变量。多了一个访问修饰符 (private 、public、 protect)控制访问范围
- 属性的定义可以为任意类似,包含基本类型和引用类型。
- 属性如果不赋值,有默认值,规则和数组一组!
类型 | 默认值 |
---|---|
int | 0 |
short | 0 |
byte | 0 |
long | 0 |
double | 0.0 |
float | 0.0 |
char | \u0000 |
boolean | false |
String | null |
对象的创建流程
类与对象的内存分配机制★
Person p1=new Person();
p1.age =10;
p1.name ="小明";
Person p2 =p1 ;//把p1 赋给p2,让p2 指向p1;
System.out.println(p2.age);
当执行Person p1=new Person();时
当执行 p1.age =10;
p1.name =“小明”;
执行 后 Person p2 =p1 ;//把p1 赋给p2,让p2 指向p1;
就是相当与把 p1 的地址复制给了 p2
(p2 就成了p1 的另一个名字 大概就是这个意思!)
类和对象的内存分析机制:
栈:主要是存放基本数据类型(局部变量);
堆:存放对象(要是引用类型存地址);
方法区:常量池、加载类的 属性信息,和方法信息;
例如:
对于程序
Person p= new Person();
p.name="jack";
p.age = 10;
1、先加载person类信息(属性,方法,只加载一次,加载多了没有意义)
2、在堆中分配空间,(分配属性的空间 都为默认值。)
3、完成对象初始化,先进行默认初始化。在进行显式初始化,最后进行构造器初始化。
4、再对象再堆中的地址,返回给p。(p是对象的引用)
this关键字
什么是this?
Java虚拟机会给每一个对象分配一个this,代表当前对象。
举个栗子吧:
第一句话: 小明:”我的眼睛受伤了。“ 我们从这句话得出了,谁的眼睛受伤了呢?小明。
第二句话: 李华:”我的眼睛受伤了。“我们从这句话得出了,谁的眼睛受伤了呢?李华
要是 小明和李华说了:”眼睛受伤了“,我们根本就不知道是谁受的伤。所以这里的this就向
我们说的 ”我的“ 的意思,说个”手机“我们不知道是谁的,你说”我的手机“是不能表达出意思!
上代码!
public class ThisKeyWords {
public static void main(String[] args) {
Dog dog = new Dog("lala",3);
dog.info();
}
}
class Dog{
String name;
int age;
//当没有this关键字的时候,就出现了一个问题。
//根据变量的作用域的原则。
// 构造器的name是局部变量,不是属性,构造器的age也是一样的。
// 根据就近原则。发现name ,age,还是原来的默认值。
public Dog(String name, int age) {
name = name;
age = age;
}
public void info(){//成员方法,输出属性信息
System.out.println(name+"\t"+age+"\t");
}
}
运行结果:
为什么出现了 null 和 0这种结果呢?
当没有this关键字的时候,就出现了一个问题。
根据变量的作用域的原则。
构造器的name是局部变量,不是属性,构造器的age也是一样的。
根据就近原则。发现name ,age,还是原来的默认值。
public class ThisKeyWords {
public static void main(String[] args) {
Dog dog = new Dog("lala",3);
dog.info();
}
}
class Dog{
String name;
int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public void info(){//成员方法,输出属性信息
System.out.println(name+"\t"+age+"\t");
}
}
运行结果:
加了this是不是就出现我们想要的结果了呢。
当然你可以这样写
public Dog(String dName,int dAge){
name = dName;
age=dAge;
}
这样也是可以的。
简单的说:那个对象调用,this就代表这那个对象
注意事项:
- this关键字可以用来访问本类的属性、方法、构造器。
- this可以用来区分本类的属性和局部变量
- 访问成员方法的语法:this.方法名(参数列表);
- 访问构造器的语法:this(参数列表)。(注意只能再构造器中访问另外一个构造器,必须放在第一条语句!!!。)
- this不能再类定义的外部使用,这能在类定义的方法内使用!