- 是用来描述一类事物的
- 可以在把内部定义任何数量的、不同类型的变量,作为这一类事物的属性。这种属性叫做成员变量
- 有类名,类名必须和文件名一样
- 就好像文件路径+文件名不能重复一样,一个java程序中相同名字的类只能有一个
从数据类型的角度来看,类就是自己创建了一种新的数据类型。类也叫做“ 自定义类型 ”。一个Java程序中不允许类同名。
- // 一个类以 public class 开头,public class代表这个类是公共类,类名必须和文件名相同
- public class Student {
- // 类体中可以定义描述这个类的属性的变量,称之为 成员变量
- String name;
- String id;
- int ranking;
- double grade;
- }
- 使用new操作符可以创建某个类的一个实例,在java程序运行的时候,所有这些创建出来的实例都被java放在内存里一个叫做堆的地方
- 通过点操作符,给类的某个成员变量赋值
- public class School {
- public static void main(String[] args) {
-
- // 创建一个Student实例,用xiaoming指向它
- Student xiaoming = new Student();
- // 使用点操作符,给xiaoming指向的实例(对象)赋值
- xiaoming.name = "小明";
- xiaoming.id = "1";
- xiaoming.grade = 82.5;
- xiaoming.ranking = 10;
-
- Student xiaoHua = new Student();
- xiaoHua.name = "小华";
- xiaoHua.id = "2";
- xiaoHua.grade = 87.0;
- xiaoHua.ranking = 8;
- }
- }
Java中的数据类型分为基本数据类型和引用数据类型
引用里边实际上存放的是一个地址
- public class School {
- public static void main(String[] args) {
-
- // 创建一个Student实例,用xiaoming指向它
- // xiaoming 是一个Student类型的引用,只能指向Student类型的实例
- // 引用数据类型变量包含两部分信息:类型和实例
- // 每一个引用数据类型的变量,都是指向某个类的一个实例,不同类型的引用在java里都是引用
- // 引用的类型信息在创建时就已经确定,可以通过给引用赋值,让其指向不同的实例
- // xiaoming 就是 Student类型,只能指向Student的实例
- // 给一个引用赋值,则两者的类型必须一样
- Student xiaoming = new Student();
- // 使用点操作符,给xiaoming指向的实例(对象)赋值
- xiaoming.name = "小明";
- xiaoming.id = "1";
- xiaoming.grade = 82.5;
- xiaoming.ranking = 10;
-
- Student xiaoHua = new Student();
- xiaoHua.name = "小华";
- xiaoHua.id = "2";
- xiaoHua.grade = 87.0;
- xiaoHua.ranking = 8;
- }
- }
(1)相同点
(2)不同点
System.out.println(xiaoming); // Student@6b71769e
数组是一种特殊的类
- 数组的类名就是类型带上小括号
- 同一类型的数组,每个数组对象的大小可以不一样。也就是每个数组对象占用的内存可以不一样,这点和类的对象不同。
- 可以用引用指向类型相同大小不同的数组,因为它们属于同一种类型
引用的数组
- 可以把类名当成自定义类型,定义引用的数组,甚至多维数组
- 数组变量其背后真身就是引用,数组类型就是一种特殊的类
- 数组的大小不决定数组的类型,数组的类型是只由元素类型决定的
- null是引用类型的缺省值
- null 代表空,不存在
- 引用类型的数组创建出来,初始值都是null
- NullPointerException
- 如果不确定,使用前需要先判断引用是不是空
- public class ArrayTest {
- public static void main(String[] args) {
- Student[] students = new Student[10];
- for (int i = 0; i < students.length; i++) {
- if (i % 2 == 0) {
- students[i] = new Student();
- }
- }
- for (int i = 0; i < students.length; i++) {
- System.out.println(students[i]);
- // System.out.println(students[i].grade); // 报错Exception in thread "main" java.lang.NullPointerException
- if (students[i] != null) {
- System.out.println(students[i].grade);
- }
- }
- }
- }
类就是一种自定义类型
- 在类定义中可以使用类,创建类的引用
- 在类定义中,甚至可以使用类自己的类创建应用
- 引用类型的缺省值是null,一个类定义中如果有引用,创建出来的实例,其缺省值是null
- public class MyPhone {
- public static void main(String[] args) {
- Phone phone = new Phone();
- phone.hasFigurePrintUnlocker = true;
- phone.price = 1999;
- phone.screen = new Screen();
-
- phone.screen.producer = "京北方";
- phone.screent.size = 8.8;
-
- CPU cpu = new CPU();
-
- cpu.producer = "三星";
- cpu.speed = 3.5;
-
- Memory memory = new Memory();
- memory.producer = "三星";
- memory.capacity = 4;
-
- Storage storage = new Storage();
- storage.producer = "Intel";
- storage.capacity = 128;
-
- phone.mainboard = new Mainboard();
-
- phone.mainboard.ccpu = cpu;
- phone.mainboard.memory = memory;
- phone.mainboard.storage = storage;
- phone.mainboard.model = "EA888";
- phone.mainboard.year = "2022";
- }
-
- }
- 为了避免类在一起混乱,可以把类放在文件夹里。这时就需要硬package语句告诉Java这个类在哪个package里。package语句要和源文件的目录完全对应,大小写一致
- 一般来说,类都会在包里,而不是直接放在根目录
- 不同的包里可以有相同的类
- 一个类只能有一个package语句,如果有package语句,则必须是类的第一行有效代码
- 包名+类名 = 类的全限定名。简称为类的全名
- 同一个Java程序中全限定名字不可重复
- package com.phone.parts;
- import com.phone.Phone;
- public class MyPhone {
- public static void main(String[] args) {
- Phone myPhone = new Phone();
- myPhone.name = "123";
- }
- }
- 被 public(访问不受限制,是权限最多的一个修饰符)修饰的属性,可以在任意包中的类去访问
- 没有访问修饰符的属性,称作缺省的访问修饰符,可以被本包内的其他类和自己的对象访问
- 访问修饰符是一种限制或者允许属性访问的修饰符