很浅很浅的谈一下class类(一)

在java中我们常常定义不同的类去定义,描述其他事物,我们都知道类是某一类对象的抽象。但是其实类也是一种对象,它们都有着一定相同的特征,而这些特征的抽象就是class类。

我们写java中所创建的类,都是java.lang.Class的实例。下面来简单的讲一下Class类。

1.class类有三种表示方法

1)任何一个类都有一个隐含的静态成员变量

2)每一个类对象都可以通过getClass方法来获得class类

3)可以通过Class静态方法forName来获取class类

 1 public class javaClass {
 2     void print(){
 3         System.out.println("test");
 4     }
 5     public static void main(String[] args) {
 6         javaClass test = new javaClass();
 7         Class c1 = javaClass.class;
 8         Class c2 = test.getClass();
 9         Class c3 = null;
10         try{
11             c3 = Class.forName("javaClass");
12         }
13         catch (ClassNotFoundException ex){
14             ex.printStackTrace();
15         }
16
17         System.out.print("c1==c2 :" );
18         System.out.println(c1==c2);
19
20     }
21 }

注意:c3 = Class.forName("javaClass"); 这里编写类的路径时候,要加上包名(假如有包名)

上面代码的输出 c1==c2输出结果是 true 相同的类对象 是相同的。

2.基本类型的对象类

 1 Class c1 = int.class      //int的类类型
 2 Class c2 = String.class     //String类的类类型
 3 Class c3 = double.class     //double的类类型
 4 Class c4 = Double.class    //Double的类类型
 5 Class c5 = void.class
 6
 7 //可以通过类类型来获取类名
 8 c1.getName()
 9 c2.getName()
10 c2.getSimplename()
11     

注意:getName()包括 所属包名,getSimplename()只是该类类型对象的类名

3.动态加载和静态加载

