文档章节

静态内部类在SpringMVC开发中的使用

Gtwo
 Gtwo
发布于 2016/01/15 16:57
字数 1279
阅读 345
收藏 0

原文地址:http://my.oschina.net/gtwo/blog/603337

一、内部类的介绍

1.成员内部类:

如何直接访问内部类的成员?

    外部类名.内部类名    对象名 = 外部类对象.内部类对象;

代码举例:

class Outer {
    private int num = 10;
    class Inner {
        public void show() {
            System.out.println(num);
        }
    }
}
//需求:我要访问Inner类的show()方法
class InnerClassDemo3 {
    public static void main(String[] args) {
        Outer.Inner oi = new Outer().new Inner();
        oi.show();
    }
}

    上面只是一个内部类的讲解,实际开发一般不会这样使用,

    因为一般内部类是不让外界直接访问的

成员内部类的修饰符:

    private 为了保证数据的安全性

    static 为了方便访问数据

    注意:静态内部类访问的外部类数据必须使用静态修饰

下面分别介绍这两种情况。

private修饰内部类
/**
 * 案例:一个人(人有身体,身体内有心脏)
 */
class Body {
    class Heart {
        public void operator(){
            System.out.println("心脏搭桥手术");
        }
    }
    // 按照刚才的讲解,来使用一下
    Body.Heart bh = new Body().new Heart();
    bh.operator();
}
// 这样做,岂不是什么人都能为你做手术!!
// 明显是不合理的,为了安全,可以使用private修饰内部类,如下所示:

class Body {
    private class Heart {
        public void operator(){
            System.out.println("心脏搭桥手术");
        }
    }
    public void method(){
        if(you're a doctor){
            Heart h = new Heart();
            h.operator();
        }
    }
}
// 使用private修饰后,就不能被访问了,那么,怎么玩呢?
Body b = new Body();
b.method():
static修饰内部类
class Outer {
    private int num = 10;
    private static int num2 = 100;
    // 内部类用静态修饰是因为内部类可以看作是外部类的成员
    public static class Inner {
        public void show() {
            //System.out.println(num);
            System.out.println(num2);
        }
        public static void show2() {
            //System.out.println(num);
            System.out.println(num2);
        }
    }
}

new Outer() 是一个对象,Inner()类是静态类,静态类是不能给外部的对象访问的,所以下面会报错

class InnerClassDemo4 {
    public static void main(String[] args) {
        // 使用内部类
        // 报错:限定的新静态类
        Outer.Inner oi = new Outer().new Inner();
        oi.show();
        oi.show2();
    }
}

成员内部类被静态修饰后的访问方式:

外部类名.内部类名    对象名 = new 外部类名.内部类名();

class InnerClassDemo4 {
    public static void main(String[] args) {
        Outer.Inner oi = new Outer().Inner();
        oi.show();
        oi.show2();
        
        //show2()的另一种调用方式
        Outer.Inner.show2();
    }
}


2.局部内部类:

可以直接访问外部类的成员

        

在局部位置创建内部类对象,通过对象调用内部类方法

        

局部内部类访问局部变量的注意事项

