一、修饰符
1.访问修饰符(access modifiers),如public/private等
成员的访问控制符
| 同一个类中 | 同一个包中 | 不同包中的子类 | 不同包中的非子类 |
private | yes | | | |
默认(包可访问) | yes | yes | | |
protected | yes | yes | yes | |
public | yes | yes | yes | yes |
public
public即公共的,在Java中public是限制最宽的修饰符,其可修饰类、字段、方法;且可跨类访问,而且可跨包访问
default(默认)
若未添加任何修饰符,即为默认访问权限,即包内可访问。用默认修饰符修饰的类、字段、方法,都只能在同一个包内访问
private
private即私有的,被private修饰的字段和方法只能被该类的对象访问,其他子类、包都不能访问。且只能修饰内部类,不能修饰外部类(修饰外部类IED会直接报错)
将字段用private修饰,从而更好地将信息进行封装和隐藏,只提供set和get方法对类的属性进行存取,有以下优点:
- 属性用private更好地封装和隐藏,外部类不能随意存取和修改。
- 提供方法来存取对象的属性,在方法中可以对给定的参数的合法性进行检验。
- 方法可以用来给出计算后的值
- 方法可以完成其他必要的工作(如清理资源、设定状态)
- 若只提供get方法,而不提供set方法,可以保证属性是只读
protected
用protected可修饰字段、方法,被修饰的字段、方法和构造器都能被在同一个包内访问,也能被其他包的子类访问(到这里是最高权限了,若在其他包内调用实例化的父类protected的方法,将会出错,只有public才用权限这么做)
二、其他修饰符
| 基本含义 | 修饰类 | 修饰成员 | 修饰局部变量 |
static | 静态的、非实例的、类的、 | 只能修饰内部类 | yes | |
final | 最终的、不可改变的 | yes | yes | yes |
abstract | 抽象的、不可实例化的 | yes | yes | |
static
1.static字段
他们是类的字段,但不属于任何一个对象实例
保存区域:它不保存在某个对象实例的内存空间中,而是保存在类的内存区域的公共存储单元
访问方式:即可通过类名直接访问(对应着上述特点),也可以通过实例对象来访问,两种方法的结果都是相同的。(如System.in或System.out就是static)
2.static方法
用static修饰符修饰的方法仅属于类的静态方法,又称类方法。而与之相对应的,未用static修饰的方法为实例方法
与static字段类似,类方法的本质是该方法属于整个类的,不属于某个实例
声明一个方法为static有以下几重含义:
- 非static的方法是属于某个对象的方法,在这个对象创建时,对象的方法在内存中拥有自己专用的代码段。而static的方法是属于整个类的,它在内存中的代码段将随着类的定义而进行分配和装载,不被任何一个对象专有
- 由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,即static方法只能处理本类的static域或调用static方法
- static方法中,不能访问实例变量,不能使用this或super
- 调用这个方法时,应该使用类名直接调用,也可以用某个具体的对象名(如Math.pow(x, 2)用于计算)
上述说得有点抽象,举点简单的例子:
在eclipse中在一个类中写了一个s错tatic的方法调用实例变量编译器直接报
而在此方法中调用此类的static int id,则是合法可运行的
下面两种情况会使用静态方法:
- 一个方法不需要访问对象状态,其所需参数都是通过显式参数提供(如Math.pow)
- 一个方法只需要访问类的静态域
3. import static
在import 包的前也可加上static修饰符,其含义为导入此包内的静态成员,不需要类名或者任何对象,如:
import static java.lang.System.*;
out.println();
System.out.println();
//上两条语句等价
final
1.final类
若一个类被final修饰符所修饰和限定,说明这个类不能被继承,即不能有子类
2.final方法
若一个方法被final修饰符所修饰,则这个方法不能被子类所覆盖
3.final字段及final局部变量
- final字段、final局部变量(方法中的变量):它们的值一旦给定,就不能更改,且是只读量,能且只能被复制一次,而不能被赋值多次
- 若一个字段被static final 两个修饰符所限定时,表示其为常量,如Math.PI(圆周率)
- 赋值时,若定义static final域时,若不给定初始值,则按默认进行初始化;定义final字段时,若不是static的域,则必须且只能赋值一次(可在定义变量时赋初始值,也可在每个构造函数中进行赋值)
abstract
1.abstract类
被abstract修饰符修饰的类被称为抽象类,抽象类是不能被实例化的
2.abstract方法
- 被abstract所修饰的方法叫抽象方法,抽象方法的作用在为所有子类定义一个统一的接口。对抽象方法只需声明,而不需实现,如:abstract void sayHello(String name);
- 抽象类中可以包含抽象方法,也可以不包含抽象方法,但是若类中有abstract方法,则类也必须声明为abstract
- 抽象方法在子类中必须被实现,否则子类也是abstract
package hello;
import java.util.Scanner;
import person.Person;
public class Hello
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
Student astu = new Student("Liming");
astu.sayHello("Xiao Hu");
}
}
abstract class People
{
String name;
People(String aName)
{
this.name = aName;
}
abstract void sayHello(String otherName);
}
class Student extends People
{
Student(String aName)
{
super(aName);
}
void sayHello(String name)
{
System.out.println("Hello " + name + ", I am " + this.name);
}
}