【Java 入门 Day11】 三大修饰符(上):abstractstatic 篇
家人们谁懂啊!Java 里这三个修饰符简直是新手的 “重灾区”,每次写代码碰到 abstract、static、final,都像在玩 “抽象盲盒”,一不小心就踩坑报错。今天先把前两个扒得明明白白,看完保证你再也不被它们搞心态!
一、abstract:Java 里的 “嘴强王者”,只画饼不干活
abstract 翻译过来是 “抽象的”,放在 Java 里,就是那种只定规矩、不干活的 “甩手掌柜”。它有俩绝活:修饰类、修饰方法,咱们一个个唠。
1. abstract 修饰类:只能被继承,不能 new 对象的 “抽象网红”
被 abstract 修饰的类,叫抽象类。你可以把它理解成只有 “人设”、不能直接出道的虚拟偶像:
- 语法就是
abstract class 类名 {},编译后也会生成正常的.class 文件,看着和普通类没差。 - 但它不能自己 new 对象!就像虚拟偶像不能线下真人营业,只能让子类继承它,子类来实现具体功能。
- 抽象类里啥都有:成员变量、普通方法、构造方法,甚至抽象方法。构造方法是干嘛的?给子类继承的时候用的,子类创建对象时,得先调用父类的构造方法,相当于 “先把虚拟偶像的人设初始化,再让子类出道”。
举个栗子:你定义了一个 “动物” 抽象类,里面有 “吃饭”“睡觉” 的方法,但不写具体实现,因为猫和狗吃饭睡觉的方式不一样,得让子类自己实现。
2. abstract 修饰方法:只有签名、没有实现的 “画饼大师”
被 abstract 修饰的方法,就是抽象方法,堪称 Java 里的 “画饼天花板”:
- 它只有方法声明,连大括号都没有!语法长这样:
访问修饰符 abstract 返回值类型 方法名(形参列表);,就像老板只说 “这个需求下周上线”,不告诉你具体怎么做。 - 抽象方法只能放在抽象类里!你总不能让一个 “实锤老板” 只画饼不干活吧?
- 重点来了:子类继承抽象类后,要么把所有抽象方法都实现(相当于接下老板的饼,把活干了),要么子类自己也变成抽象类,继续画饼甩锅。
3. abstract 的终极作用:强制你用多态!
为啥要搞抽象类和抽象方法?说白了就是逼你用多态! 就像你定义一个 “动物” 抽象类,让猫、狗、鸟都继承它,然后用 “动物” 类型的引用去接收子类对象,调用同一个方法时,不同子类有不同实现,这就是多态。
二、static:Java 里的 “共享充电宝”,全类共用不内卷
static 翻译过来是 “静态的”,它在 Java 里就是 **“全类共享、一次定义、处处可用” 的共享资源 **,修饰属性、方法、代码块都有讲究,咱们一个一个说。
1. static 修饰属性:全类共用的 “共享充电宝”
被 static 修饰的属性,叫静态属性 / 类变量,堪称 Java 里的 “共享充电宝”:
- 它不属于某个对象,而是属于整个类!就像教室的共享充电宝,全班同学都能用,不是某个人的私有物品。
- 语法:
访问修饰符 static 数据类型 属性名;,或者直接赋值访问修饰符 static 数据类型 属性名 = 值;,访问修饰符和 static 谁在前谁在后都行,没那么多规矩。 - 访问方式:
对象名.静态属性名:不推荐!就像你用自己的手机号去借教室的共享充电宝,容易让人误会是你私有的。类名.静态属性名:推荐!直接通过类名访问,一眼就知道这是全类共享的。
给你看个真实案例,秒懂静态属性的特点:
java运行
public class TestStatic{ public static void main(String[] args){ MyClass mc1 = new MyClass(); MyClass mc2 = new MyClass(); mc1.value = 50; // 实例变量,每个对象各有一份,互不干扰 mc1.b = 48; // 静态变量,全类共用,改一个全类都变 System.out.println("mc1.value="+mc1.value); // 输出50,只改了mc1的value System.out.println("mc1.b="+mc1.b); // 输出48,改了共享的b System.out.println("mc2.value="+mc2.value); // 输出10,mc2的value没被改 System.out.println("mc2.b="+mc2.b); // 输出48,共享的b被mc1改了,mc2也跟着变 } } class MyClass{ int value = 10; // 实例变量:每个对象单独一份,各玩各的 static int b = 30; // 静态变量:全类只有一份,谁改了大家都用新值 }你看,实例变量是 “私人充电宝”,各用各的;静态变量是 “教室共享充电宝”,一个人借了用了,所有人都得用用过的。
2. static 修饰方法:只能用共享资源的 “社恐打工人”
被 static 修饰的方法,叫静态方法,特点就是只能用静态的东西,不能碰非静态的资源,像个社恐打工人:
- 语法:
访问修饰符 static 返回值类型 方法名(形参列表) { 方法实现 },和普通方法差不多,多了个 static。 - 访问方式:
类名.静态方法名(实参);,推荐直接用类名调用,别用对象名,容易搞混。 - 注意事项(新手高频踩坑点):
- 静态方法里只能直接访问本类的静态成员(静态属性和静态方法),不能直接访问非静态的东西!就像社恐打工人只和同事打交道,不敢碰客户的私人资源。
- 非静态方法里既可以访问非静态成员,也能访问静态成员,相当于社牛,谁都能聊两句。
- 静态方法里不能用
this和super关键字!因为this代表当前对象,super代表父类对象,静态方法属于类,不属于任何对象,根本没有 “当前对象” 这一说。 - 静态方法可以被继承,但不能被重写!就算子类定义了一个和父类一模一样的静态方法,也只是 “隐藏” 了父类的方法,不是多态的重写,调用的时候还是看引用的类型。
举个例子,你写个静态方法想直接调用非静态的变量,编译器直接给你红波浪线报错,就是这个原因。如果非要在静态方法里用非静态成员,只能 new 个对象,用对象名调用,就像社恐打工人找个中间人帮自己对接客户。
今天先唠到这,abstract 和 static 这俩 “抽象怪” 和 “共享怪” 的套路你 get 到了吗?下一篇咱们扒 final,那个 Java 里的 “终极钉子户”,谁碰谁知道有多倔!
