1.接口和抽象类的区别
-
接口中所有的方法隐含的都是抽象的。抽象类可以同时包含抽象和非抽象的方法 类可以实现多个接口,但是只能继承一个抽象类 非抽象类若实现一个接口,则它必须要实现接口声名的所有方法。 非抽象类继承抽象类,必须将抽象类中的抽象方法实现了 抽象类实现接口可以不实现接口中的所有方法。抽象类可以不实现抽象类"声名"的所有方法 Java 接口中的成员函数默认是 public static final。抽象类的成员函数可以是 private,protected 或者是 public ,抽象类可以包含非 final 的变量。 接口是绝对抽象的,不可以被实例化(java 8已支持在接口中实现默认的方法)。抽象类也不可以被实例化
2.”static”关键字是什么意思?Java中是否可以覆盖(重写)一个private或者是static的方法?
-
如果一个类的变量或者方法前面有static修饰,那么表明这个方法或者变量属于这个类,也就是说可以在不创建对象的情况下直接使用 当父类的方法被private修饰时,表明该方法为父类私有,对其他任何类都是不可见的, 因此如果子类定了一个与父类一样的方法,这对于子类来说相当于是一个新的私有方法,且如果要进行向上转型,然后去调用该“覆盖方法”,会产生编译错误 class Parent { private fun() { ... }} class Child extends Parent { private fun() { ... } } class Test { public static void main(String[] args) { Parent c = new Child(); c.fun(); // 编译出错 } } static方法是编译时静态绑定的,属于类,而覆盖是运行时动态绑定的(动态绑定的多态),因此不能覆盖.
3.值传递和引用传递 java中是值传递还是引用传递,还是都有?
-
值传递 在方法调用的时候,实参是将自己的一份拷贝赋给形参,在方法内,对该参数值的修改不影响原来实参 引用传递 在方法调用的时候,实参将自己的地址传递给形参,此时方法内对该参数值的改变,就是对该实参的实际操作。 java中只有一种传递方式, 那就是值传递.可能比较让人迷惑的就是java中的对象传递时,对形参的改变依然会影响到该对象的内容。 下面这个例子来说明java中是值传递. public class Test { public static void main(String[] args) { StringBuffer sb = new StringBuffer("hello "); getString(sb); System.out.println(sb); } public static void getString(StringBuffer s) { // s = new StringBuffer("ha"); s.append("world"); } } 在上面这个例子中,当前输出结果为:hello world。这并没有什么问题,可能就是大家平常所理解的引用传递,那么当然会改变StringBuffer的内容。 但是如果把上面的注释去掉,那么就会输出:hello.此时sb的值并没有变成ha hello. 假如说是引用传递的话,那么形参的s也就是sb的地址,此时在方法里new StringBuffer(),并将该对象赋给s,也就是说s现在指向了这个新创建的对象. 按照引用传递的说法,此时对s的改变就是对sb的操作,也就是说sb应该也指向新创建的对象,那么输出的结果应该为ha world. 但实际上输出的仅是hello.这说明sb指向的还是原来的对象,而形参s指向的才是创建的对象,这也就验证了java中的对象传递也是值传递。 可以再看看另外一个关于探究值传递还是引用传递的博客 https://blog.youkuaiyun.com/JYKgo/article/details/116997179 但我个人见解是除了基本类型都是引用传递,我觉得这个可能更有利于理解Java