1.类的定义
语法结构:
[修饰符列表] class 类名{ }
*属性通常是采用变量形式定义
*java语言中包括两种数据类型
-基本数据类型:byte,int,short,long……
-引用数据类型:定义的类,如SUN提供的String、System,自己定义的student等。
例子1:定义一个学生类
//定义一个类,类名student
//student是一个类,代表了所有的学生对象,是一个学生模板
public class Student{
//属性:描述状态信息
//属性通常采用变量方式定义
//在类体中,方法体外的定义变量成为“成员变量”
//成员没有赋值时,系统默认值:一切向0看齐。
//访问属性必须先创建对象,通过对象访问属性
//类中的属性不能直接通过“类”去访问,所以这种属性【成员变量】又叫做:实例变量。
//对象又被称为示例,实例变量又称为对象变量。
//不创建对象时,属性变量内存空间是不存在的,只有创建了对象,这些属性的内存空间才会被创建。
//学号
int no;
//姓名
String name;
//性别
boolean sex;
//年龄
int age;
//住址
String address;
//方法:描述动作信息。
//这里暂不定义
}
2.对象的创建
- 通过一个类可以实例化 N个对象。以"例子1"定义的学生类做为基准。
public class OOTest01{
public static main(String[] args){
//通过一个类可以实例化N个对象
//实例化对象语法:new 类名();
//new 是 java语言当中一个运算符
//new运算符的作用是创建对象,在JVM堆内存中开辟新的内存空间
//方法区内存:在类加载的时候,class字节码代码片段被加载到内存空间当中。
//栈内存(局部变量):方法代码片段执行的时候,会给该方法分配内存空间,在栈内存中压栈。
//堆内存:new的对象在堆内存中存储
Student s = new Student();
//访问创建的Student对象的no。
int stuNo = s.no;
//修改创建的Student对象的no的值。
s.no = 2;
//再通过类实例化一个全新的对象
//stu是一个引用
//stu同时也是一个局部变量
//Student是变量的数据类型
Student stu = new Student();
}
}
/*
局部变量在栈内存中存储
成员变量的实例变量在堆内存的java对象内部存储
实例变量是一个对象一份。
*/
这里的在JVM中,堆内存保存Student对象,Student对象中保存着对象的实例变量。其中“ s ”存储的是创建的Student对象在堆内存的地址,“ s ”称为"引用"。这个引用是保存在栈内存中。
也就是说:
*new运算符在堆内存中开辟的内存空间称为对象。
*引用是一个变量,这个变量中保存了另一个java对象的内存地址。
*java中不能直接操作堆内存,java中没有指针。只能通过“引用”去访问堆中对象内部的实例变量。
*读取数据:引用.变量名;
*修改数据:引用.变量名 = 值;
例子1:
//家庭住址类
public class Address{
//属性【成员变量之实例变量】
String city;
String street;
String zipcode;
}
//用户类
public class User{
//属性【一下都是成员变量之实例变量】
//用户编号
//int是一种基本数据类型
//no是一个实例变量
int no;
//用户名
//String是一种引用数据类型:字符串
//name是一个实例变量
//name是一个引用【记录地址的引用数据类型的变量名称】
String name;
//家庭住址
//Address是我们定义的引用数据类型
//addr是一个实例变量
//addr是一个引用
Address addr;
}
//测试类
public class OOTest{
public static void main(String[] args){
//创建User对象
User u = new User();
//输出User对象内部实例变量的值
System.out.println(u.no); //0
System.out.println(u.name); //null
System.out.println(u.addr); //null
//修改User对象内部实例变量的值
u.no = 10;
u.name = "jack";
u.addr = new Address();
//在main方法中目前只能看到一个引用"u"
//一切都是只能通过u来进行访问
System.out.println(u.name + "居住在哪个城市" + u.addr.city);
System.out.println(u.name + "居住在哪个城市" + u.addr.street);
System.out.println(u.name + "居住在哪个城市" + u.addr.zipcode);
}
}
例子2:
//丈夫类
public class Husband{
//丈夫的名字
String name;
//丈夫的妻子
Wife w;
}
//妻子类
public class Wife{
//妻子的名字
String name;
//妻子的丈夫
Husband h;
}
//主类
public class Test{
public static void main(String[] args){
//创建一个丈夫对象
Husband coffee = new Husband();
coffee.name = "美式";
//创建一个妻子对象
Wife ice = new Wifu();
ice.name = "冰";
//在这里如果没有设定结婚
//System.out.println(coffee.name + "妻子是" + coffee.w.name); 编译错误
//结婚
coffee.w = ice;
ice.h = coffee;
System.out.println(coffee.name + "要加" + coffee.w.name);//美式要加冰
}
}
3.关于JVM内存管理
1.JVM(Java虚拟机)主要包括三块内存空间,分别是栈内存、堆内存、方法区内存。
2.堆内存和方法区内存各有一个,一个线程一个栈内存。
3.方法调用时,该方法所需要的内存空间在栈内存中分配,称为压栈。方法执行结束后,该方法所属的内存空间释放,称为弹栈。
4.栈中主要存储的是方法体当中的局部变量。
5.方法的代码片段及整个类的代码片段都存储到方法区内存当中,在类加载的时候这些代码片段会载入。
6.在程序执行过程中,使用new运算符创建的java对象,存储在堆内存当中。对象内部有实例变量,所以实例变量存储在堆内存当中。
7.变量分类:
-局部变量【方法体中声明】
-成员变量【方法体外声明】:实例变量【前边修饰符没有static】、静态变量【前边修饰符中有static】。
8.静态变量存储在方法区内存当中
9.三块内存当中变化最频繁的是栈内存,最先有数据的是方法区内存。垃圾回收器主要针对堆内存。
10.垃圾回收器【自动垃圾回收机制、GC机制】:
*当堆内存当中java对象称为垃圾数据时候,会被垃圾回收器回收。
*当没有更多的引用指向堆内存中的java对象时,这个对象称为垃圾数据,即这个对象无法被访问,因为访问对象只能通过引用方式访问。
4.对象的使用
public class Customer {
int id;
}
//测试程序
public class Test{
public static void main(String[] args){
Customer c = new Customer();
System.out.println(c.id);//0
c=null;
//一下程序编译可以通过,因为符合语法
//运行出现空指针异常:java.lang.NullPointerException
//空(null)引用。在进行引用访问“实例”相关的数据一定会出现空指针异常
System.out.println(c.id);
}
}
//“实例”相关的数据:这个数据访问的时候必须有对象的参与,这种数据就是实例相关的数据。
5.练习
1.电脑和学生类
需求:
(1)计算机类属性:品牌、型号、颜色
(2)学生类属性:学号、姓名、笔记本电脑
编写以上两个类,分别将类创建为对象。对象数量不限,然后其中一个学生使用其中一台笔记本电脑。
class Computer{
String brand;//品牌
String medol; //型号
String color; //颜色
}
class Student{
int no;//学号
String name;//姓名
Computer pc;//学生的电脑
}
public class Study1 {
public static void main(String[] args){
Computer a = new Computer();
a.brand = "华硕";
a.medol = "坠机堡垒7";
a.color = "黑色";
Computer b = new Computer();
b.brand = "联想";
b.medol = "Y7000-2019";
b.color = "黑色";
Student stu = new Student();
stu.no = 12138;
stu.name="咖啡";
stu.pc = b;
System.out.println(stu.name + "使用的电脑是" +stu.pc.brand + stu.pc.medol+stu.pc.color);
}
}
——本章节为个人学习笔记。学习视频为动力节点Java零基础教程视频:动力节点—JAVA零基础教程视频