zoukankan      html  css  js  c++  java
  • 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;
    		}
    		
    	}
    }
    

      

     

  • 相关阅读:
    数组中寻找和为X的两个元素
    JSP&Servlet学习笔记(一)
    自下而上的动态规划算法
    计数排序
    快速排序
    堆排序
    LeetCode-001题解
    算法不归路之最大子序列(C++版)
    算法不归路之插入排序(C版)
    互联网五层模型
  • 原文地址:https://www.cnblogs.com/tanlei-sxs/p/9944373.html
Copyright © 2011-2022 走看看