A:局部内部类访问局部变量必须用final修饰(面试题

        

 B:为什么呢?

        局部变量是随着方法的调用而调用,随着调用完毕而消失。

而堆内存的内容并不会立即消失。所以,我们加final修饰。

加入final修饰后,这个变量就成了常量。既然是常量。你消失了。

我在内存中存储的是数据20,所以,我还是有数据在使用。


3.匿名内部类:

就是内部类的简化写法。

前提:存在一个类或者接口

          这里的类可以是具体类也可以是抽象类。

格式:

        new 类名或者接口名(){

        重写方法;

        }


本质是什么呢?

        是一个继承了该类或者实现了该接口的子类匿名对象。

        

上面的匿名内部类里只有一个show()方法,调用show()就如上面所示,假如匿名内部类里有多个方法,多个方法都需要被调用,还按照上面的方式调用就变得很不好,改进如下:

       匿名内部类在开发中的使用


    匿名内部类面试题

        

        

二、静态内部类在SpringMVC开发中的使用

双主键:

@IdClass(VerifyCodeId.class)
@Entity
@Table(name="user_sms_verify_code_history")
public class VerifyCodeHistory implements Serializable{

	private static final long serialVersionUID = -4549566255810007301L;
	
	private String smsPhone;//手机号
	private String codeNum;//验证码
	private Timestamp createTime = new Timestamp(System.currentTimeMillis());//创建时间
	private Timestamp overTime = new Timestamp(this.createTime.getTime()+(60000*2));//过期时间
	private Integer validType;//验证类型
	private String requestId;//请求Id
	private Boolean isReport = false;//是否已获取短信报告
	
	@Id
	@Column(length=11)
	public String getSmsPhone() {
		return smsPhone;
	}
	public void setSmsPhone(String smsPhone) {
		this.smsPhone = smsPhone;
	}
	@Id
	@Column(length=16)
	public String getCodeNum() {
		return codeNum;
	}
	public void setCodeNum(String codeNum) {
		this.codeNum = codeNum;
	}
	@Column(nullable=false)
	public Timestamp getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Timestamp createTime) {
		this.createTime = createTime;
	}
	@Column(nullable=false)
	public Timestamp getOverTime() {
		return overTime;
	}
	public void setOverTime(Timestamp overTime) {
		this.overTime = overTime;
	}
	@Column(nullable=false)
	public Integer getValidType() {
		return validType;
	}
	public void setValidType(Integer validType) {
		this.validType = validType;
	}
	@Column(length=64)
	public String getRequestId() {
		return requestId;
	}
	public void setRequestId(String requestId) {
		this.requestId = requestId;
	}
	@Column(nullable=false)
	public Boolean getIsReport() {
		return isReport;
	}
	public void setIsReport(Boolean isReport) {
		this.isReport = isReport;
	}
	
	public static class VerifyCodeId implements Serializable{

		private static final long serialVersionUID = 8158243653609845196L;
		
		private String smsPhone;
		private String codeNum;
		
		public VerifyCodeId() {
			super();
		}
		public VerifyCodeId(String smsPhone, String codeNum) {
			super();
			this.smsPhone = smsPhone;
			this.codeNum = codeNum;
		}
		
		@Id
		@Column(length=11)
		public String getSmsPhone() {
			return smsPhone;
		}
		public VerifyCodeId setSmsPhone(String smsPhone) {
			this.smsPhone = smsPhone;
			return this;
		}
		
		@Id
		@Column(length=6)
		public String getCodeNum() {
			return codeNum;
		}
		public VerifyCodeId setCodeNum(String codeNum) {
			this.codeNum = codeNum;
			return this;
		}
		
		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result
					+ ((codeNum == null) ? 0 : codeNum.hashCode());
			result = prime * result
					+ ((smsPhone == null) ? 0 : smsPhone.hashCode());
			return result;
		}
		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			VerifyCodeId other = (VerifyCodeId) obj;
			if (codeNum == null) {
				if (other.codeNum != null)
					return false;
			} else if (!codeNum.equals(other.codeNum))
				return false;
			if (smsPhone == null) {
				if (other.smsPhone != null)
					return false;
			} else if (!smsPhone.equals(other.smsPhone))
				return false;
			return true;
		}
	}
}


© 著作权归作者所有

共有 人打赏支持
Gtwo
粉丝 1
博文 42
码字总数 35045
作品 0
中山
程序员
私信 提问
加载中

评论(1)

20170302
20170302
这样做线程安全嘛?
SpringFramework核心技术一(IOC:实例化bean)

实例化bean bean定义本质上是创建一个或多个对象的配方。容器在被询问时查看命名bean的配方,并使用由该bean定义封装的配置元数据来创建(或获取)实际对象。 一、实例化Bean的说明 如果使用...

王木东
05/13
0
0
后台开发常问面试题集锦(问题搬运工,附链接)

Java基础问题 String的’+’的性能及原理 java之yield(),sleep(),wait()区别详解-备忘笔记 深入理解Java Stream流水线 抽象 & abstract关键字 Java final 修饰符知识点总结(必看篇) Java中的...

大黄有故事
2017/11/18
0
0
JAVA程序员面试题整理(较全面)

以下是在面试中可能会遇到的问题,话不多说,往下看 1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? ...

编程大侠
04/09
0
0
170道Java工程师面试题,你敢挑战吗?

1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? 4、float f=3.4;是否正确? 5、short s1 = 1; s1 = ...

技术小能手
11/01
0
0
spring4.0之二:@Configuration的使用

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfi...

文文1
06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 快捷键

快捷键图标。 官方的下载地址为:https://atlassianblog.wpengine.com/wp-content/uploads/2018/01/keyboard-shortcuts-infographics.pdf...

honeymose
37分钟前
1
0
Apache限定目录解析PHP,限制user_agent,PHP相关的配置

Apache限定目录解析PHP 配置前访问upload/index.php [root@test-a ~]# curl -x192.168.77.139:80 'www.test.com/upload/index.php'This is upload diretory 配置,/usr/local/apache2.4/......

野雪球
41分钟前
1
0
java.util.Concurrent.Exchanger源码

类图 源码: package java.util.concurrent;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicReference;import java.util.concurrent......

狼王黄师傅
今天
5
0
Kubernetes里的secret最基本的用法

Secret解决了密码、token、密钥等敏感数据的配置问题,使用Secret可以避免把这些敏感数据以明文的形式暴露到镜像或者Pod Spec中。 Secret可以以Volume或者环境变量的方式使用。 使用如下命令...

JerryWang_SAP
昨天
4
0
2018-11-20学习笔记

1. python数据类型: 给变量赋值什么样的值,变量就是什么样的类型 给变量赋值整数,变量就是整数类型 给变量赋值字符串,变量就是字符串类型 123 和“123”一样吗? 在python中 单引号 与双...

laoba
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部