代码存在重复,导致后果就是代码量大且臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错),所以要从根本上解决这两段代码的问题,就需要继承,将相同的部分提取出来组成 一个父类:
继承的特性:
1,子类拥有父类非private的属性,方法。
2,子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
3,子类可以用自己的方式实现父类的方法。
4,Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性。
5,提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。
所有类都继承祖先类Object类:
实现继承的关键字有两个:extend和implement
区别:extend类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
定义方法:修饰符 class 子类名 extends 父类名
举例:
public class Animal {
private String name;
public Animal(String myName) {
//初始化属性值
}
public void eat() { //吃东西方法的具体实现 }
public void sleep() { //睡觉方法的具体实现 }
}
public class Penguin extends Animal{
}
implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
定义方法:修饰符 class 子类名 implement 接口名,接口名
举例:
public interface A {
public void eat();
}
public interface B {
public void sleep();
}
public class C implements A,B {
}
Super/This
super:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
调用父类的构造方法;
调用父类的方法(子类覆盖了父类的方法时);
访问父类的数据域(可以这样用但没有必要这样用)
class Animal{
void go(){
System.out.println("animal go");
}
}
class Dog extends Animal{
void go(){
//调用父类方法
super.go();
}
}
//驱动函数
public static void main(String[] args){
Dog dog=new Dog();
dog.go();
}
this:指向自己的引用。
调用当前类的构造方法,并且必须是方法的第一条语句。如:this(); 调用默认构造方法。this(参数); 调用带参构造方法。
限定当前对象的数据域变量。一般用于方法内的局部变量与对象的数据域变量同名的情况。如 this.num = num。this.num 表示当前对象的数据域变量 num,而 num 表示方法中的局部变量。
class Animal {
void eat() {
System.out.println("animal : eat");
}
}
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的方法
super.eat(); // super 调用父类方法
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Dog d = new Dog();
d.eatTest();
}
}
结果:
animal : eat
dog : eat
animal : eat
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
final 的作用随着所修饰的类型而不同,三种修饰类型:
1、 修饰类中的属性或者变量
无论属性是基本类型还是引用类型,final 所起的作用都是变量里面存放的”值”不能变。这个值,对于基本类型来说,变量里面放的就是实实在在的值,如 1,”abc” 等。而引用类型变量里面放的是个地址,所以用 final 修饰引用类型变量指的是它里面的地址不能变,并不是说这个地址所指向的对象或数组的内容不可以变,这个一定要注意。
例如:类中有一个属性是 final Person p=new Person(“name”); 那么你不能对 p 进行重新赋值,但是可以改变 p 里面属性的值 p.setName(‘newName’);final 修饰属性,声明变量时可以不赋值,而且一旦赋值就不能被修改了。对 final 属性可以在三个地方赋值:声明时、初始化块中、构造方法中,总之一定要赋值。
2、final修饰类中的方法
作用:可以被继承,但继承后不能被重写。
3、final修饰类
作用:类不可以被继承。