访问修饰符:public、protected、private
非访问修饰符:strictfp、final、abstract
1、访问修饰符:
a、类访问(4个)
A类可以访问B类是指A类可以实现以下操作之一:
- 创建B的实例
- 扩展类B(称为B的子类)
- 访问类B中的某些方法和变量,这依赖于这些方法和变量的访问控制。
默认访问:包级别访问,只有在同一个包中才会看得见有default的类。
public访问:如果试图使用的共有类与你正在编写的类,位于不同的包中,仍然需要导入这个共有类
final访问:不能扩展。不能继承。
abstarct访问:即使有一个方法是抽象的,整个类也是必须声明为抽象的,一定不要忘记,该方法声明结尾处的分号。
abstract class Car{ // 这里因为有抽象方法所以也抽象
private int speed;
public abstract void gofast();//这里是分号
public int gofast(){
return speed;
}
}
b、方法和变量访问:
- 一个类中的方法代码是否能够访问另一个类的成员
- 一个子类是否能够继承其父类的成员
1)、公有成员:public
访问方法:
- 调用在同一个类中声明的方法
- 调用采用该类引用的方法
- 调用一个被继承的方法
2)、私有成员:private
只属于这个类,出了这个类任何关于被private修饰的成员的调用都是错误的。私有成员对该成员自己类以外的任何代码来说都是不可见的。
重写依赖与继承:private不能继承所以不能重写
3)、保护和默认成员:
区别:默认成员是包级的,出了包=private,对包外也就不可见了。
保护是==继承的:子类只能通过继承看到受保护的成员。一旦包外子类继承保护成员,这个子类就成了private的了。
4)、局部变量和访问修饰符:
可以肯定用访问修饰符声明的所有局部变量都将无法编译。
只有一个修饰符可应用于局部变量-----final
2、非访问修饰符:
- 最终方法:防止方法在子类中重写
- 最终参数:方法参数相当于局部变量,只能用于final修饰,所以为最终参数。
- 抽象方法:抽象类的第一个具体子类必须实现父类的所有抽象方法。抽象类可以没有抽象方法,但有抽象方法的类一定是抽象类。一个方法不能同时标识abstract和final,或abstract和private。抽象方法也不能表示为synchronized、strictfp、native。static 同步方法:synchronized只能用来修饰方法和代码块。能够与访问修饰符任意搭配使用、可以与final一起,但不能与abstract组合。
- 本地方法:native只能用于方法
- Strictfp方法:用作类和方法的修饰符,变量永远不能声明为strictfp
3、变量声明:
1)、实例变量:
可以使用访问修饰符
可以final
可以transient
不可以abstract
不可以synchronized
不可以Strictfp
不可以native
2)、局部变量:位于栈上,而不是堆上。如果局部变量是对象的引用,该对象自己将被创建在堆上,没有栈对象,只有栈变量。
3)、最终变量:没有最终对象,只会有最终的引用。最终的实例变量必须在使用前赋初值。
final int x=10; //x的值是不能改变的
final Date x = new Date(); // x.setYear(2008); 可以修改值
注意经典:
interface Foo{ //接口变量用于藏着public static final 所以代码会产生编译错误
Integer x=new Integer(5);
}
class FooImpl implements Foo{
void dostuff(){
x=new Integer(5);
}
}
4)、transient变量:串行化
5)、volatile 只能应用与实例变量
4、静态变量和方法:属于类,不属于任何实例,static修饰的方法和变量与没有实例化的对象的成员是互不可见的。Static的方法不能访问成员变量。Static只能看见类的类型和被static修饰的。其他看不见。实例化的对象可以调用static修饰的但只有一份拷贝。
- static 不能访问实例变量
- static 不能访问非静态方法
- static 能够访问静态方法或变量
静态方法不能重写,但可重新定义
5、声明规则:
1)、源文件、包声明和导入语句
2)、格式化 main():没有正确的main方法是运行时错误,而不是编译时的错误。
Jvm的启动 main()方法的签名:public static void main(String[] arg) 除此之外main没有任何特出的地方
6、接口设计
Runnable的接口方法: public void run(){}
接口看作100%的抽象类,不同是:接口的变量是public static final的。方法是public abstract的,接口本身是public abstract的
设计接口的类:
- 如果类不是abstract的则需要,设计实现所有的接口的public方法
- 类是abstract的则可以让非抽象的子类,来实现。
- 抽象接口隐藏public设计类可不能缺少public,否则就成了默认访问修饰符了。
- 类 只能扩展(继承)一个类,可以实现(设计)多个接口
- 接口 扩展(继承多个接口),不可实现(设计)任何东西