1. 初步认识
1.1 基本概念
类是一种高配的结构体,对C语言来说,结构体只能表示事物的属性,但对于Java中的类来说,既能表示属性也能表示行为(方法)。
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了。 类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了.
2. 类的定义
2.1 类的定义和使用
public class 类名{
属性
方法
}
类名 对象名 = new 类名();
public class WashMachine {
public String brand; //品牌
public String type; // 机型
public double weight; //重量
public String color; //颜色
public void washClothes(){ //洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){
System.out.println("脱水功能");
}
public void setTime(){
System.out.println("定时功能");
}
}
2.2 类的定义的注意事项:
1.定义类的时候一般是一个文件中只定义一个类.(一个文件也可以定义多个类,但要求只能有一个类是public)
2.当指定了public的类之后当前的文件名,必须和public的类名是一致的
3.Java中没有“声明"这样的说法
3. 类的实例化(创建对象)
和数组类似都需要new 关键字
Dog dog = new Dog();
dog变量名也是一个引用类型,new出来的对象都在堆上创建新空间

Dog dog1 = new Dog();
dog1.name = "大黄";
Dog dog2 = new Dog();
dog2.name = "小黑";
使用dog 调用name,就是根据dog中的引用找到对应的name
使用dog2调用name,就是根据dog2的引用找到对应的 name
注意事项:

