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
子类的第一个构造函数
创建第二个子类对象:
父类的构造函数
子类的第二个构造函数