Java常见面试题

本文详细阐述了Java中接口与抽象类的区别,包括继承、方法实现和成员变量的特点。同时,解释了`static`关键字的作用,指出其与方法覆盖的不兼容性。最后,通过实例分析了Java中的值传递特性,澄清了对象传递并非引用传递的误解。对于深入理解Java语言机制具有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值