继承
//被继承的类Abc
public class Abc {
int abc=123;
//Abc的构造函数
public Abc() {
System.out.println("Abc的构造函数");
}
//普通方法
public void haha(){
System.out.println("哈哈");
}
}
//Test类 继承Abc类
public class Test extends Abc {
//Test的构造函数
public Test() {
System.out.println("Test的构造函数");
}
public static void main(String[] args) {
Test test = new Test();
test.haha();
System.out.println(test.abc);
}
}
继承的特性
1. 子类拥有父类非private的属性,方法。
2. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
3. 子类可以用自己的方式实现父类的方法。
4. Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性。
5. 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。
抽象
//抽象类
public abstract class Abc {
int abc=123;
//Abc的构造函数
public Abc() {
System.out.println("Abc的构造函数");
}
//普通方法
public void haha(){
System.out.println("哈哈");
}
//抽象方法
public abstract void cx();
}
//继承抽象类
public class Test extends Abc {
//Test的构造函数
public Test() {
System.out.println("Test的构造函数");
}
//实现抽象方法
public void cx(){
System.out.println("实现继承抽象类的抽象方法");
}
public static void main(String[] args) {
Test test = new Test();
test.haha();
test.cx();
System.out.println(test.abc);
}
}
抽象类总结规定
1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
3. 构造方法,类方法(用static修饰的方法)不能声明为抽象方法。
4. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
5. 因为不能被实例化,所以只能被继承才能用,一个子类只能继承一个抽象类。
接口
public class Test extends Abc implements Idemo,Idemo2 {
//Test的构造函数
public Test() {
System.out.println("Test的构造函数");
}
//实现抽象方法
public void cx(){
System.out.println("实现继承抽象类的抽象方法");
}
public static void main(String[] args) {
Test test = new Test();
test.haha();
test.cx();
System.out.println(test.abc);
}
//implements必须实现接口
@Override
public void a() {
System.out.println("实现了Idome的a");
}
@Override
public void b() {
System.out.println("实现了Idome的b");
}
}
//接口类1
public interface Idemo {
//接口中变量会被默认指定为 public static final (并且只能是 public)。
public static final int A =1;
//或者这样写int a =1;一样的,会被默认指定。
//接口中方法会被默认指定为 public abstract(只能是public abstract)。
public abstract void a();
//或者这样写一样的void a();会被默认指定。
}
//接口类2
public interface Idemo2 {
// 接口中变量会被默认指定为 public static final (并且只能是 public)。
public static final int B = 1;
// 或者这样写int a =1;一样的,会被默认指定。
// 接口中方法会被默认指定为 public abstract(只能是public abstract)。
public abstract void b();
// 或者这样写一样的void a();会被默认指定。
}
接口与类的区别:
- 接口不能用于实例化对象。
- 接口没有构造方法。
- 接口中所有的方法必须是抽象方法。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被类继承了,而是要被类实现,多实现用逗号隔开。
- 接口支持多继承。
接口特性
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public
abstract,其他修饰符都会报错)。- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用
private 修饰会报编译错误)。- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
抽象类和接口的区别
1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。