前几日做项目,发现@Value和@Autowired一直无法注入值,今天整理一下这个问题
@Autowired和new的区别
@Autowired相当于setter,在注入之前,对象已经实例化,是在这个接口注解的时候实例化的;而new只是实例化一个对象,而且new的对象不能调用注入的其他类
public class Test {
@Autowired
private HdFsService hdFsService; // 相当于setter,已经实例化
}
@Autowired的注意事项
@Autowired注入Spring Bean,即当前类必须也是Spring Bean才能调用它,不能用new xxx()来获得对象,这种方式获得的对象无法调用@Autowired注入的Bean,即调用@Autowired的类上需要添加@Component,@Service,@Repository或@Controller等。
super和this的用法
只有子类重写了父类的方法时,如果需要用到父类的方法时,才要用super,表明这个方法是父类的方法不是子类的方法。
public class Father {
public String str = "父类变量";
public String strOnly = "父类变量,子类没有同名变量";
public void printf(String str) {
System.out.println(str + "这是父类的方法");
}
public void printfOnly(String str) {
System.out.println("这是父类的方法,子类没有重写的方法====>" + str);
}
}
public class Son extends Father{
public String str = "子类变量";
public void printf(String str){
System.out.println(str+"这是子类的方法");
}
public void test() {
printf("什么都不使用=======>");
this.printf("使用this=======>");
super.printf("使用super=======>");
printfOnly("子类没重写,就会调用父类的方法");
System.out.println("str is ===========>"+str);
System.out.println("super.str is ===========>"+super.str);
System.out.println("子类没有同名变量,就会去找父类的变量===========>"+strOnly);
}
public static void main(String[] args) {
Son son = new Son();
son.test();
}
}
子类重写printf方法,如果需要调用父类的方法就要加super,否则,默认调用子类的方法。对于变量也是一样。
子类的构造函数中不是必须使用super,在构造函数中,如果第一行没有写super(),编译器会自动插入.但是如果父类没有不带参数的构造函数,或这个函数被私有化了(用private修饰).此时你必须加入对父类的实例化构造.而this就没有这个要求,因为它本身就进行实例化的构造.
如果父类的构造函数是无参的,那子类构造函数会在第一行默认调用super().
java中equals和==的区别
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。