Jdbc3知识要点(内部类)
一、 内部类定义:在一个类的内部声明的类
Ⅰ、内部类的作用:
①内部类可以访问外部类中的私有变量,使得外部创建该内部类后可以获得外部类私有属性信息
②在设计程序时,当一个程序依赖另个程序时,把依赖于的程序设为外部类,依赖的程序设为内部类。
Ⅱ、 内部类的字节码文件名形式:Outer$Inner.class,是机器自动产生的
Ⅲ、 内部类的使用:①Outer.Inner inner = new Outer()newInner();此时导入Outer包即可
②Outer o=new Outer();Inner inner=o.new Inner();此时导入Outer.Inner包
Ⅳ、注意:
①内部类可以使用外部类变量
②外部类可以使用私有内部类,当内部类变为private后也只能在外部类内创建内部类对象然后调用内部类方法,使用外部类时外部不知道内部类存在
③内部类调用外部类属性:当外部类属性名和内部类属性名相同时调用形式Outer.this.属性名(而调用本身这一属性形式this.属性名),不同时直接调用;
④内部类调用外部类方法hi()或Outer.hi(),调用结果相同。
⑤外部类中调用内部类方法:
在外部类方法中 中调用 ,调用形式 Inner inner=new Inner();
Inner.sayHi();
结构如下:
************************************************************************************************************************
package yaoxia.jdbc3;
public class Outer {
private String name="rose";
public void hi(){
//外部类调用内部类
Inner inner=new Inner();
inner.name="lily";
inner.sayHi();
System.out.println("Hi!");
}
//内部类
public class Inner{
String name="alex";
public void sayHi(){
//内部类访问外部类中的私有变量name(引用外部类同名属性 )而静态属性使用:Outer。name
System.out.println("Hello!"+Outer.this.name);
System.out.println("Hello!"+this.name);//引用内部类与外部内同名属性
//内部类方法调用外部类方法
hi();
//=Outer.this.hi();两种调用结果同
}
}
}
*********************************************************************************************************************************
二、 静态内部类
Ⅰ、静态内部类对象创建方式:
Outer2.Inner2 inner=new Outer2.Inner2();
Ⅱ、注意:
在静态内部类调用外部类中方法、普通属性时外部类的普通属性和方法要用static来修饰,调用方法形式:Outer2.方法名;
调用外部类属性时,当外部类同内部类属性名相同时调用属性形式:Outer2.属性名,当属性名不同时直接用不用加Oter2.
结构如下:
************************************************************************************************************************************
package yaoxia.jdbc3;
public class Outer2 {
private static String name;
//静态内部类
public static class Inner2{
String name;
public void say(){
//调用外部类同名属性
System.out.println("static!"+Outer2.name);
}
}
}
*****************************************************************************************************************************
三、 系统的设计理念:回调函数(holk),回调函数OnLight依赖于外部类Gui,Gui不存在时,OnLight可以存在于一个类内,但其存在无意义。
结构如下:
***********************************************************************************************************************************
package yaoxia.jdbc3;
public class Button {
public void click(OnClickListener listener){
listener.onClick();
}
}
-----------------------------------------------------------------------------------------------------
package yaoxia.jdbc3;
public interface OnClickListener {
public void onClick();
}
------------------------------------------------------------------------------------------------------
package yaoxia.jdbc3;
public class Gui {
/*//接口指向实现类
OnClickListener bomb=new OnClickListener(){
@Override
public void onClick() {
System.out.println("Bomb!");
}
};*/
public void start(){
Button button=new Button();
button.click(new OpenLight());
Button button1=new Button();
button1.click(new Bom() );
}
private class OpenLight implements OnClickListener{
@Override
public void onClick() {
System.out.println("Turn on the lights!");
}
}
private class Bom implements OnClickListener{
@Override
public void onClick() {
System.out.println("Bomb!");
}
}
}
************************************************************************************************************************************
四、 局部内部类:定义在方法内,但该类不该写访问修饰符(private,public,protected),作用域在方法内.
作用:
①解决一个复杂问题时,想创建一个类来辅助你的解决方案,但又不希望这个类被其他类调用时可以使用局部内部类
②在方法内部实现一个接口,并返回对其的引用
注意:
Ⅰ、内部类在使用方法中其他变量时,变量要申明为final。
Ⅱ、局部内部类可调用外部方法,但局部内部类在外部类方法中不能被创建
结构如下:
************************************************************************************************************************************
package yaoxia.jdbc3;
public class Outer3 {
public void method(){
System.out.println("External method!");
}
public void content(){
//局部内部类
class Inner{
public void outPut(){
method();//局部内部类调用外部类中的方法
System.out.println("Local inner classes!");
}
}
//局部内部类对象的创建
Inner inner=new Inner();
inner.outPut();
}
************************************************************************************************************************************
五、 匿名局部内部类:没名的局部内部类,可实现接口指向实现类。
注意:接口一般情况下不能实例化,但当后面有大括号(里面实现了接口的所有方法)时可以new个对象,但表示的是它的实现类。
结构如下:
************************************************************************************************************************************
//匿名内部类继承了Object,重写了toString方法
public void method(){
Object obj=new Object(){
@Override
public String toString() {
return "Override the toString!";
}
};
System.out.println(obj);
}
---------------------------------------------------------------------------------
package yaoxia.jdbc3;
public class Gui {
//接口指向实现类
OnClickListener bomb=new OnClickListener(){
@Override
public void onClick() {
System.out.println("Bomb!");
}
};
public void start(){
Button button=new Button();
button.click(new OnClickListener(){
@Override
public void onClick() {
System.out.println("Turn on the lights!");
}
});
Button button1=new Button();
button1.click(bomb);
}
}
************************************************************************************************************************************
六、类的泛型: