关于Java面向对象知识:继承,多态。其中可能会有一些知识点被我不归属多态,我会再写一篇博客关于剩下没有被我归属于三大特性的知识,
在Java中,类的继承是指在一个现有 类的基础上去构建一个新的类,构建出来的新类称为子类,现有类称为父类。子类继承父类的属性和方法,使得子类对象(实例)具有父类的特征和行为。在Java中要想声明一个类继承另一个类需要使用extends关键字。格式如下
class 父类{
.....
}
class 子类 extends 父类{
.....
}
当子类继承父类后也可以定义自己的属性和和方法
public class Animal {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Dog extends Animal {
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
public class Example {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("牧羊犬");
dog.setAge(3);
dog.setColor("黑色");
System.out.println("名称:"+dog.getName()+",年龄: "+dog.getAge()+",颜色:"+dog.getColor());
}
}
注:1、在Java中类只支持单继承,不允许多继承,一个类只能有一个直接父类
2、但一个父类可以被多个子类继承
3、多重继承也是可以的
在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行些修改, 即对父类的方法进行重写。在子类中重写的方法需要和父类被重写的方法具有相同的方法名参数列表和返回值类型,且在子类重写的方法不能拥有比父类方法更加严格的访问权限。
public class Animal {
private String name;
private int age;
public void shout() {
System.out.println("动物叫");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Dog extends Animal {
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void shout() {
System.out.println("汪汪汪");
}
}
public class Example {
public static void main(String[] args) {
Dog dog = new Dog();
dog.shout();
dog.setName("牧羊犬");
dog.setAge(3);
dog.setColor("黑色");
System.out.println("名称:"+dog.getName()+",年龄: "+dog.getAge()+",颜色:"+dog.getColor());
}
}
在这种就对shout方法进行了重写。
注:在重写父类方法时,不能使用比父类中重写方法更严格的访问权限。
当子类重写父类方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,Java提供了super关键字,super关键字可以在子类调用父类的普通属性、方法和构造方法
public class Animal {
String name = "牧羊犬";
void shout () {
System.out.println("动物叫声");
}
}
public class Dog extends Animal{
public void shout() {
super.shout();
System.out.println("汪汪汪");
}
public void printName() {
System.out.println("名字:"+name);
}
}
public class Example {
public static void main(String[] args) {
Dog dog = new Dog();
dog.shout();
dog.printName();
}
}
1、我们可以在子类的方法或构造器中。通过使用"super.属性"或"super.方法"的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略"super. "
2、特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式的使用"super .属性"的方式,表明调用的是父类中声明的属性。
3、特殊情况:当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用"super .方法"的方式,表明调用的是父类中被重写的方法。
多态是指不同对象在调用同一个方法时表现出的多种不同行为,是一种运行时行为,使用前提是要有1.类的继承关系 2.方法的重写
多态的使用:对父类的引用指向子类的对象,在编译期只能调用父类中的声明的方法,当调用子父类同名同参的方法时,实际上执行的是子类重写的父类的方法。这个只是用于方法,对于属性,编译和运行都是父类中的属性。
public class Animal {
public void eat() {
System.out.println("动物进食");
}
public void shout() {
System.out.println("动物叫");
}
}
public class Cat extends Animal{
public void work() {
System.out.println("猫抓老鼠");
}
public void eat() {
System.out.println("猫吃鱼");
}
public void shout() {
System.out.println("喵喵喵");
}
}
public class Dog extends Animal {
public void work() {
System.out.println("狗看门");
}
public void eat() {
System.out.println("狗吃狗粮");
}
public void shout() {
System.out.println("汪汪汪");
}
}
public class AnimalText {
public static void main(String[] args) {
Animal p1 = new Dog();
p1.eat();
p1.shout();
//p1.work();
Animal p2 = new Cat();
p2.eat();
p2.shout();
}
在多态的编译中,只能调用父类中的声明的方法,在子类中重新定义的方法无法使用,可以了理解为编译看右边,运行看左边。
1、向上转型:子类对象->父类对象,程序会自动完成。
2、向下转型:父类对象->子类对象,必须指明要转型的子类类型
父类类型 父类对象 = 子类类型;
父类类型 父类对象 = 子类实例;
子类类型 子类对象 = (子类) 父类对象;
上面的例子就是向上转型
向下转型:
代码如下:
public class AnimalText {
public static void main(String[] args) {
Animal an = new Dog();
Dog dog = (Dog) an;
dog.shout();
dog.eat();
}
}
a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。
使用情境:为了避免在向下转型时出现classcastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
注:如果a instanceofA返回true,则a instanceofB也返回true.
其中,类B是类A的父类。
关于三大特性的到这里就结束了,其他的知识点会在下一篇博客进行补充。