11.2 final变量
1.final关键字用于变量声明,一但该变量被设定,就不可以再改变该变量的值。 语句: final double PI= 3.14; 2.final除了可以修饰基本数据类型的常量外,还可以修饰对象引用。 3.被定义为final的常量需要定义时使用大写字母命名,并且中间需要使用下划线进行连接。 4.被定义为final的对象引用只能指向唯一一个对象,不可以将它指向其他对象,但是一个对象本身的值却是可以改变的。通过将常量声明为static final,可使常量真正做到不可改变。 5.在Java中定义全局常量,通常使用public static final修饰。 6.将方法的参数定义为final类型,这预示着无法在方法中更改参数引用所指向的对象。11.3 final方法
1.方法定义为final类型可以防止任何子类修改该类的定义与实现方式,且效率要高于非final方法。 2.设置为private修饰符的方法子类无法访问,所以定义为private的方法隐式被定义为final类型,无需将private的方法再定义为final类型。11.4 final类
定义为final的类不能被继承,语法: final 类名{} 如果将某个类设置为final形式,则类中所有方法都被隐式设置为final形式,但final类中的成员变量可以被定义为final或非final形式。11.5 内部类
在类中再定义一个类,则将在类中再定义的那个类称为内部类。11.5.1 成员内部类
1.一个类中使用内部类可以在内部类中直接存取其所在类的私有成员。可以随意使用外部类的成员方法和成员变量。 2.内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。 3.外部类不可以直接访问内部类成员变量,内部类实例化操作必须在外部类或外部类的非静态方法中实现。 OuterClass out=new OuterClass(); OuterClass.innerClass in=out.doit();OuterClass.innerClass in2=out.new innerClass();
2.内部类向上转型为接口
1.如果将一个权限修饰符为private的内部类向上转型为其父类对象,或者直接向上转型为一个接口,在程序中就可以完全隐藏内部类的具体实现过程。仅留下一个接口和一个外部类,这是内部类最基本的用途。?2.非内部类不能被声明为private或protected访问类型:
对于个方法而言,他的上层是类,再上层是包,所以方法有由类继承得到的权限,由包"继承"得到的权限,和公共权限 而对于类而言,他的上层就是包,所以一个类只有"继承"自包的权限和公共的访问权限,并没有子类继承的概念 一个类要是有权限继承另一个类,那么要么他们同包要么那个类是public的,不然就已经没有机会访问了,更别提继承了,所以protected当中的子类部分是没有意义的,而剩下的同包,只需要默认权限就可以,所以用protected是多余的
3.使用this关键字获取内部类与外部类的引用
如果在内部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字。public class TheSameName {
private int x;
private class Inner{
private int x=9;
public void doit(int x){
x++; //调用形参x
this.x++; //调用内部类变量x
TheSameName.this.x++; //调用外部类变量x
}
}
} 内部类对象与外部类对象在内存中的分布情况:
11.5.2 局部内部类
可在类的方法中或任意的作用域中定义内部类。!方法中定义的内部类只能访问final类型的局部变量
因为java中规定,内部类只能访问外部类中的成员变量,不能访问方法中定义的变量,如果要访问方法中的变量,就要把方法中的变量声明为final(常量)的,因为这样可以使变量全局化,就相当于是在外部定义的而不是在方法里定义的11.5.3 匿名类
return new A(){ ```//内部类体 }; 匿名内部类编译后,会产生以“外部类名$序号”为名称的.class文件。 在使用匿名内部类时,要记住以下几个原则:
匿名内部类不能定义任何静态成员、方法和类。
匿名内部类不能是public,protected,private,static。
只能创建匿名内部类的一个实例。
因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
package hqs;
interface pr{
void show();
}
public class AdvancedPractice {
//2.在类中通过返回值为pr的方法中创建一个匿名内部类
public pr doit(){
return new pr(){
@Override
public void show() {
// TODO 自动生成的方法存根
System.out.println("匿名内部类2");
}
};
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("主函数");
//1.直接在主函数中创建匿名内部类
new pr(){
public void show(){
System.out.println("匿名内部类");
}
}.show();
//2.实例化外部类,并通过doit()方法得到匿名内部类
AdvancedPractice ap = new AdvancedPractice();
pr pr1 = ap.doit();
pr1.show();
}
}
11.5.4 静态内部类
内部类前添加static,特点: 1.如果创建静态内部类的对象,不需要其外部类的对象 2.不能从静态内部类的对象中访问非静态静态外部类的对象。 3.非静态内部类不可以声明静态成员。11.5.5 内部类的继承
public class OutputInnerClass entends ClassA.ClassB{//继承内部类b
public OutputInnerClass(ClassA a){
a.super();
}
}
class ClassA{
class ClassB{
}
}
第十二章 异常处理
12.1 异常概述
1.异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。2.Jav