Java内部类总结
来源:互联网 发布:巴宝莉女士香水知乎 编辑:程序博客网 时间:2024/04/28 13:28
内部类介绍
可将一个类定义在另一个类定义中。这就叫作“内部类”。–《Think In Java》
内部类是Java中非常有用的特性,也很容易理解,但是在实际项目中却很难灵活运用。就像《Think In Java》中说的那样: “通常,对内部类的需要并不是特别明显的,至少不会立即感觉到自己需要使用内部类”。
成员内部类
成员内部类是最普通的内部类,它作为外部类的一个成员存在,定义形式如下:
public class OutClass { public String Name; private int Age; //成员内部类 public class InnerClass{ public void show(){ Name="Joy";//内部类可以访问外部类成员 Age=18;//内部类可以访问外部类私有成员 System.out.println("name="+Name+",Age="+Age); } } /** * 推荐使用这种方式,实例化内部类 * @return */ public InnerClass getInnerClass(){ return new InnerClass(); }}
public static void main(String[] args) { OutClass outClz=new OutClass(); InnerClass inner=outClz.getInnerClass(); //内部类方法 inner.show(); }
成员内部类总结:
1、成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类;
2、成员内部类中不能存在任何static的变量和方法;
3、内部类可以无限制的访问外部类的所有成员属性和方法;
4、外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象;
5、内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。
局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类。局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。
通过一个简单的例子来了解局部内部类的创建
public class Car { private String carColor; private String carName; public Car(String carColor, String carName) { super(); this.carColor = carColor; this.carName = carName;}public void run(final boolean isGasoline){ //如果汽车有充足的汽油 if(isGasoline){ //局部内部类 class InnerClass{ public void carRun(){ System.out.println("品牌为:"+carName+",颜色为:"+carColor+"汽车跑起来了"); } } new InnerClass().carRun(); }else{ System.out.println("没油了...."); } }}public static void main(String[] args) { Car car=new Car("BMW", "黑色"); car.run(true); }
匿名内部类
做Android开发的(Swing编程中事件注册),应该经常接触到匿名内部类,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。举个Android事件监听的栗子:
Button btn=(Button)findViewById(R.id.but); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } });
总结
1、 匿名内部类是没有访问修饰符的;
2、 new 匿名内部类,这个类首先是要存在的;
4、 匿名内部类是没有构造方法的。因为它连名字都没有何来构造方法。
静态内部类
public class OutClass { public String Name; private int Age; private static String Address; /** * 静态内部类 * @author yyq * */ public static class InnerClass1{ public void displayAddress(){ /** * 静态内部类中只能访问外部类的静态成员或静态方法 */ System.out.println(Address); } } public class InnerClass{ /** * 非静态内部类中可以调用外部类的任何成员 */ public void Display(){ System.out.println(Name+Age+Address); } } /** * 外部类方法 */ public void show(){ //静态内部类 可以直接创建实例不需要依赖于外围类 new InnerClass1().displayAddress(); //非静态内部类需要创建实例 OutClass.InnerClass inner=new OutClass().new InnerClass(); inner.Display(); }}
总结
1、 静态内部类创建不需要依赖于外部类;
2、静态内部类不能使用任何外部类的非static成员变量和方法。
内部类实现多继承
Java不支持类之间的多继承,但是在一定场景下多重继承还是有一定用处的,比如每一个人都是同时继承父亲和母亲两个类,要不然你的身体里怎么能留着父母的血?接下来通过一个小栗子来演示通过内部类实现多继承:
定义一个Father类:
public class Father { /** * 父亲的强壮值为9 * @return */ public int strong(){ return 9; }}
定义一个Monther类:
public class Monther { /** * 母亲的智慧为9 * @return */ public int kind(){ return 9; }}
定义Son类:
public class Son { /** * 定义内部类继承Monther类 * @author yyq * */ public class Mother_1 extends Monther{ public int kind() { return super.kind()+1; } } /** * 定义内部类继承Father类 * @author yyq * */ public class Father_1 extends Father{ public int strong(){ return super.strong()+1; } } /** * 儿子继承自父亲的强壮值+1 * @return */ public int getStrong(){ return new Father_1().strong(); } /** * 儿子继承自母亲的智慧值+1 * @return */ public int getKind(){ return new Mother_1().kind(); }}
最后
水平有限,有不正确的地方,希望大家多指正,谢谢!!!
- java内部类总结
- Java内部类总结
- java内部类总结
- java内部类总结
- java内部类总结
- Java内部类总结
- java内部类总结
- Java内部类总结
- Java内部类总结
- Java内部类总结
- Java内部类总结
- Java内部类总结
- Java内部类总结
- Java内部类总结
- Java内部类总结
- java内部类总结
- java 内部类总结
- Java内部类总结
- 通过多播实现局域网上线用户列表 c++实现
- ionic app 安卓版自动更新
- 关于继承的Activity中初始化及生命周期被调用的顺序
- C#—实验9.1、9.2、9.3和9.4
- Cordova各个插件使用介绍系列(一)—$cordovaSms发送短信
- Java内部类总结
- iOS -- retain,copy,assign及autorelease ,strong,weak
- Linphone之Mediastreamer2分析
- creat 与open 系统调用
- java字段与数据库字段映射
- Linux源代码可以直接移植到Window编译执行
- java反射机制详解
- 物理网卡加入network namespace
- window7下部署Dubbo,zookeeper