很浅很浅的谈一下class类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了很浅很浅的谈一下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,在这里我们似乎可以看到动态加载类的其中一个好处。

 

以上是关于很浅很浅的谈一下class类的主要内容,如果未能解决你的问题,请参考以下文章

JVM:永久区浅学

在 python 中使用 a[:] 或 copy() 复制列表很浅? [复制]

Java 容器相关知识全面总结

为啥我从网上复制的文字,粘贴到word后,文字颜色就变得很浅,在网上看文字也不浅啊

作业2

为什么大家都说 SELECT * 效率低?