1.内部类
顾名思义,内部类就是指在一个class中再写一个class。
那么内部类有什么特性呢?
1.2内部类的特性
内部类==(以下称为outerClass)可以算是外部类(以下称为innerClass)的成员吧。既然是成员变量自然而然就能访问outerClass的所有成员包括private。然而outerClass却不能直接访问innerClass==,需要使用间接的方法。我们直接来看一段代码来进行理解。
public class Outerclass {
public void show()
{
System.out.println("Outerclass:I am outerclass!");
}
class InnerClass
{
public void show()
{
System.out.println("InnerClass:I am innerclass!");
/*innerClass想要调用outerClass的show方法
就这样写
下面的输出结果就能看到了*/
Outerclass.this.show();
}
}
public static void main(String[] args) {
Outerclass A=new Outerclass();
/*我们在实例了A之后,A中的innerClass并没有实例化
因此想要调用innerClass的show方法就要像下面这样
先实例一个innerClass对象出来*/
Outerclass.InnerClass B=A.new InnerClass();
A.show();
B.show();
}
}
输出结果:
/*A.show()*/Outerclass:I am outerclass!
/*B.show()*/InnerClass:I am innerclass!
Outerclass:I am outerclass!
2.匿名类
匿名类顾名思义他是一个没有名字的class。说到内部类就不得不说匿名类,在某种程度上他们是一个对象,而匿名类使得代码更为简洁干净。
因为如果每个类我们都要想名字是一件非常麻烦的事情。不过匿名类因为没有名字所以无法在其他地方使用他们,也因为没有名字自然也没有构造器换句话说匿名类是一次性的
窝查资料有看到说“匿名类与继承等价”,然而这是错误的!
匿名类与继承很相像,但绝不等价。
众所周知,继承会得到父类的所有遗产,并且自己还能创造别的财富。匿名类则不行,接下来又是一段代码来说明问题
2.1 子类匿名类
public class Animal {
public void eat()
{
System.out.println("I like eating!");
}
public void sing() {};
public void walk()
{
System.out.println("rushhhhh B!");
}
public static void main(String[] args) {
Animal durk=new Animal() {
public void sing()
{
System.out.println("GaGaGaGa");
}
public void fly()/*们可以写新的方法,但是在下面是找不到的*/
}
System.out.println("I want to fly");
}
};
//但是在下面durk对象是找不到fly的durk.fly();
durk.eat();
durk.sing();
durk.walk();
Animal unKnownAnimal=new Animal();
unKnownAnimal.eat();
}
}
结果
lalalala!!!
GaGaGaGa
rushhhhh B!
I like eating!
可以看到在匿名类我们写了一个fly方法,但是如果我们
durk.fly();
- The method fly() is undefined for the type Animal
由此可以看出匿名类与继承类其实是不同的,继承后是可以重写方法和写新的方法,而匿名类只能重写方法。
2.2接口匿名类
与上面一样,只是实现的东西变成了一个terface
interface Interface
{
public void show();
}
public class Person implements Interface {
@Override
public void show() {
System.out.println("This is a initial interface!");
}
public static void main(String[] args) {
Person friendA=new Person() {
public void show()
{
System.out.println("This is a modifided interface!");
}
};
}
friendA.show()
}