1,类继承的基本使用
定义:子类能够继承父类的属性和方法;
注意点:Java中只支持单继承;私有方法不能继承;
上代码:
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 void say(){
System.out.println("我是一个动物,我叫:"+this.getName()+",我的年龄是:"+this.getAge());
}
}
这里定义一个Animal类和两个私有属性 name和age 然后给出共有的set get接口 以及一个共有的say()方法;
public class Dog extends Animal {
/*定义Dog类继承Aniaml*/
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("旺财");
dog.setAge(3);
dog.say();
}
}
我们再定义一个Dog类 通过extends关键字 继承Animal类;
我们实际上把父类Animal的共有方法get set以及say()方法都继承了;
//output:
我是一个动物,我叫:旺财,我的年龄是:3
2,方法重写
方法的重写就是我们可以在子类中根据实际情况把父类的方法重写;要注意的是修改方法的修饰权限只能由大范围到小范围改变,比如父类中的权限为protected,继承后子类的方法权限只能改为public。
上代码:
/*定义Cat类继承Animal*/
public class Cat extends Animal {
/*重写父类say方法*/
public void say(){
System.out.println("我是一只猫,我叫:"+this.getName()+",我的年龄是:"+this.getAge());
}
public static void main(String[] args) {
Cat cat = new Cat();
cat.getName();
cat.getAge();
cat.say();
}
}
上面我们重写父类的say方法,改成是猫,以及用getName和getAge,因为当前对象里继承不到父类的私有字段;
//output:
我是一只猫,我叫:小白,我的年龄是:1
我们发现,虽然继承了父类say方法,但最后输出的却是重写后方法内的操作。这就是方法重写的精髓所在。
3,对象实例过程以及super关键字
对象实例化 先实例化调用父类构造方法,再调用子类实例化构造方法;
super关键主要是调用父类方法或者属性;
我们修改下上面的例子:
public class Animal {
private String name;
private int age;
/*定义无参构造方法*/
public Animal(){
System.out.println("无参父类构造方法");
}
/*定义有参构造方法
* name
* age
* */
public Animal(String name,int age) {
System.out.println("有参父类构造方法");
this.name=name;
this.age =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 void say(){
System.out.println("我是一个动物,我叫:"+this.getName()+",我的年龄是:"+this.getAge());
}
}
/*定义Cat类继承Animal*/
public class Cat extends Animal {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
/*子类无参构造方法*/
public Cat(){
super();
System.out.println("子类无参构造方法");
}
/*子类有参构造方法*/
public Cat(String name,int age,String address) {
super(name,age); //super调用父类的方法
this.address=address; //子类自己的属性
System.out.println("子类有参构造方法");
}
/*重写父类say方法*/
public void say(){
System.out.println("我是一只猫,我叫:"+this.getName()+",我的年龄是:"+this.getAge()+"我的地址是:"+this.getAddress());
}
public static void main(String[] args) {
Cat cat = new Cat("小白",1,"地球");
cat.say();
}
}
//output:
有参父类构造方法
子类有参构造方法
我是一只猫,我叫:小白,我的年龄是:1,我的地址是:地球
从结果中可以看出super的作用是调用父类的属性和方法,address是子类独有的属性和name,age的调用方法不一样!