1、Java 继承的概念
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
2、Java继承的特点
(1)子类拥有父类非 private 的属性、方法。
(2)子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
(3)子类可以用自己的方式实现父类的方法。
(4)Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
(4)提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
3、Java继承存在的问题
(1)根据上述定义可以得出,子类B继承父类A,父类A存在私有属性,创建类B对象b的时候,b不拥有A的私有属性。
(2)创建类B的对象会调用类A的构造方法,但不会创建类A的对象,创建的是类B的对象b。
(3)类B的对象b可以通过公有方法间接访问类A中定义的属性。
(4)综上所述,创建子类对象时,父类的私有属性会被创建,但又不属于子类,又不存在父类对象。是不是很奇葩?
4、上Java代码——做个小实验
public class ClassExtends{
public static void main(String [] args){
System.out.println("Hello,World!");
Animal animal=new Animal();
animal.eat();
Dog dog1=new Dog();
Dog dog2=new Dog("bage",12);
dog2.getName();
}
}
class Animal{
private String name;
private int age;
public Animal(){
System.out.println(this+"\tAnimal对象引用,Animal的构造函数");
}
public Animal(String name,int age){
System.out.println(this+"\tAnimal对象引用,Animal的构造函数(带参数)");
this.name=name;
this.age=age;
}
public void eat(){
System.out.println(this+"\t对象吃饭");
}
public String getName(){
System.out.println(this+"\t调用Animal的getName()");
return this.name;
}
public int getAge(){
System.out.println(this+"\t调用Animal的getAge()");
return this.age;
}
}
class Dog extends Animal{
public Dog(){
//super();
System.out.println(this+"\t我是dog对象引用,Dog的构造函数");
}
public Dog(String name,int age){
super(name,age);
}
}
运行结果:
Hello,World!
Animal@15db9742 Animal对象引用,Animal的构造函数
Animal@15db9742 对象吃饭
Dog@6d06d69c Animal对象引用,Animal的构造函数
Dog@6d06d69c 我是dog对象引用,Dog的构造函数
Dog@7852e922 Animal对象引用,Animal的构造函数(带参数)
Dog@7852e922 调用Animal的getName()
5、结论
(1)创建子类对象是,子类会隐式的全部继承父类定义的所有属性、方法。
(2)子类对象只能显示的拥有(访问)非私有属性、方法。
(3)子类对象可以通过父类的公有方法访问父类定义的属性。