Java如何在运行时识别类型信息?

在Java中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为RTTI,英文全称为Run-TimeTypeIdentification,即运行时类型识别,有没有一点“知行合一”的味道?运行时类型识别主要由Class类实现。在日常的学习工作当中,有一些知识是我们在读书的时候就能够习得;但有一些知识不是的,需要在实践的时候才能得到真知——这或许就是王阳明提倡的“知行合一”。01、Class类在Java中,我们常用“class”(首字母为小写的c)关键字来定义一个类,说这个类是对某一类对象的抽象。你比如说王二是一个网络知名作者,我们可以这样简单地定义作者类:package com.cmower.java_demo.fifteen;class Author {    private String pen_name;    priv...

Java String:重要到别人只能当老二的字符串类

字符串,是Java中最重要的类。这句肯定的推断不是Java之父詹姆斯·高斯林说的,而是沉默王二说的,因此你不必怀疑它的准确性。关于字符串,有很多的面试题,但我总觉得理论知识绕来绕去没多大意思。你比如说:Stringcmower=newString("沉默王二");定义了几个对象?我总觉得问我这样的问题,就好像是在拷问我:“既然你家买了冰箱,你难道不应该知道冰箱制冷的原理?”再说,为什么要用Stringcmower=newString("沉默王二");而不是Stringcmower="沉默王二";?我劝各位面试官不要再缠住这样的问题不放了,切记“学以致用”。理论知识如果一直是在绕弯弯,那真的毫无价值。如果要我来做面试官,我想要问的问题是:“你平常是怎么判断两个字符串相等的?是用equals()还是==?”前言就说这么多。接下来,我们来探讨几个实用的知识点。01字符串是不可变的我们来看一下String类的定义:public final class String &n...

Java异常处理:给程序罩一层保险

本着负责任的态度,我们程序员在写代码的时候,都非常的严谨。但程序在运行的时候,往往会出现一些令人意想不到的错误,导致那些不被期望的事件发生,最终,程序没有按照我们的预期正常地执行下去——异常发生了,是任程序自生自灭,还是将错误输出给用户?Java为此提供的解决方案是——异常处理机制。异常处理机制能够让程序在异常发生时,按照代码预先设定的异常处理规则,针对性地处理异常——要么恢复到程序一开始的样子,要么停止运行把详细的错误信息抛出来,让我们程序员知道哪里出了错,然后做出对应的优化。人这一生,总会遇到一些不可预料的麻烦,这些麻烦可能会让我们遭受沉重的打击。为了减轻因此承受的负担,我们就会买保险。异常处理机制在一定程度上保证了程序的健壮性,就好像给程序罩了一层保险。01、异常的分类在Java中,异常被称为Throwable,可分为Error和Exception(英文直译为例外,但通常被称为真的‘异常’)。Error:代表了Java虚拟机(JavaVirtualMachine)本身的错误,不能通过代...

Java集合类的那点通俗的认知

开门见山地说吧,Java提供了一套完整的集合类(也可以叫做容器类)来管理一组长度可变的对象(也就是集合的元素),其中常见的类型包括List、Set、Queue和Map。从我个人的编程经验来看,List的实现类ArrayList和Map的实现类HashMap使用频率最高,其它实现类只能望其项背了。List、Set和Queue都是Collection的子接口,但各有各的好。List按照插入的顺序保存元素,Set不会有重复的元素,Queue通常(但并非一定)以FIFO(先进先出)的方式排序各个元素。Map与Collection最大的不同就在于,它是一组“键值对”,可以快速地通过键来查找值;Collection是没有键的,因此需要按照某种规则来查找值(这里说的值就是元素)。怎么使用集合类呢?示例如下:public class Wanger {    public static void main(String[] args) {  ...

Java的内部类真的那么难以理解?

01前言昨天晚上,我把车停好以后就回家了。回家后才发现手机落在车里面了,但外面太冷,冷到骨头都能感受到寒意——实在是不想返回一趟去取了(小区的安保还不错,不用担心被砸车玻璃),于是打定主意过几个小时的“世外桃源”生活——别人找不到我,我也找不到别人,这种与世隔绝的状态非常适合读书写作。把厚厚的《Java编程思想》摆在桌子上,正襟危坐,认认真真地读起了第十章——内部类。尽管我已经非常耐心和用心了,但内部类的这一章非常的枯燥,并且难以理解,我整个人几乎处于崩溃的边缘。很早之前,有想要转行学习Java的朋友咨询我,有哪方面的书可以推荐,我郑重其事地介绍了《Java编程思想》,并且一再叮嘱他这是一本Java入门级的经典书,必须耐着性子读完它。现在想想,自己当时的推荐真是轻率!我这样说,并不是为了否认《Java编程思想》这本书的价值,因为站在书本的角度,它可能会感慨说:这王二的学习能力有问题啊,读我竟然这么困难!不是有那样一句话嘛:“如果你手里有一把锤子,所有东西看上去都像钉子。&rdqu...

Java接口的实例应用:致敬我的偶像——何塞·穆里尼奥

文/沉默王二 曹操在《短歌行》中为杜康酒打过一个价值一亿个亿的广告——“何以解忧,唯有杜康”,我替曹操感到惋惜的是他本人并不会收到这笔不菲的代言费。想一想,要是三国时期的明星人物们有这个代言意识的话,保证各家的军费收入会多出来一个重量级的来源。不过,酒真的能解忧吗?我不大敢相信。李白就曾质疑过:“举杯消愁愁更愁,抽刀断水水更流。”我和李白持相同的观点,酒啊,真的不容易解忧,但绝对可以增加作者莫名的写作冲动。我在写本文之前就小酌了一杯,一不小心激发了我强烈的创作欲望。不过我要奉劝各位,寒冬之际,如果遇到烦心事,千万别肆意地追求一醉方休,万事要懂得适可而止。01抽象类一种比较苍白的说法是:在Java中,通过关键字abstract定义的类叫做抽象类。Java是一门面向对象的语言,因此所有的对象都是通过类来描述的;但反过来,并不是所有的类都是用来描述对象的,抽象类就是其中的一种。以下示例展示了一个简单的抽象类:// 个人认为,一名教练必须攻守兼备abstract class Coac...

Java:多态乃幸福本源

01多态是什么在我刻板的印象里,西游记里的那段孙悟空和二郎神的精彩对战就能很好的解释“多态”这个词:一个孙悟空,能七十二变;一个二郎神,也能七十二变;他们都可以变成不同的形态,但只需要悄悄地喊一声“变”。Java的多态是什么呢?其实就是一种能力——同一个行为具有不同的表现形式;换句话说就是,执行一段代码,Java在运行时能根据对象的不同产生不同的结果。和孙悟空和二郎神都只需要喊一声“变”,然后就变了,并且每次变得还不一样;一个道理。多态的前提条件有三个:子类继承父类子类覆盖父类的方法父类引用指向子类对象多态的一个简单应用,来看程序清单1-1://子类继承父类publicclassWangxiaoerextendsWanger{publicvoidwrite(){//子类覆盖父类方法System.out.println("记住仇恨,表明我们要奋发图强的心智");}publicstaticvoidmain(String[]args){//父类引用指向子类对象Wanger[]wangers={ne...

Java代码复用的三种常用方式:继承、组合和代理

复用代码是Java众多引人注目的功能之一。这句话很通顺,没什么问题,但问题在于很多人并不清楚“复用”是什么。就好像我说“沉默王二是一个不止会写代码的程序员”,唉,沉默王二是谁?我们需要来给“复用”下一个定义。复用,说白了就是重复使用。举个例子,很多名人说了很多名言,我们在说话、写作的时候,就经常有意无意的重复这些名言。比如说我,就特别喜欢重复使用王小波的那句名言:“从话语中,你很少能学到人性,从沉默中却能。假如还想学得更多,那就要继续一声不吭。”上面这个例子,只能说是“复用”的一种低级的应用,其实就是复制粘贴了。还有高级的复用方式吗?有,当然有。Java作为一种优秀的面向对象设计的语言,在复用的应用上就高级得多了。01继承最常见的复用方法就是继承——使用extends关键字在基类的基础上创建新类,新类可以直接复用基类的非private的属性和方法;就像程序清单1-1那样。程序清单1-1:public class Wangxi...

微信JSSDK javascript 开发 代码片段,仅供参考

最全面最专业的微信公众平台开发教程:http://www.cnblogs.com/txw1958/p/weixin-js-sdk-demo.html比较完整的分享教程:http://www.cnblogs.com/leinov/p/5256879.htmlajax调用服务器接口:functionGetWeiXinJsapiConfig(){varurl=encodeURIComponent(location.href.split('#')[0]);alert('urlis'+url);$.ajax({type:"POST",url:"/XXX/GetWeiXinJsapiConfig",data:"{'curUrl':'"+url+"'}",contentType:"application/json;charset=utf-8",dataType:"json",success:function(data){console.log(data.d);varconfigData=$.parseJSON(data.d);console.log('sigis'+configData.signat...

javascript 工具函数

转义特殊字符为html实体HtmlEncode:function(str){returnstr.replace(/&/g,'&amp;').replace(/"/g,'&quot;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/'/g,'&apos;');}验证是否为有效的手机电话号码IsMobile:function(str){varrp=/^1[3|4|5|7|8][0-9]d{4,8}$/;returnrp.test(str);}验证是否为有效的座机电话号码IsTel:function(str){varrp=/^([0-9]{3,4}-)?[0-9]{7,8}$/;returnrp.test(str);}清除左空格/右空格Ltrim:function(str){returnstr.replace(/^(s*| *)/,"");},Rtrim:function(str){returnstr.replace(/(s*| *)$/,"");}清除左右空格Trim:fu...

javascript 方法实例

输出对象的属性名称与值:boj(o){for(varpino){console.log(p+":"+o[p]+"");}}  构造函数:varo=newObject();构造函数通过不使用return关键字,它通过初始化新对象 if(a)else{b}//如果不是a就返回ba=a||b//如果不是a就返回b ...

javascript 数组实例

在遍历数组时,如果想要排除null/undefined和不存在的元素时,代码如下:for(vari=0;i<a.length;i++){//跳过null/undefined/不存在的元素if(!a[i])continue;//逻辑数据}如果只想跳过undefined/不存在的元素时,代码如下:for(vari=0;i<a.length;i++){//跳过undefined/不存在的元素if(a[i]===undefined)continue;//逻辑数据}如果只想跳过不存在的元素而仍然要处理存在的undefined元素,代码如下:for(vari=0;i<a.length;i++){//不存在的元素,仍要处理存在的undefined元素if(!(iina))continue;//逻辑数据}如果想要跳过继承的属性时,代码如下:for(variinprop){//跳过继承的属性if(!prop.hasOwnProperty(i))continue;//逻辑数据} 常用的数组方法:join()//将数组中的元素转化为字符串并使用分隔符连接起来 多维数组:...

javascript 对象实例

创建对象:varo=newObjct();//创建一个空对象varo={};vara=newArray();//创建一个空数组vara=[];vard=newDate();//创建一个表示当前时间的日期对象对象属性的设置:book.edition=6//给book创建一个edition的属性book["mainTile"]="ECMASript"//给mainTile属性赋值book[i]=param;//如果有多个属性与值,可以使用这种方法,只要将i与param传回来,就可以给book这个数组设置多个属性与值如果一个对象的属性我是保留字,必须使用[]的形式访问他们:o["class"]/o["for"],使用方括号时,方括号内的表达式必须返回为字符串。作为关联数组的对象:Object["property"]//方括号和一个数组数组元素通过字符串索引。通过.访问对象时,属性名是一个标识符,这个标识符必须直接出现在js的代码中,比如接口的属性,因此程序无法修改它们通过[] 访问对象时,属性名是一个字符串,字符串是js的一个数据类型,可以通过程序修改和创建它们场景:由于在写程序...

javascript 公共方法 集合

数组去重:Array.prototype.unique1=function(){varn=[];//一个新的临时数组for(vari=0;i<this.length;i++)//遍历当前数组{//如果当前数组的第i已经保存进了临时数组,那么跳过,//否则把当前项push到临时数组里面if(n.indexOf(this[i])==-1)n.push(this[i]);}returnn;}Array.prototype.unique2=function(){varn={},r=[];//n为hash表,r为临时数组for(vari=0;i<this.length;i++)//遍历当前数组{if(!n[this[i]])//如果hash表中没有当前项{n[this[i]]=true;//存入hash表r.push(this[i]);//把当前数组的当前项push到临时数组里面}}returnr;}Array.prototype.unique3=function(){varn=[this[0]];//结果数组for(vari=1;i<this.length;i++)//从第二...

javascript 红宝书笔记之操作日期

创建当日日期对象 调用Date的构造函数而不传递参数的情况下,新创建的对象默认获取当前的日期和时间。 varnow=newDate(); 创建特定的日期和时间对象 Date.parse("表示日期的字符串");          //该方法接收一个表示日期的字符串参数,根据这个字符串会返回相应的日期格式;如果这个字符串不能表示日期,则会返回NAN。 varnowDate=newDate(Date.parse("May25,2001"));   //May25,2001varnowDate=newDate("May25,2001");         //May25,2001 取得开始时间 varstart=Date.now(); 取得结束时间 varstop=Date.now();...
首页上一页...565566567568569...下一页尾页