java学习(七)面向对象
面向对象的三大特征:封装、继承、多态
类
-
类的定义:类是由属性和方法组成的
-
实例变量:以下程序当中 no、name、age、sex 都是属性,它们都是成员变量中的实例变量
-
实例变量访问:实例变量所谓实例变量就是对象级别的变量,这些属性要想访问,必须先创建对象才能访问,不能直接通过类去访问,因为每一个学生的学号都是不一样的。没有学生对象,谈何学号
[修饰符] class 类名 {
类体里有 属性 和 方法
}
public class Student { //学号 int no; //姓名 String name; //年龄 int age; //性别 boolean sex; }
对象:对象是堆里new出来的
JVM内,方法区存代码片段,栈区存方法和方法内的局部变量,堆区存对象和对象的实例变量(属性)
public class StudentTest {
public static void main(String[] args) {
int i = 10;
Student s1 = new Student();
}
}
-
代码在执行过程中JVM内存的变化
-
第一步进行类加载
-
第二步 main 方法调用,给 main 方法分配栈帧(压栈)
-
第三步执行 main方法内的局部变量int i=10
-
第四步执行 new Student(),在堆中创建对象,同时初始化实例变量
-
第五步将堆区中学生对象的内存地址赋值给局部变量 s1
-
在创建对象的时候,也就是说在 new 的时候,系统会对实例变量默认赋值。数据类型和默认值为:
byte 0 short 0 int 0 long 0L float 0.0f double 0.0 boolean false char \u0000 引用类型 null
-
堆和栈
-
栈的活动最频繁,方法调用就压栈,调用结束就弹栈。栈中存储的是局部变量(方法内的变量)。
-
堆:凡是通过new运算符创建的对象,都存储在堆内存中,new的作用就是在堆内存开辟一块存储空间用来存储对象和对象的示例变量,一个对象一个单独的空间
-
引用:存储对象内存地址的一个变量,所有的实例变量(属性)都是用"引用."访问的
-
空指针异常:空引用 访问对象的数据的时候会出现这个异常java.lang.NullPointerException
构造方法:完成对象的创建,以及对象属性的初始化操作。是类中特殊的方法。
其语法格式如下:
[修饰符列表] 构造方法名(参数){
构造方法体;
}
怎么调用构造方法呢 ?其语法格式如下:
new 构造方法名(参数);
当一个类没有提供任何构造方法时,系统会默认提供一个无参数的构造方法(缺省构造器)最好将无参数的构造方法手写出来
-
构造方法名和类名一致。 否则编译报错。
-
构造方法返回值类型不需要写,写上就报错,包括 void 也不能写。
-
构造方法用来创建对象,以及完成属性初始化操作。
-
构造方法的返回值类型实际上是当前类的类型。
-
一个类中可以定义多个构造方法,这些构造方法构成方法重载。
疑问?构造方法是在创建对象过程中给属性赋值的,实例变量系统是在啥时候赋值的?
是在类加载的时候吗?不是的,是在构造方法调用的时候。new 类名();
代码块:
public class Vip{
long no; //0
String name; //null
String birth; //null
boolean sex; //false
//无参数的构造方法
//为了保证无参数构造方法有,写代码的时候手动写出来
public Vip(){
}
//有参数构造方法2个参数
public Vip(long huiYunaHao,String xingMing){
//实例变量赋值
no = huiYunaHao;
name = xingMing;
//其实这里还有两行代码,没有手动赋值,系统会赋默认值
//birth = null;
//sex = false;
}
//有参数的构造方法3个参数
public Vip(long huiYunaHao,String xingMing,String shengRi){
no = huiYunaHao;
name = xingMing;
birth = shengRi;
}
//有参数的构造方法4个参数
public Vip(long huiYunaHao,String xingMing,String shengRi,boolean xingBie){
no = huiYunaHao;
name = xingMing;
birth = shengRi;
sex = xingBie;
}
}
调用上面代码
public class ConstructorTest_03{
public static void main(String[] args){
//调用不同的构造方法创建对象,给实例变量赋值
Vip v1 = new Vip();
Vip v2 = new Vip(602,"法外狂徒二哥");
Vip v3 = new Vip(603,"法外狂徒张三","2008-08-08");
Vip v4 = new Vip(604,"尼古拉斯老四","2014-11-14",true);
System.out.println(v1.no); //o
System.out.println(v2.name); //法外狂徒二哥
System.out.println(v3.birth); //2008-08-08
System.out.println(v4.sex); //true
}
}