原本我以为MyClass.class和MyClass.getClass()是相同的,但是,后来发现不对 !如下面代码所示 :import java.io.*;
public class DirList {
public static void main(String[] args) {
File path = new File(
DirList.class.getResource(".").getFile().toString()
);
System.out.println(
DirList.class.getResource(".").getFile().toString()
);
}
}这个代码无错误 !!!然后,再看一个import java.io.*;
public class DirList {
public static void main(String[] args) {
File path = new File(
DirList.class.getResource(".").getFile().toString()
);
System.out.println(
DirList.getClass().getResource(".").getFile().toString()
);
}
}这个代码,报错!
----------------------
错误提示:
Cannot make a static reference to the non-static method getClass() from the type Object
----------------------从错误提示来讲,getClass()是一个非静态方法,却被静态类型引用,从而导致错误!
但是," .class " 确不会,也就是说,“ .class ”是一个静态的类型对象 !问题:
1、我的分析正不正确,望解析 。
2、如果问题1我的分析正确,那么我就想问了,干嘛要定义两个属性不同,功能却一样的类型,这样做有什么用,用在哪里呢 ???
public class DirList {
public static void main(String[] args) {
File path = new File(
DirList.class.getResource(".").getFile().toString()
);
System.out.println(
DirList.class.getResource(".").getFile().toString()
);
}
}这个代码无错误 !!!然后,再看一个import java.io.*;
public class DirList {
public static void main(String[] args) {
File path = new File(
DirList.class.getResource(".").getFile().toString()
);
System.out.println(
DirList.getClass().getResource(".").getFile().toString()
);
}
}这个代码,报错!
----------------------
错误提示:
Cannot make a static reference to the non-static method getClass() from the type Object
----------------------从错误提示来讲,getClass()是一个非静态方法,却被静态类型引用,从而导致错误!
但是," .class " 确不会,也就是说,“ .class ”是一个静态的类型对象 !问题:
1、我的分析正不正确,望解析 。
2、如果问题1我的分析正确,那么我就想问了,干嘛要定义两个属性不同,功能却一样的类型,这样做有什么用,用在哪里呢 ???
xx.class是程序运行时就加载到jvm中的xx.getClass()是运行程序时动态加载的,看上面的红色字
红色的字体,native ?
这个和问题有什么联系呢 ?
由类创建的对象.getClass()
吧
System.out.println( my.getClass() );同时你可以测试一下:System.out.println( MyClass.class.equals( my.getClass() ) );
System.out.println( MyClass.class = my.getClass() );
静态块还是理解的 ...
继承和多态是用得比较多,我知道 ...
现在的问题在于,getClass和.class两种方法来获得对SomeClass的类到底是为什么 ?
静态块还是理解的 ...
继承和多态是用得比较多,我知道 ...
现在的问题在于,getClass和.class两种方法来获得对SomeClass的类到底是为什么 ?interface IAnimal {
String whoAmI();
}class Cat implements IAnimal {
@Override
public String whoAmI() {
return "I am " + Cat.class;
}
}class Dog implements IAnimal {
@Override
public String whoAmI() {
return "I am " + Dog.class;
}
}class AnimalTest {
public static void main (final String[] args) {
IAnimal animal1 = new Cat();
IAnimal animal2 = new Dog(); tellMeWho(animal1);
tellMeWho(animal2); System.out.println(animal1.whoAmI());
System.out.println(animal2.whoAmI());
} private static void tellMeWho(IAnimal animal) {
System.out.println("I am " + animal.getClass());
}
}
读完代码你就懂了。这是两种应用场景
Abstract class Animal {
protected Logger logger = LoggerFacotry.getLogger(getClass());
...
}
Cat extends Animal {
Cat () {
}
}
Class clazz = A.classA a = new A();
Class clazz = a.getClass();
class和getClass()的调用者是不一样的。
每个类不论它有多少对象,那个类和它的对象都共享了1份Class --> 共享不正是Java里面的static么
但是每个对象都有1个自己专属的ClassLoader.class属性是供类来访问的
getClass()是供对象来访问的
同时Class.forName(“包.类名称”)也是一种访问Class的方法Java提供了这三种访问Class的方式
CSDN兄弟,我们又见面了,哈哈 ...
CSDN兄弟,我们又见面了,哈哈 ...
是啊,嘿嘿~
虽说是初学很浅,但是我记得框架里面,就是你现在上面这个道理。好像看到过 ...
------------
不过,你这里可以被子类共用这句话说的有点抽象了,不是每个子类都要LoggerFactory.getLogger(SomeClass.class);么,不然怎么调用[好吧我真是菜鸟战斗机 ... ]
虽说是初学很浅,但是我记得框架里面,就是你现在上面这个道理。好像看到过 ...
------------
不过,你这里可以被子类共用这句话说的有点抽象了,不是每个子类都要LoggerFactory.getLogger(SomeClass.class);么,不然怎么调用[好吧我真是菜鸟战斗机 ... ]Cat的目标是有一个Logger,它产生的过程等同于LoggerFactory.getLogger(Cat.class);。在Animal这个抽象类里面,那一句getClass是根据你实例化的子类来返回不同值的。比如你有Dog extends Animal { },那么new Dog()中的logger就相当于LoggerFactory.getLogger(Dog.class);,而你在Dog类中不需要重复写这一句,因为Animal类中,logger已经被初始化为这个值了(getClass()返回的就是Dog.class)