类中方法
JVM中有一个专门的内存空间,称为“方法区",一个类中的方法,都是只在内存中有一份的.被所有的对象共用.
4. this引用
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
public class Data {
public int year;
public int month;
public int day;
public void setDate(int year, int month, int day){
year = year;
month = month;
day = day;
}
}
上面的部分,编译器见到year时会首先把year理解成形参。
public void setDate(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
this是一个特殊的引用,只能在方法中使用,作用就是表示当前的实例。
Data day1 = new MyData();
day1.setDate(2025,2,25);
通过day1来调用setDate方法,day1这个引用就是setData中的this


针对第二点,如果给方法加上static,就无法使用this
5. 对象的构造及初始化
5.1 如何初始化对象
在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。
public static void main(String[] args) {
int a;
System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a
要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。如果是对象:
public static void main(String[] args) {
Date d = new Date();
d.setDate(2025,2,25);
}
// 代码可以正常通过编译
需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。通过上述例子发现两个问题:
1. 每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?
5.2 构造方法
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同并且不能有返回值,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
public Date(){
}
可以根据需要写任意个构造方法,满足不同的初始化方式
第一种,不指定参数,类中自动初始化
第二种,在实例化时需要指定参数
package boke;
public class MyData {
public int year;
public int month;
public int day;
public MyData(){
year = 2025;
month = 2;
day = 25;
System.out.println("调用第一种构造方法");
}
public MyData(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
System.out.println("调用第二个构造方法");
}
public static void main(String[] args) {
MyData day1 = new MyData();
MyData day2 = new MyData(2025,2,25);
}
}
构造方法特性:

![]()
构造方法中,可以通过this调用其他构造方法来简化代码(但必须在第一行):
public MyData(){
//System.out.println(year); 注释取消掉,编译会失败
this(2025,2,25);
}
public MyData(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
System.out.println("调用第二个构造方法");
}
5.3 对象初始化方式
除了构造方法外,还引入了其他的初始化方式
1. 就地初始化,无参数的构造方法可以用下面这种方法代替,更常见的写法。
public class MyData {
public int year = 2025;
public int month = 2;
public int day = 25;
}
2. 代码块初始化
//代码块初始化
{
year = 2025;
month = 2;
day = 25;
System.out.println("代码块初始化");
}
注意三种初始化的执行顺序.(按下来后面执行的逻辑会覆盖前面的.)
1.就地初始化
2.代码块初始化
3.构造方法
Idea可以快速生成构造方法(按住Alt+Insert)——>constructor(构造方法)


直接打印实例化后的对象:
MyData day1 = new MyData();
System.out.println(day1);
![]()
与数组类似,同为引用类型,可以转为字符串,按住Alt+Insert,使用toString方法。toString是一个特殊的方法,当打印对象的时候,编译器会自动调用toString把对象转成String

public String toString() {
return "MyData{" +
"year=" + year +
", month=" + month +
", day=" + day +
'}';
}
![]()
6. 包package
在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包,有点类似于目录。
当把某个类放到包中的时候, 此 idea就会自动在类的最上方添加package 语句来声明这个类属于哪个包中。
package object;

Explorer——>windows自带的文件资源管理器

1. 包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.bit.demo1 ).
2. 别人写的代码,通常也会使用包组织,要想使用别人的代码,就需要在你当前代码中,导入对应的包
3. 处于不同包的两个类名一样的类,一般不会报错
import java.util.Date;
public class Package {
public static void main(String[] args) {
//使用Java标准库中的Data
Data data = new Data();
}
}
7. 封装
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
通常的原则:
1.哪些属性/方法要private,哪些要public,取决于实际的代码场景~~
2.原则上,属性一般都是设为private.方法有些设为public,有些设为private
private修饰的成员变量,在类外无法访问,如下:
public class Student {
private int id;
private String name;
private int age;
private String gender;
private double score;
}

Java中的成员变量和局部变量的区别:

有些程序,不允许用户看到成员变量是什么,比如性别,这个时候我们使用getter方法获得该成员变量,也可以使用setter方法设置该变量的内容。(IDEA是能自动生成真正写的时候,根据实际情况分析一下,某个属性是否要给外面进行使用)
public String getGender() {
return gender;
}
public void setGender(boolean isMale) {
if(isMale){
gender = "male";
} else{
gender = "female";
}
}
8. static
8.1 基本概念
在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对
象,是所有对象所共享的。而实例属性,创建多个实例时,这些属性就会有多份。
8.2 static修饰成员变量
没有使用static时:
public class Test {
public int n = 10;
public int m = 20;
public static void main(String[] args) {
Test t1 = new Test();
t1.n = 100;
t1.m = 200;
Test t2 = new Test();
t2.n = 1000;
t2.m = 2000;
System.out.println("t1.n=" + t1.n );
System.out.println("t1.m=" + t1.m );
System.out.println("t2.n=" + t2.n );
System.out.println("t2.m=" + t2.m );
}
}

成员变量m使用static修饰时:
public static int m = 20;

Test.m = 2000;
本身m作为类属性,就应该通过类名.的方式来访问的.Java中,拿着对象.的方式,也能使用

静态成员变量特性(也叫类属性)
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3. 类变量存储在方法区当中
4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁,可以近似的看待程序启动到程序结束)(不加static是伴随对象的一生,new出对象开始,到这个对象被gc了为止)
8.4 static修饰成员方法
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的(通过类名.方法调用,此时方法内部不能使用实例属性,也不能使用其他实例方法)。注意:static修饰属性,决定属性存储的位置,static修饰方法,不影响方法存储的位置(方法都是在方法区和类在一起)
静态方法中不能使用this!!!而使用实例方法/属性,本质上都是使用this(实例方法中可以调用静态方法或属性)。有this,则四个属性和方法都能用,但是没有this,只能使用静态属性或者方法。
【静态方法特性】
1. 不属于某个具体的对象,是类方法
2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
3. 不能在静态方法中访问任何非静态成员变量
4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
9. 代码块
9.1 基本概念和分类
使用{} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:
普通代码块
构造块
静态块
同步代码块(后续讲解多线程部分再谈)
9.2 普通代码块
普通代码块:定义在方法中的代码块.
定义方法{}
if{}
while{}
for{}
9.3 构造代码块
构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。执行时机是在new对象的时候,在构造方法之前
public class Student {
private int id;
private String name;
private int age;
private String gender;
private double score;
public Student(){
System.out.println("I am Student init()!");
}
//实例代码块
{
this.name = "子涵";
this.age = 18;
this.gender = "male";
this.score = 4.0;
System.out.println("I am instance init()!");
}
}

9.4 静态代码块
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。在构造代码块之前加static,执行时机是在类加载的时候只执行一次(由于静态的成员,,也能进行“就地初始化"
一般也没有必要专门写静态代码块初始化静态变量)
public class Student {
private int id;
private String name;
private int age;
private String gender;
private double score;
private static String classRoom;
public Student(){
System.out.println("I am Student init()!");
}
static{
}
//实例代码块
{
this.name = "子涵";
this.age = 18;
this.gender = "male";
this.score = 4.0;
System.out.println("I am instance init()!");
}
// 静态代码块
static {
classRoom = "计科2002";
System.out.println("I am static init()!");
}

注意事项
静态代码块不管生成多少个对象,其只会执行一次
静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
实例代码块只有在创建对象时才会执行。

被折叠的 条评论
为什么被折叠?



