面向对象
1.特性:封装性,继承性,多态性。
2.类与对象
类:一类事物
对象:该类事物的个体,类的实例。
3.类的定义 :成员变量;成员方法;
例:class Person{
int age =10;
void speak(){
System.out.println("我今年"+age+"岁!");
}
}
public class test1 {
public static void main(String[] args) {
Person Xiaoming = new Person();
Xiaoming.speak();
}
}
输出:我今年10岁!
成员方法可以访问成员变量。
class Person{
int age =10;
void speak(){
int age = 60;
System.out.println("我今年"+age+"岁!");
}
}
public class test1 {
public static void main(String[] args) {
Person Xiaoming = new Person();
Xiaoming.speak();
}
}
输出:我今年60岁!
成员变量与局部变量同名时,方法中访问到的是局部变量。
Java把内存分为两种:一种是栈内存。一种是堆内存。
栈内存:在函数中定义的一些基本类型的变量和对象的引用变量。
堆内存:由new创建的对象和数组。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量。让栈中的这个变量的取值等于数组或对象在堆内存中的首地址。栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或对象起的一个名称。引用变量是普通的变量,定义时在栈中分配。
一个对象实例化过程:
Person p = new Person();
1,JVM会读取指定的路径下的Person.class文件,并加载进内存,
并会先加载Person的父类(如果有直接的父类的情况下).
2,在堆内存中的开辟空间,分配地址。
3,并在对象空间中,对对象中的属性进行默认初始化。
4,调用对应的构造函数进行初始化。
5,在构造函数中,第一行会先到调用父类中构造函数进行初始化。
6,父类初始化完毕后,在对子类的属性进行显示初始化。
7,在进行子类构造函数的特定初始化。
8,初始化完毕后,将地址值赋值给引用变量.
class M { M() { System.out.println("Hello world!"); } public static void main(String[] args) { M m = new M(); } } 在这个类里面,你不写 M() { System.out.println("Hello world!"); } 也是对的,为什么呢?因为当类没有构造函数的时候,系统会自动给相关的类默认一个无参的构造函数,但是当有构造函数时,系统不会默认构造函数。 构造函数的作用就是初始化的时候调用,所以你的类会输出Hello world! 把new M()理解为两步:先通过new分配对象内存,然后调用M()方法。M()不是类名的使用,而是构造函数M(),否则就不会出现new M(123)之类的了。