介绍动态加载和静态加载前,首先看下面这个例子先吧

 1 public Class Subject{
 2         public static void main(String[] args){
 3             if("English".equals(args[0]){
 4                 English e = new English();
 5                 e.start();
 6             }
 7             if("Maths".equals(args[0]){
 8                 Maths m = new Maths();
 9                 m.start();
10             }
11         }
12 }

用文本编辑器编写上面代码时,当我们运行cmd命令行编译命令javac Subject.java,会抛出异常,找不到Maths类以及English。

或许我们会想,这很理所当然啊,因为没有定义English或Math类啊

但是仔细想一想,加入我们在命令行里输入的不是English也不是Math,if嵌套的代码根本不会运行,但是为什么还是会抛出异常。

其实上述的代码 通过new 创建实例 这是一种静态加载类,在要求再编译时刻就需要加载所有可能使用的类,所以这时候必须要有English和Math类,即使我们不会使用。

让我们再看下面这个例子

 1 public class Subject_B{
 2         public static void main(String[] args){
 3             try{
 4                 Class c = Class.forName(args[0]);
 5                 Math m = (Math)m.newInstance();
 6                 m.start();
 7             }
 8             catch(Exception e){
 9                 e.printStackTrace();
10             }
11         }
12     }

这个时候我们尝试编译上面的代码,发现编译正常,并没有什么异常,这就是通过类类型 的newInstance方法来动态加载类

动态加载类的时候我们并不需要在编译前就准备好要使用的类,而在程序运行时候动态加载我们所需要用的类。

而在这个例子中,因为我们从命令行里面或者 对象名的字符串,如果不是Math类的时候,上述代码就会抛出类型转换异常。

这个时候我们可以定义一个Subject_able的接口

 1 public class Subject_C{
 2     public static void main(String[] args){
 3         try{
 4             Class c = Class.forName(args[0]);
 5             Subject_able m = (Subject_able)c.newInstance();
 6             m.test();
 7         }
 8         catch(Exception e){
 9             e.printStackTrace();
10         }
11     }
12 }
13 public interface Subject_able{
14        void test();
15 }
16 public class Maths implement Subject_able{
17     public void test(){
18         System.out.println("Math");
19     }
20 }
21 public class English implement Subject_able{
22     public void test(){
23         System.out.println("English");
24     }
25 }

当我们需要添加新的科目类的时候,只需要另外编写新的类,并让他implement Subject_able这个接口,

而我们无需要再重新编译一次主类Subject_C,在这里我们似乎可以看到动态加载类的其中一个好处。

时间: 2024-12-05 23:05:24

很浅很浅的谈一下class类(一)的相关文章

细谈中医-------很老很老的偏方

中医皮肤科老偏方 解决皮肤的烦心事儿 皮肤是人体对抗疾病的第一道防线一定要严防死守. 在广义上皮肤科包含对头发.指趾甲疾病的治疗.本 章所列举的都是日常生活中最常见的皮肤病用小偏方治疗既轻 松又有效. 读客家庭健康必备书 001 1劝君放弃洗发液用洋葱.生姜治头皮屑 症状头皮屑 很老很老的老偏方 ①将一个捣烂的洋葱头用纱布包好用它揉擦头皮24 小时后用温水洗头即可止头痒除头皮屑. ②先将生姜切片放入锅里煮沸待水温不烫的时候倒 上适量醋加水洗头. 头皮屑谁都不会陌生.有些头皮屑比较多的人即使头皮痒

(转)技术人,不要总在很初级的层面上谈管理

无意间瞄到<[畅言]管理是权力的游戏吗?>,引起了我一些“新仇旧恨”,就也来吐槽一把.但吐槽的点倒不是权力不权力的,这是一点意思也没有的问题,在大多数人这个层次上(包括大多管理者)谈权力,形象来讲就和一般人老想象皇帝每天吃猪肉炖粉条一样,差太远,扯下去也没意思. 我想说的是技术人对管理的认知. 遇到问题谈问题 层次性很差 最常见的谈管理场景是一个人从技术转到管理岗位,接下来实践了几个项目,有成功的也有失败的,总结了经验后,就开始分享管理的成功经验.我偶尔翻到很多关于管理的文字都给我这么一种感觉

包学会之浅入浅出Vue.js:升学篇

上一篇<包学会之浅入浅出Vue.js:开学篇>中,我们初步了解单页面组件这个概念,现在通过一个项目,来进一步解析组件的应用吧,Go~ 需求背景 组件库是做UI和前端日常需求中经常用到的,把一个按钮,导航,列表之类的元素封装起来,方便日常使用,调用方法只需直接写上<qui-button></qui-button>或者<qui-nav></qui-nav>这样的代码就可以,是不是很方便呢,接下来我们将要完成以下页面: 这是我们组件库的首页,包含三个子

浅入浅出SQL注入

已经开始了学习牛腩新闻发布系统,在讲后台代码的时候讲了一些重构SQLHelper的知识,存储过程和触发器等,这些以前都是接触过的.而SQL注入是以前没有注意过的,所以停下来总结学习一下SQL注入. 首先什么是SQL注入呢? 实战篇~~~~~~~~~~ SQL注入概念 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到

包学会之浅入浅出Vue.js:结业篇

在第一篇<包学会之浅入浅出Vue.js:开学篇>和上一篇<包学会之浅入浅出Vue.js:升学篇>的学习中,我们首先了解了Vue环境的搭建以及两个重要思想--路由和组件的学习,通过组件库中的按钮组件和导航组件,相信大家也开始了解相应的知识点,接下来我们会详细分析下如何完成由多个组件组成一个复用组件的开发流程. 下面先看看我们的需求 列表组件quiList.vue 本节我们主要要完成这样一个列表功能,每一行的列表是一个组件,列表内可能出现按钮组件或者箭头组件,点击按钮组件可以自定义事件

浅入浅出EmguCv(一)OpenCv与EmguCv

最近接触计算机视觉方面的东西,于是准备下手学习opencv,从官网下载windows的安装版,配置环境,一系列步骤走完后,准备按照惯例弄个HelloWord.也就是按照网上的教程,打开了那个图像处理领域非常有名的lena图片(据说是个裸女\(^o^)/~). 正当我摩拳擦掌准备开始opencv学习之旅的时候,习惯了GUI的我突然觉得用C++做开发弄界面很麻烦,不如用C#来的方便,于是又发现了一个封装了opencv的.net库,可以被VC++,VC#,VB.net调用,即EmguCV.网上对于Em

浅入浅出触发器

1.触发器的使用背景 做完机房收费系统个人重构之后只用了存储过程,最近在看牛腩视频讲到触发器的使用,当时就遇到过外键约束不能删除.有关联的表记录的问题,当时的解决方法有的使用了存储过程,或者是标记相关联的约束键不可用.其实触发器和存储过程的使用的相似的,可以说触发器就是一种特殊类型的存储过程. 举个机房收费系统中的例子: 截取一部分数据库关系图: 当想要删除一个用户时,该用户充值和退卡的记录就会受到影响.这时就会出现外键约束的错误. 这是因为充值和退卡表都和用户表的用户ID属性有关系,当删除用户

『浅入浅出』MySQL 和 InnoDB

作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的.不了解数据库的有所帮助. 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者实现会在文中单独指出. 数据库的定义 很多开发者在最开始时其实都对数据

重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB

重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的.不了解数据库的有所帮助. 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者

思念很痛很苦也很美

思念很痛很苦,但也很美. 随着年龄的增长,社会压力的增大,我慢慢的发现要再像年轻时那样勇敢的去爱一个人,去思念一个人已经变得非常困难了.这难道就是大家常开玩笑的"累觉不爱"吗?我们在感情上变得更加理性,这有好处,但另一方面其实我们慢慢的在变得更加麻木,我们很多时候会用理性去控制感性.我能很清晰的感受到,我已经很难像年轻时那样单纯的去思念一个人了,也许有人说这是成熟,但我觉得为了成熟我付出的代价太大了,我已经慢慢的失去了爱的能力,失去了思念的能力.所以,对于我来说,思念是如此珍贵,思念是