Java内部类和匿名类

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()
}
发布了42 篇原创文章 · 获赞 23 · 访问量 2310

猜你喜欢

转载自blog.csdn.net/qq_40710190/article/details/103725953
今日推荐