内部类
来源:互联网 发布:和讯黄金软件 编辑:程序博客网 时间:2024/06/05 02:44
内部类需要遵守以下守则:
1.内部类的类名只用于定义它的类或者语句块之内,在外部引用时必须给出带有外部类名的完整名称。
2.内部类的名字不允许与外部类的名字相同。
3.内部类可以是抽象类或接口,若是接口,则可以有其他内部类实现。
按照内部类是否含有显示的类名把内部类分为1.实名内部类 2.匿名内部类
实名内部类
实名内部类格式:
[类修饰词表] class 类名 [extedns 父类名][implements 接口名列表]{
类体
}
访问实名内部类的静态属性成员及非静态属性成员:
静态成员:外部类名.实名内部类名.静态成员
非静态成员:实名内部类实例对象.成员
根据类修饰词是否含有static可将实名内部类分为两类
静态实名内部类:
实例格式:
new 外部类名.实名内部类名(构造器参数)
非静态实名内部类:成员变量倘若是静态的,则必须同时含有final属性,但是成员方法不能含有静态属性
实例格式:
外部类实例对象.new 实名内部类名(构造参数)
示例代码:
package com.v512.java;import com.v512.java.Jout.class1;import com.v512.java.Jout.class2;class Jout { static class class1 { final static String name = "class1"; double cal(double d) { return d * d; } } class class2{ //非静态内部类成员变量可使用static修饰 final static String name = "class2"; //方法cal()不能使用static修饰 :The method cal cannot be declared static; static methods can only be declared in a static or top level type double cal(double d){ return d*d; } }}public class InnerClass { public static void main(String[] args) { //new 外部类名。实名内部类名(参数列表) class1 a = new Jout.class1(); Jout jout = new Jout(); //new 外部类实例对象。new 实名内部类名(参数列表) class2 b = jout.new class2(); class2 c = new Jout().new class2(); //访问内部类class1的name属性 System.out.println(Jout.class1.name); System.out.println(a.name); //访问内部类class2的name属性 System.out.println(Jout.class2.name); System.out.println(b.name); }}
内部类与外部类具有同名成员变量时成员变量的访问方式:
访问内部类成员变量:this.成员变量
访问外部类成员变量:外部类名.this.成员变量
package com.v512.java;interface JInnerInterface{ void sayHello();}public class InnerClass3 { private int num = 10; public class JInner3{ private int num = 100; public void show(int num){ num++; this.num++; //内部类成员变量 InnerClass3.this.num++; //访问外部类成员变量 System.out.println(num); System.out.println(this.num++); System.out.println(InnerClass3.this.num); } } JInner3 inner3 = new JInner3(); public void test (int n){ inner3.show(n); } public static void main(String[] args) { InnerClass3 class3 = new InnerClass3(); class3.test(1000); }}
匿名内部类
匿名内部类格式:
new 父类名(父类构造器的参数列表){
类体
}
示例代码:
package com.v512.java;abstract class cl{ int num; public cl(int num) { super(); this.num = num; } public abstract int getNu();}public class InnerClass2 { public static void main(String[] args) { cl c = new cl(7) { /** * 1.定义一个匿名类对象 * 2.此类继承与抽象类cl * 3.匿名类对象向上转型为cl类对象 */ @Override public int getNu() { // TODO Auto-generated method stub System.out.println("aa"); return 1; } }; System.out.println(c.getNu()); }}
内部类的作用
1.进一步实现多重继承
示例代码:
package com.v512.java;class superA{ public String hello(){ return "hello"; }}class superB{ public String world(){ return "world"; }}public class InnerClass4 { private class JInnerA extends superA{} private class JInnerB extends superB{} public String hello(){ return new JInnerA().hello(); } public String world(){ return new JInnerB().world(); } public static void main(String[] args) { System.out.println(new InnerClass4().hello()+" "+new InnerClass4().world());//可以同时使用superA类和superB类的方法 }}
2.更好的解决接口与父类方法的同名冲突
示例代码:
package com.v512.java;interface JA{ void name();}class JB{ void name(){ System.out.println("bb"); }}public class InnerClass5 extends JB{ private class JInner implements JA{ @Override public void name() { // TODO Auto-generated method stub System.out.println("aa"); } } public static void main(String[] args) { InnerClass5 class5 = new InnerClass5(); class5.name(); //JB类的name方法 class5.new JInner().name(); //JA类的name方法 }}
3.隐藏程序实现的细节
4.无条件的访问外部类的成员
0 0
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 自定义图可以放大和缩小
- POJ1088滑雪(dp)
- css3 动画之transition,animation
- 无题 (配音乐)
- Linux ubuntu 14.04 环境下Qt creator中添加OpenCv2.4.9
- 内部类
- listView进行CheckBox的全选、反选
- 基本寄存器简介
- 剑指offer中的面试题替换空格
- C语言模拟实现C++的继承与多态
- Number Complement问题及解法
- LeetCode 516. Longest Palindromic Subsequence
- 小白学前端Day2
- 2017.4.16 级数求和 思考记录