我们学习编程就是为了把我们日常生活中的事物用编程语言描述出来。
那如何描述现实世界中的事物?
- 属性(就是该事物的描述信息,事物身上的名词)
- 行为(就是该事物能够做什么,事物身上的动词)。
Java中最基本的单位是类,Java中用类(class)描述事物也是如此。
- 成员变量,就是事物的属性
- 成员方法,就是事物的行为
定义类就是在定义类的成员(成员变量和成员方法)
类只是描述事物的模板,要想运用这个事物,还需要将其实例化成一个对象。
类就相当于造汽车用的图纸,对象就相当于造好的汽车。
类
Java程序是由一组类所组成,其中有一个类会带有启动用的main()方法。
Java代码写在.java文件中,编译器将其编译成.class文件。
类是对象的蓝图,来告诉虚拟机如何创建某种类型的对象。
真正的Java程序只会让对象与对象交互(互相调用方法)。
成员变量(实例变量)
实例变量用来描述对象的状态,状态就是存储在实例变量中的值。代表每个对象的特有属性(每个对象都可能有不同的值)。
class Duck{
int size;//每个Duck对象都会有自己的size
}
- 实例变量的寿命与对象相同
- 实例变量声明在类中而不是方法里。
- 实例变量存储在对象所属的堆中。
- 实例变量有默认值(0,0.0,false,null)
如果实例变量是基本数据类型,则java会根据其基本数据类型的大小为该实例变量留下空间。int需要32位,long需要64位。java并不在乎实例变量的值,不管是32还是32000的int都会占用32位。
如果实例变量是引用类型,实例变量的空间为引用所占的空间,而不是对象本身所用到的空间。
成员方法
成员方法用来描述事物的行为,行为就是保存在方法中的算法。
当调用一个方法时,该方法会放在调用栈的栈顶。实际被堆上栈的是堆栈块,它带有方法的状态。包括执行到哪一行程序以及所有的局部变量的值。栈顶上的方法时目前正在执行的方法。方法会一直待在这里直到执行完毕。
例如:
public void duStuff(){
boolean b=true;
go(4);
}
public void go(int x){
int z=x+24;
crazy();
}
public void crazy(){
char c='a';
}
这里有三个方法doStuff(),go(),crazy()。doStuff调用go,go又调用crazy。
局部变量
局部变量声明在方法里或方法的参数上。
局部变量只存活在声明该变量的方法中。
局部变量没有默认初始化值。
局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
public void foo(int x){
int i=x+3;//x和i都是局部变量
}
在使用变量时需要遵循就近原则,首先在局部范围找,有就使用;接着在成员位置找。
如果局部变量是个对象的引用,只有引用变量会放在栈上,对象本身会放在堆上。
方法的重载
方法的重载,不必为功能相似的方法再写一个方法名。
重载的条件:方法名相同,参数不同(个数,类型,顺序),与返回类型无关。
构造函数
使用构造函数来初始化对象的状态。
构造函数没有返回值,名字和类名相同
就算自己没有写构造函数,编译器也会帮你写一个无参的方法体为空的构造函数。
但如果自己写了构造函数,就不会有那个无参的方法体为空的构造函数了。如果需要那个无参的构造函数,要自己写一个。
class Duck{
public Duck(){
}
}
this()
this()用来从某个构造函数调用同一个类的构造函数。
this()只能用在构造函数中,且必须是第一行语句。super()与this()不能兼得。
当有许多构造函数,而这些构造函数函数中有一些相同的代码,就可以把这些代码封装起来写成一个构造函数,供其他的构造函数调用。
构造函数的重载
参数不一样(类型,顺序,数量)
对象
创建对象时,它会被存放在堆中。
对象的声明,创建与赋值
1.声明一个引用变量
要求虚拟机分配空间给引用变量,并将此变量命名为myDog
Dog myDog=new Dog();
2.创建对象
要求虚拟机分配堆空间给新建立的Dog对象
Dog myDog=new Dog();
3.连接对象和引用
将Dog对象赋值给myDog这个引用
Dog myDog=new Dog();
this关键字
代表当前对象的引用。
应用场景:用来区分成员变量和局部变量重名