欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于Java的一些常见问题

程序员文章站 2022-06-11 22:02:00
...

前几日做项目,发现@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方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。