修饰符
Java中修饰符即可也修饰成员可以修饰类或者其他数据类型,修饰符分为权限修饰符和状态状态修饰符两大类。下面我们来详细说明下修饰符的作用及使用。
权限修饰符
可见,public具有最大权限。private则是最小权限。
- 编写代码时,如果没有特殊的考虑,建议这样使用权限:
- 成员变量使用 private ,隐藏细节。
- 构造方法使用 public ,方便创建对象。
- 成员方法使用 public ,方便调用方法。
状态修饰符之final关键字
学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写。那么我们能不能随意的继承API中提供的类,改写其内容呢?显然这是不合适的。为了避免这种随意改写的情况,Java提供了 final 关键字,用于修饰不可改变内容。 final: 不可改变。可以用于修饰类、方法和变量。
- 类:被修饰的类,不能被继承。
- 方法:被修饰的方法,不能被重写。
- 变量:被修饰的变量,不能被重新赋值。
final修饰类
格式:
含义:当前这个类不能有任何的子类。(太监类)
注意:一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写(因为没儿子。)
package cn.itcast.day11.demo01; /* 当final关键字用来修饰一个类的时候,格式: public final class 类名称 { // ... } */ public final class MyClass /*extends Object*/ { public void method() { System.out.println("方法执行!"); } }
final修饰方法
格式:
- 含义:当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写。
- 注意:对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾。
/* 格式: 修饰符 final 返回值类型 方法名称(参数列表) { // 方法体 } */ public abstract class Fu { public final void method() { System.out.println("父类方法执行!"); } public abstract /*final*/ void methodAbs() ; }
final修饰局部变量
基本类型的局部变量,被final修饰后,只能赋值一次,不能再更改。代码如下:
public class PackTest { public static void main(String[] args) { // 声明变量,使用final修饰 final int a; // 第一次赋值 a = 10; // 第二次赋值 a = 20; // 报错,不可重新赋值 // 声明变量,直接赋值,使用final修饰 final int b = 10; // 第二次赋值 b = 20; // 报错,不可重新赋值 } }
引用类型的局部变量
引用类型的局部变量,被final修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量值的修改,代码如下:
扫描二维码关注公众号,回复:
11155563 查看本文章
public class PackTest { public static void main(String[] args) { // 创建 User 对象 final User u = new User(); // 创建 另一个 User对象u = new User(); // 报错,指向了新的对象,地址值改变。 // 调用setName方法 u.setName("张三"); // 可以修改 } }
final修饰成员变量
对于成员变量来说,如果使用final关键字修饰,那么这个变量也照样是不可变。
1. 由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值了。
2. 对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值。二者选其一。
3. 必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值。
显示初始化:
public class PackTest { final String USERNAME = "张三"; private int age; }
构造方法初始化:
public class PackTest { final String USERNAME; private int age; public PackTest(String username, int age) { this.USERNAME = username; this.age = age; } }
状态修饰符之static关键字
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。被static修饰的属性称之为类属性,被static修饰的方法称之为类方法或者静态方法。
类属性、类方法的设计思想
- 类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些属性不因对象的不同而改变,将这些属性设置为类属性。相应的方法设置为类方法。
- 如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。推荐使用类名调用静态方法
使用范围:
- 在Java类中,可用static修饰属性、方法、代码块、内部类
被修饰后的成员具备以下特点:
- 随着类的加载而加载
- 优先于对象存在
- 修饰的成员,被所有对象所共享
- 访问权限允许时,可不创建对象,直接被类调用
static的访问特点
非静态的成员方法
- 能访问静态的成员变量
- 能访问非静态的成员变量
- 能访问静态的成员方法
- 能访问非静态的成员方法
静态的成员方法
- 能访问静态的成员变量
- 能访问静态的成员方法
总结成一句话就是:
- 静态成员方法只能访问静态成员