java中由内部类的概念,虽然我并没有使用过这种类,但是面试的时候曾经见到,现在就记录下内部类的 用处和一些概念吧,
首先内部类能够在自己的类中调用外部类的方法和实例变量,就算那些变量是private修饰的,也能访问
Test2.java
package innerclasstest;
public class Test2 {
private String name ;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
/*
*内部类InnerClass
*在内部类的构造函数中调用外部类的实例变量
*/
class InnerClass{
public InnerClass(){
setName("harry");;
age = 23;
}
public void show() {
System.out.println("name="+getName()+",age="+getAge());
}
}
public static void main(String [] args){
//内部类的实例通过外部类的实例调用new 字符创建
Test2 test2=new Test2();
//创建引用变量的时候也需要外部类
Test2.InnerClass innerClass=test2.new InnerClass();
/*
* 调用内部类的方法,
*/
innerClass.show();
}
}
然后是关于类的继承问题在外部类已经继承或者实现某个类或者借口时,内部类可以在继承一个其他的 类,而内部类又可以调用外部类的方法和实例变量,这样看来是不是有点多继承的意思?看一下下面的实例,
父类Father1.java
public class Father1 {
public String doSomething() {
return "我是第一个父类!";
}
}
父类Father2.java
public class Father2 {
public String dothing() {
return "我是第二父类!";
}
}
带由内部类和main方法的Test3.java
public class Test3 extends Father1{
public String dothings() {
return "我是外部类!";
}
class InnerTest extends Father2{
public String doit() {
return dothings()+"其实我是内部类";
}
}
public static void main(String [] args){
Test3 test3=new Test3();
//创建引用变量时 用外部类.内部类 变量名 来定义引用变量
Test3.InnerTest innerTest=test3.new InnerTest();
//外部类调用父类方法
System.out.println("这是外部类Test3调用的 ,"+test3.doSomething());
//外部类调用自己类中方法
System.out.println("这是外部类Test3调用的 ,"+test3.dothings());
/*
*而这时我们希望既能调用外部类的方法,又能调用另一个父类的方法,
* 而这时就需要内部类来完成这项任务
* 调用另一个父类Father2的方法
*/
System.out.println("这是内部类InnerTest调用的 ,"+innerTest.dothing());
//调用在内部类中调用外部类方法的方法
System.out.println("这是内部类InnerTest调用的 ,"+innerTest.doit());
}
}
由此可见,内部类可以实现外部类扩展的功能,而且这种实现很方便维护与修改。
一般来说 内部类有四种定义方式:⑴类成员内部类 ⑵局部内部类(即定义在方法中的内部类)
⑶匿名内部类 ⑷静态内部类
⑴类成员内部类 :定义在外部类的类中,方法如同上面代码Test2.java中一样
⑵局部内部类 : 定义在外部类的方法体中,通常我们需要在方法中使用某些外部类无法使用的功能,又 不想这个类是公共可用的,而且希望它能够完成任务即离去(即作用域只在方法内部),我们就需要用到局部内部类。
⑶匿名内部类 :顾名思义就是没有命名的内部类,这样的内部类通常会直接new 一个存在的类然后在后 面的方法体中定义该内部类的逻辑。
// 匿名内部类 这里的ActionListener是一个接口
ActionListener actionListener1=new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("do something!");
}
};
⑷静态内部类 :就是用static修饰的内部类,又叫嵌套内部类,一般来说静态类都是不需要创建对象就 可以以调用静态方法和静态变量的,而静态内部类是可以自己创建实例,不需要依赖外部类,它可以直接 调用外部类的静态方法和静态变量 还有自己类中的静态方法和静态变量。
因为后面三种内部类我并没有有见过,我也只是看了别人的博客总结了一下他们的概念,所以说的不对大家千万要打我啊!