1、抽象类和接口有什么区别

抽象类特征如下:

抽象类和抽象方法都必须用abstract关键字修饰

抽象类不能被实例化,也就是不能用new关键产生对象

抽象方法只需声明而无需事先

抽象方法必须定义的抽象类中,抽象类的子类必须实现父类中的抽象方法,否则这个子类还是个抽象类

接口的特征

接口内有构造方法

接口中声明变量均为final,static,和public得

接口中定义的方法均为抽象的和公共的

接口里的数据成员必须初始化,且数据成员均为常量

interface Truck{
 void sound();
}
interface Bus{
 void sound();
}
interface Car extends Truck, Bus{
 Cart car = new Cart("hongqi","china");
}
class Cart implements Car{
 private String name;
 private String production;
 public String getName(){
  return name;
 }
 public String getProduction(){
  return production;
 }
 public Cart(String name, String production){
  this.name = name;
  this.production = production;
 }
 public void sound(){
  car = new Cart("benchi","America");//这行是错误的。几口中定义的成员变量必须初始化,且都是final类型的。所以只能调用,不能修改值,此句企图修改car值
  System.out.println(car.getName()+","+car.getProduction());
  
 }
}

 

构造函数

 

注意:1构造函数具有和类名相同的名称。

2他没有返回值,也没有返回类型

3 每个类可以有多个构造函数,即构造函数可以重载

4构造函数在创建对象时自动执行,一般不能显示的调用

5构造方法不能重写,也就是子类不能继承父类的构造方法

6子类继承父类时,会先自动调用父类的无参构造方法,为父类成员赋初值

 

关于构造函数下面哪些是正确的?

1super()或this()必须放在构造函数的第一句

2如果父类的构造函数没有参数,那么子类的构造函数一定没有参数

3 构造函数不能被继承

4构造函数不能被重写

 

正确的为13

 

找出下面代码的错误位置

同一个类的不同构造方法中调用该类的其他构造方法需要使用this(...)
 * 的形式,而且必须是在构造方法的第一行调用,this(name,age);此句错误在于把成员
 * 变量作为参数被构造函数引用,构造方法是一个类对象实例化的起点,实例化的目的就是为
 * 了给类成员初始化,所以引用的参数值应该是常量而不是变量,因此构造方法中
 * 不能将成员作为参数引用*/

class Woman{
 String name, address;
 int age;
 public Woman(String n){
  name = n;
 }
 public Woman(String n, String a){
  name = n;
  address = a;
 }
 public Woman(String n, String ar, int a){
  this(name,age);
  address = ar;
 }
 
}

 /*如果子类中指定了调用父类中的哪个构造函数,则不再调用默认的无参构造函数,
super必须放在第一句,是因为子类需要先初始化父类*/

public class TestClass {
 public static void main(String[] args) {
  System.out.println("创建父类对象:");
  FatherClass sc0 = new FatherClass();
  System.out.println("/n 创建第一个子类对象:");
  SonClass sc1 = new SonClass();
  System.out.println("/n 创建第二个子类对象:");
  SonClass sc2 = new SonClass(1);  
 }
}
class FatherClass{
 FatherClass(){
  System.out.println("父类的构造函数");
 }
 FatherClass(int i){
  System.out.println("父类的构造函数2");
 }
}
class SonClass extends FatherClass{
 SonClass(){
  super(1);
  System.out.println("子类的第一个构造函数");
 }
 SonClass(int i){
  System.out.println("子类的第二个构造函数");
 }
}

输出:

创建父类对象:
父类的构造函数

 创建第一个子类对象:
父类的构造函数2
子类的第一个构造函数

 创建第二个子类对象:
父类的构造函数
子类的第二个构造函数