1.基本概念
面向对象:将问题中存在的对象分析出来,然后设计类来描述这些对象,然后通过类创建对象,通过对象之间的相互作用 实现需求
类:对对象的抽象描述
对象:通过类创建的一个实例
构造方法:与类同名、没有返回类型、类中至少有一个构造方法、如果不定义编译器提供一个、显式定义任意一个构造方法,编译器不在提供、构造方法的的作用:初始化对象的、构造方法可以重载,可以满足不同的创建对象的需求。
2.构造方法的特点:
- 构造方法只能使用new关键字调用。
- 构造方法的名字必须与所在的类的名字同名。
- 构造方法没有返回类型,在返回类型的位置什么内容都不能写。
- 任何一个类都必须至少有一个构造方法。可以有多个构造方法,构造方法重载。
- 如果一个类中没有显式的定义一个构造方法。那么编译器会帮助添加一个默认无参空实现的构造方法。
- 如果在一个类中显式的定义了任意一个构造方法,那么编译器将不在提供默认无参的构造方法。
3.构造方法的作用:
可以在构造方法中对需要初始化的属性进行必要的初始化。简单来说:对对象进行初始化的。
4.构造方法的使用-重载
构造方法重载的意义:可以使用不同参数的构造方法实现对创建好的对象进行有选择的属性的初始化。
5.创建对象的过程:(由new关键字向JVM申请,JVM创建对象) - 第一步:类加载(如果类加载过了就不在加载了),在类加载的第三步(下面会写)对类的静态成员进行分配内存,并初始化,并执行静态代码块。
- 第二步:JVM根据类的字节码信息在堆内存中创建对象,并在对象中为每一个实例成员变量分配内存,并执行默认初始化,在对所有的成员变量进行声明处的赋值(例:private age=10; 如果有这样的代码,是先默认赋值为0,在赋值为10,分两步做)这时候对象已经创建好了,这些都是有JVM来做的。
- 第三步:执行构造块中的代码,执行构造方法中的代码。
- 第四步:构造方法中的代码执行完毕之后,对象初始化完毕。
6.类加载的过程:(分为三个阶段) - 第一阶段叫装载,JVM使用类加载器将字节码的数据从磁盘上加载到内存里面来;
- 第二阶段是链接,我们在写代码的时候使用的是符号引用(例:age=10);但是真正的在执行的时候,所有的符号引用都要转化为地址引用(第二步也就是将符号引用转化为地址引用)
- 第三阶段叫类的初始化,对类中的静态成员变量分配内存,执行静态代码块,由于类加载只执行一次,所以静态代码块执行且只执行一次。
7.this:是当前对象的引用。谁调用了某个方法,那么某个方法中的this就是谁。
8.this的作用: - 保证了不同的对象调用同一个方法,访问的是不同对象内部的属性。
- 当局部变量和成员变量的名字作用域冲突的时候,使用this用来区分成员还是局部。This后跟的肯定是本类的成员。
- 使用this可以在构造方法中调用本类的其他的构造方法。必须在构造方法的第一句调用。(在构造方法中之所以能使用this,是因为在执行构造方法的时候对象已经存在(参考本文5.创建对象的过程))。
9.this的使用范围:this 在类的构造方法中 和 成员方法中使用。在构造方法中代表刚刚被创建好的对象,在成员方法中,代表当前调用方法的对象。
10.下在这段测试代码实现的是求两点之间的距离。测试this关键字的使用、构造方法的重载。
11.static静态的,Static可以用来修饰成员变量和成员方法。
static修饰成员变量
-static修饰的成员变量的特点?
答:多个对象共享static修饰的成员变量的内存空间。只有一份内存空间。
-static修饰的成员变量的内存空间在哪?何时被分配的?
答:static修饰的成员变量的内存空间在【方法区】。在类加载的时候对static修饰的成员变量进行分配内存。
-如何使用static修饰的成员变量?
答:可以通过对象来访问,对象. 即可,java还提供了直接使用类名来访问的方式。而且建议使用类名来访问,以表示该变量为static 变 量。
如果希望某一个变量是多个对象共享的,只希望有一份内存空间,那么就可以声明为static修饰的。比如 final修饰的变量。
static修饰成员方法
-静态方法,一般可以用来作为工具方法使用。不用创建本类的对象,就可以直接使用类名来调用工具方法。
-用来访问本类的静态成员。
12.代码块学习
-局部代码块,在方法体中的一对大括号.
作用:可以将局部变量的作用域范围控制的更小。
-构造块.在类体中的一对大括号。
作用:可以用来访问类成员,对属性进行初始化。
特点:每创建一个对象都会被执行一次,而且是先于构造方法被执行的。
-静态代码块: 在类体中的一对大括号,前面使用static 修饰。
特点:执行且仅执行一次,在类加载的第三步 :类的初始化的时候执行。
作用:可以对类的静态成员进行初始化,还有如果某些代码只希望执行一次,可以放到这里。
import static java.lang.Math.*;
/**
* 测试this
*/
public class TestPoint {
public static void main(String[] args) {
Point point1=new Point();
point1.show();
Point point2=new Point(6,8);
point2.show();
double distance= point1.distance(point2);
System.out.println(distance);
}
}
class Point{
int x,y;
//创建构造方法
public Point(){
this(3,4);//使用this可以在构造方法中调用本类的其他的构造方法。必须在构造方法的第一句调用
//等价于
//x=3;
//y=4
}
//构造方法的重载
public Point(int x,int y){
this.x=x;
this.y=y;
}
//创建show方法
void show(){
System.out.println("x="+x+"\ty="+y);
}
//求两点之间的距离
double distance(Point point){
int disX=x-point.x;
int disY=y-point.y;
double distance= Math.sqrt(disX*disX+disY*disY);
return distance;
}
}