ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

day14_innerClass&modifier

2020-11-26 22:05:10  阅读:220  来源: 互联网

标签:innerClass 内部 接口 day14 匿名 new yes modifier public


  • 权限修饰符
  • 内部类
  • 引用类型
  • Object类
  • 常用API

权限修饰符

	 *	java中 有四种权限修饰符
	 *		                        public    >   protected    >    default(缺省)    >    private 
	 *		          同类         	yes			 yes			  yes				yes
	 *		          同包		    yes			 yes			  yes			    no
	 *		          不同包子类		  yes		   yes			    no				  no
	 *		          不同包非子类	 yes		   no			   no				 no
	 *		          
	 *		          注意事项:default并不是权限修饰符关键字,意思是默认不写。

设计细节:

  • ​ 成员变量:使用private ,隐藏细节
  • ​ 构造方法:public ,方便创建对象
  • ​ 成员方法:建议使用public ,方便调用

如果一个类被public修饰了,那么该类对应的源文件.java的文件名需要和类名完全一致

内部类

  如果一个事物的内部包含另一个事物,那么这就是一个类的内部包含了另一个类
  例如:身体和心脏的关系    “has - a”的关系  包含关系,心脏属于身体的一部分

 分类:
 		1.成员内部类
 		2.局部内部类(包含匿名内部类)
  • 成员内部类:
	 * 成员内部类的定义格式:
	 * 		修饰符 class 外部类名{
	 * 				//...
	 * 			修饰符 class 内部类名{
	 * 				//...
	 * 			}
	 * 		}
	 *访问特点:
     *        内部类访问外部类信息,随意访问;
	 * 		 外部类访问内部类的,需要内部类对象
	 * ===============================================
	 * 备注:内部类仍然是一个独立的类,编译之后依然生成一个独立的.class文件,该文件名称:
     *   											 外部类类名$内部类名.class 
     * 
	 * 如何使用成员内部类?有两种方式:
	 * 1.间接使用方式:在外部类的方法当中使用内部类
	 * 2.直接使用方式:公式:
	 * 					类名称  对象名  = new  类名称
	 * 	【外部类类名.内部类类名对象名 = new 外部类名().new 内部类名();】
     示例:
         //使用内部类   链式调用  直接方式
		Body.Heart heart1 = new Body().new Heart();
		heart1.beat();
		new Body().new Heart().beat();
		
		//第二种写法(分开调用)
		Body body = new Body();
		Heart heart2 = body.new Heart();
		heart2.beat();
  • 局部内部类
 * 当一个类是定义在方法内部,这个类是局部内部类
 * “局部”:只有当前所属的方法才能使用它,出了这个方法外面就不能用了
 * 
 * 定义格式:
 * 		修饰符 class 外部类名称{
 * 			
 * 			修饰符   返回值类型   外部类方法名(参数列表){
 * 				class 局部内部类名称{
 * 					//...
 * 				}
 * 			}
 * 			//...
 * 		}
 * 局部内部类:如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效的final】
 * 备注:JDK1.8开始,只要局部变量事实不变,那么final关键字可以省略不写。
 * 
 * 原因如下:
 * 		1.new出来的对象保存在堆内存中
 * 		2.局部变量随着方法的压栈而在内存当中存储
 * 		3.方法运行结束后,立刻弹栈,局部变量也随之消失
 * 		4.但是new出来的对象不会随着方法的弹栈而消失,JVM会将它当作垃圾
 * 		生命周期产生冲突,so要变成final型
 * 
 * 	类的权限修饰符
 * 		1.外部类   public / default   only public, abstract & final are permitted
 * 		2.成员内部类  public / protected / default / private
 * 		3.局部内部类  什么都不能写

匿名内部类

​ 是内部类的简写,其本质是一个带着具体实现``父类或父接口的``匿名的子类对象

开发中,最常用到的内部类是【匿名内部类】

前提

​ 匿名内部类必须【继承一个父类】或者【实现一个接口】,伴随着重写父类或父接口当中的抽象方法

 * 以往的操作:想要使用接口中的方法,需要4步操作
 * 	1.定义实现接口的实现类
 * 	2.重写接口中的方法
 * 	3.构建子类的对象,把子类赋给父接口变量
 * 	4.通过父接口变量调用接口中的方法********************
 * 
 * so  我们需要使用匿名内部类
 * 接口名称  对象名 = new 接口名称(){
 * 		//覆盖重写接口当中的所有的抽象方法
 * };
 * 如果接口中的实现类(或父类的子类)在程序中只需要使用唯一的一次,
 * 那么在这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】
 * 
 * 解释:
 * 		new 接口名称(){};
 * 		1.new 代表创建对象
 * 		2.接口名称就是匿名内部类需要实现的那个接口,此时需要创建哪个接口实现类的对象
 * 		3.{}这是匿名内部类的内容
 * 注意事项:
 * 		1.匿名内部类,在创建对象时,只能使用唯一一次
 * 		如果希望多次创建对象,而且你、类的内容是一样的,建议去单独定义实现类
 * 		2.匿名对象,在调用方法时,只能使用唯一一次
 * 		如果希望同一个人对象,多次调用方法,建议给对象起名字
 * 		3.匿名内部类省略了【实现类/子类】,但是匿名对象是省略了对象名
 * 		4.匿名内部类和匿名对象根本不是一回事
 * 
 * MyInterface myInterface = new MyInterface(){
 * 		@Override
 * 		//...
 * };
 * myInterface.xxx();
 * MyInterface myInterface = new MyInterface(){
 * 		@Override
 * 		//...
 * }.method01;//匿名内部类匿名对象

​ 通常在方法的形式参数是接口或抽象类时,一般将匿名内部类作为参数实参传递进去

public interface Animal{
    void eat();
    void sleep();
}
//定义启动类
public class AnornymousDemo{
    //定义成员方法
    public static void showEat(Animal animal){
        animal.eat();
    }
    //多态的写法   左边:接口   右边:子类对象
    public static void main(String []args){
        Animal animal = new Animal(){ //相当于一个实现类对象
            @Override
            public void eat(){
                System.out.println("吃鱼"); 
            }
        };
        showEat(animal);//吃鱼  animal是一个对象
        showEat(new animal(){   //匿名内部类的匿名对象
             @Override
            public void eat(){
                System.out.println("吃骨头");
            }
        });
    }
}

引用类型用法总结

​ 接口可以作为成员变量,然后通过匿名内部类的方式,重写接口

标签:innerClass,内部,接口,day14,匿名,new,yes,modifier,public
来源: https://www.cnblogs.com/mitoris/p/14044832.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有