java学习笔记 第二篇 核心技术(二)

2014-11-23 23:26:17 · 作者: · 浏览: 4
类包(import关键字) 1.使用import关键字导入包 语法: import com.lzw.*;//指定com.lzw包中的所有类在程序中可以使用 import com.lzw.Math;//指定com.lzw包中的Math类在程序中可以使用 2.使用import导入静态成员 语法: improt static 静态成员

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。
  只能创建匿名内部类的一个实例。
一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
  因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

内部类只能访问外部类的静态变量或静态方法。

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