JAVA高级特性--内部类
内部类概念
public class Outer{ class inner{ } }
特点
可以很好的实现隐藏,可以使用procted,private
可以直接访问外部类的所有成员 ,包括私有成员.
外部内不能访问内部类的成员,必须首先建立内部类的 对象才可访问
成员内部内及应用
//外部内不能访问内部内属性和方法,必须创建对象
//内部类中不能有静态方法和属性
//内部类可以访问Outer.this.name外部内属性
//静态常量在内部类中是可以的
package com.tanlei.newer; public class MemberInner { public static void main(String[] args) { //创建外部内对象 Outer outer=new Outer(); outer.show(); //创建内部类对象 Outer.Inner inner=outer.new Inner(); inner.show(); } } class Outer { private String name = "tanle"; private int num = 10; public void show() { System.out.println(name + num); //外部内不能访问内部内属性和方法,必须创建对象 Inner inner1 =new Inner(); inner1.show(); } public class Inner { private String name = "lisi"; private int num = 20; public void show() { //内部类中不能有静态方法和属性 //内部类可以访问Outer.this.name外部内属性 //静态常量在内部类中是可以的 System.out.println(Outer.this.name +" 内部类"+ num); } } }
静态内部类
特点:
使用static修饰的成员内部类叫做静态内部类
外部类名.内部类名 实例名=new 外部类名.内部类名(参数).
限制
静态内部类不能与外部类重名
不能访问外部类的非静态的属性和方法,外部类不能访问内部类的非静态 的属性和方法
匿名内部类
特点
没有名称的内部类,没办法引用他们,必须在创建时作为new语句的一部分来声明并创建他们的实例
必须继承一个类或者实现一个接口
语法
new interface接口的实现类/superclass子类(){ //类体 }
package com.pojo; public class Anoon { public static void main(String[] args) { Person person=new Person(); /*Anamill dog=new DOGG();*/ person.feed(new Anamill() { @Override public void eat() { // TODO Auto-generated method stub System.out.println(); } } ); } } abstract class Anamill{ public abstract void eat(); } /*class DOGG extends Anamill{ @Override public void eat() { System.out.println("啃骨头"); } }*/ class Person{ public void feed(Anamill anamill) { anamill.eat(); } }
局部内部类
特点
定义在代码块,方法体类的
局部内部类不能加访问修饰符
package com.pojo; public class localInner { public static void main(String[] args) { Outer3 outer3=new Outer3(); outer3.showOuter(); } } class Outer3{ private String name="zhangs"; private int agw =20; private static int num=20; public void showOuter() { final int mun44=50;//局部内部类只能访问声明其方法的常量 class Inner3{ private int mun3=30; private int num4=40; public void showInner() { System.out.println(mun3); System.out.println(num4); System.out.println(Outer3.this.name); System.out.println(Outer3.num); System.out.println(mun44); } } Inner3 inner3=new Inner3(); inner3.showInner(); } }
案例
package com.pojo; import java.util.Arrays; import com.pojo.Arraydemao.Entty; public class Conter { public static void main(String[] args) { Arraydemao arraydemao=new Arraydemao(); arraydemao.put("1", "a"); arraydemao.put("2", "b"); arraydemao.put("3", "c"); arraydemao.put("4", "d"); arraydemao.put("5", "e"); Arraydemao.Entty [] entties1=arraydemao.getentties(); for (int i = 0; i < entties1.length; i++) { Entty entty=entties1[i]; System.out.println(entty.getKey()); System.out.println(entty.getValue()); } } } class Arraydemao{ //存放entry对象的数组,默认大小为5 private Entty[] entties=new Entty[5]; private int count=0;//下标 //对外提供的一个接口向容器中存放封装好的数据 public void put(String key,String value) { Entty entry=new Entty(); entry.setKey(key); entry.setValue(value); entties[count++]=entry;//存放Entry对象到数组中 //数组扩容 if (count>=entties.length) { System.out.println("容器满了"); //扩容后的新数组的大小 int newCapacity=entties.length*2; //把老数组中的数据复制到长度为newCapacity薪数组中 entties=Arrays.copyOf(entties,newCapacity); } } //把容器中的有数据内容返回 public Entty[] getentties() { return Arrays.copyOfRange(entties, 0, count); } //把键值对封装在Entry对象中 public static class Entty{ private String key; private String value; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } }