Java中class的修饰及成员变量的修饰

本文详细介绍了Java中类及方法的各种修饰符,包括public、abstract、final等,并解释了它们的应用场景。同时,文章还阐述了变量的修饰符如static、final,以及方法的重载和静态方法的特点。

Java抽象类的构造方法和普通类的构造方法一样都是用来初始化类
只是抽象类的构造方法不能直接调用,因为抽象类不能实现实例
但是一旦一个普通类继承了抽象类,便也可以在构造函数中调用其抽象类的构造函数,也可以使用其方法
可以理解为:抽象类就是一个不能实例化的类,不过如果方法加了abstract那么就必须在子类里面重写了

类的修饰符整合


一.类
类的修饰符:
Public : 可以在其他任何类中使用,默认为统一包下的任意类。
Abstract: 抽象类 ,不能被实例化,可以包含抽象方法,抽象方法没有被实现,无具体功能,只能衍生子类。
Final : 不能被继承。


二.变量
变量修饰符:
一个类的成员变量的声明必须在类体中,而不能在方法中,方法中声明的是局部变量 。
1.可访问修饰符:
2.static :类变量 :一个类所拥有的变量,不是类的每个实例有的变量。类变量是指不管类创建了多少对象,系统仅在第一次调用类的时候为类变量分配内存,所有对象共享该类的类变量,因此可以通过类本身或者某个对象来访问类变量。
3.final :常量 。
4.volatile :声明一个可能同时被并存运行的几个线程所控制和修改的变量。
实例变量 :和类变量对应,即每个对象都拥有各自独立的实例变量。


三.方法:(和变量对象分为实例方法和类方法,并用有无static 修饰区别)
类方法 :使用static 关键字说明的方法
1. 第一次调用含类方法的类是,系统只为该类创建一个版本,这个版本被该类和该类的所有实例共享。
2. 类方法只能操作类变量,不能访问实例变量。类方法可以在类中被调用,不必创建实例来调用,当然也可以通过对象来调用。
实例方法 :实例方法可以对当前对象的实例变量操作,而且可以访问类变量。
方法可以重载 ,要求:方法名相同,但是参数必须有区别。(参数不同可以使类型不同,顺序不同,个数不同)
方法的返回类型:若无返回类型,则声明为void.
方法中的变量作用域:
1. 成员变量:整个类。
2. 局部变量:定义起到方法块结束为止。
3. 方法参数:整个方法或者构造方法。
4. 异常处理参数:参数传递给异常处理方法。
构造方法 :和类同名的方法。为新建对象开辟内存空间后,用于初始化新建的对象。不能用对象显式的调用。
静态初始化器 :格式:static{< 赋值语句组>}
静态初始化器与构造方法的区别: 
 

静态初始化器

构造方法

对类的静态域初始化

对新建的对象初始化

类进入内存后,系统调用执行

执行new 后自动执行

属特殊语句(仅执行一次)

属特殊方法


方法的修饰符:
抽象方法: 用abstract 修饰,只有声明部分,方法体为空,具体在子类中完成。
类方法: 静态方法,用static 修饰,
1. 调用时,使用类名作为前缀,而不是类的某个实例对象名
2. 不能被单独对象拥有,属于整个类共享。
3. 不能处理成员变量。
最终方法 :用final 修饰,不能被子类重新定义的方法。
本地方法 :用native 修饰的方法,表示用其他语言书写的特殊方法,包括C ,C++ ,FORTRAN ,汇编语言等。

 

http://blog.youkuaiyun.com/yan8024/article/details/6426451

<think>好的,我现在需要回答用户关于Java中final修饰成员变量和类变量的规则及要求的问题。首先,我需要回顾用户提供的引用内容,确保答案准确并涵盖所有关键点。用户引用了多个资料,其中提到final修饰变量的不同情况。例如,引用3指出final变量一旦初始化后值不能改变,用于常量定义、保证不变性和优化性能。引用4提到成员变量必须在创建对象前赋值,可以通过定义时赋值、构造器赋值或set方法(但根据Java规则,set方法可能不适用,因为final变量只能赋值一次)。引用5强调final修饰成员变量必须显式初始化,否则编译错误。 接下来,我需要区分成员变量和类变量(即静态变量)。成员变量属于实例,而类变量属于类。对于final成员变量,初始化方式包括定义时赋值、构造器赋值或初始化块。而对于final类变量,必须在定义时或在静态初始化块中赋值,因为它们在类加载时初始化,早于对象创建。 需要注意,用户可能混淆了成员变量和类变量的初始化要求。例如,类变量不能在构造器中初始化,因为构造器属于实例层面。此外,正确使用final可以确保线程安全或不可变对象,这也是用户可能关心的应用场景。需要验证每个规则是否符合Java规范,比如是否允许在方法中为final变量赋值(不允许,只能在声明、构造器或初始化块中)。同时,引用4提到三种赋值方式,但set方法可能不适用,因为final变量只能赋值一次,而set方法可能在对象生命周期中被多次调用,导致编译错误。 总结时,需分点列出成员变量和类变量的规则,强调初始化时机和赋值方式的不同,并举例说明。此外,相关问题应引导用户深入理解final的应用,如内存模型影响、设计模式中的使用等。</think>### Java中final修饰成员变量和类变量的规则及要求 #### 一、final修饰成员变量(实例变量) 1. **初始化要求** - final成员变量必须在对象创建**前**完成初始化[^4][^5]。 - 初始化方式: - **定义时直接赋值**:`private final int value = 10;` - **构造方法中赋值**:所有构造方法必须包含对该变量的赋值[^4]。 - **实例初始化块中赋值**:`{ value = 10; }` ```java public class Example { private final int a = 5; // 方式1:定义时赋值 private final int b; private final int c; { c = 10; } // 方式3:实例初始化块赋值 public Example(int b) { this.b = b; // 方式2:构造方法赋值 } } ``` 2. **不可修改性** - 一旦赋值后,值不可更改,否则编译报错[^3][^4]。 3. **禁止setter方法** - 若通过普通方法(如setter)赋值,会导致编译错误,因为final变量只能被赋值一次[^4]。 --- #### 二、final修饰变量(静态变量) 1. **初始化要求** - final类变量必须在**类加载时**完成初始化[^3][^5]。 - 初始化方式: - **定义时直接赋值**:`private static final int MAX = 100;` - **静态初始化块中赋值**:`static { MAX = 100; }` ```java public class Constants { private static final int MAX; // 方式1:定义时赋值 static { MAX = 100; // 方式2:静态初始化块赋值 } } ``` 2. **不可修改性** - 与成员变量相同,初始化后值不可变[^3]。 --- #### 三、特殊规则 1. **对象类型变量** - final修饰对象变量时,**引用不可变,但对象内部属性可修改**[^2][^3]。 例如: ```java final List<String> list = new ArrayList<>(); list.add("Hello"); // 允许操作对象内部 list = new ArrayList<>(); // 编译错误:引用不可更改 ``` 2. **编译时常量优化** - 若final变量是基本类型或字符串且赋值表达式为常量,编译器会直接替换值到使用位置[^3]。 --- #### 四、对比总结 | 类型 | 初始化时机 | 允许的初始化方式 | 作用范围 | |------------|--------------------|--------------------------------|--------------| | 成员变量 | 对象创建前 | 定义赋值、构造方法、实例块 | 对象实例级别 | | 类变量 | 类加载时 | 定义赋值、静态初始化块 | 类级别 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值