java 继承的基本实现

继承的基本实现类的继承格式

在java中使用extends关键字完成类的继承关系,操作格式如下:

class 父类{}
class 子类 extends 父类{}

继承父类的功能,扩展子类的所有功能。

class Person{
    private String name;
    private int age;
    public void setName(String name){
    this.name = name;    
    }
    public void setInt(int age){
    this.age = age;    
    }
    public String getName(){
    return this.name;    
    }
    public int getAge(){
    return this.age;
    }
}
class student extends Person{
    //此处不添加任何代码
}
public class ExtDemo02{
    public static void main(String args[]){
    Student stu = new Student();
    stu.setName("张三");
    set.setAge(30);
    System.out.println(stu.getName()+stu.getAge());
    }
}




子类有时候也称之为派生类。

继承的进一步研究

子类对象的实例化过程

实例化子类对象:
1.先调用父类的构造->调用父类构造
2.再调用子类构造->调用子类构造

实例:

InstanceDemo.java

class Person{
    private String name;
    private int age;
    public Person(){
    System.out.println("父类Person中的构造方法");
    }
    public void setName(String name){
    this.name = name;    
    }
    public void setInt(int age){
    this.age = age;    
    }
    public String getName(){
    return this.name;    
    }
    public int getAge(){
    return this.age;
    }
}
class Student extends Person{
    private String school;
    public Student(){
    System.out.println("子类student中构造");
    }
}
public class InstanceDemo{
    public static void main(String args[]){
    Student stu = new Student();    
    }
}


//输出:父类Person中的构造
    子类Student中的构造

实际上此时隐含在Student的构造方法的第一行有以下代码:
    super();    //调用父类的构造函数
即代码相当于:
class Person{
    private String name;
    private int age;
    public Person(){
    System.out.println("父类Person中的构造方法");
    }
    public void setName(String name){
    this.name = name;    
    }
    public void setInt(int age){
    this.age = age;    
    }
    public String getName(){
    return this.name;    
    }
    public int getAge(){
    return this.age;
    }
}
class Student extends Person{
    private String school;
    public Student(){
    super();
    System.out.println("子类student中构造");
    }
}
public class InstanceDemo{
    public static void main(String args[]){
    Student stu = new Student();    
    }
}



注意点:在方法覆写时必须考虑到权限问题,即:被子类覆写的方法不能拥有比父类方法更加严格的访问权限。
访问权限一共有四种,现在只讲三种:
●private:只能被类内访问,权限最第
●default:相当于什么都不声明
●public:最大的访问权限
●大小关系:private<default<public

如果降低了访问权限时如Person使用public而Student使用default时,会产生以下错误:
print() in Student cannot override print() in Person; attempting to assign weaker access privileges; was public void print()
//表示错误的,降低了权限

子类会自动调用覆写的方法,但此时如果非要调用父类中的方法的话,使用super()关键字。
如:Student构造方法调用父类的方法可以进行以下修改:

class Person{
    private String name;
    private int age;
    public Person(){
    System.out.println("父类Person中的构造方法");
    }
    public void setName(String name){
    this.name = name;    
    }
    public void setInt(int age){
    this.age = age;    
    }
    public String getName(){
    return this.name;    
    }
    public int getAge(){
    return this.age;
    }
    public void print(){
    System.out.println("just a moment!");
    }
}
class Student extends Person{
    private String school;
    public Student(){
    super.print();
    System.out.println("子类student中构造");
    }
}
public class InstanceDemo{
    public static void main(String args[]){
    Student stu = new Student();    
    }
}




---------------------------------------------------------
问题:如果现在在父类中使用private 关键字声明了一个方法,那么在子类中使用default权限算是覆写吗?
答  :不是覆写.
------------------------------------------------------
class Person{
    private String name;
    private int age;
    public void setName(String name){
    this.name = name;    
    }
    public void setInt(int age){
    this.age = age;    
    }
    public String getName(){
    return this.name;    
    }
    public int getAge(){
    return this.age;
    }
    private void print(){
    System.out.println("Person------>void print()");
    }
}
class Student extends Person{
    private String school;
    void print(){
    System.out.println("Student-------->void print()");
    }
}
public class InstanceDemo{
    public static void main(String args[]){
    Student stu = new Student();
    stu.print();
    }
}


输出:Student---------->void print()

此时,方法没有被覆写,而是相当于在子类中又重新定义了一个新的方法出来。

3.3 属性的覆写

在子类中声明了父类同名的属性。
class Person{
    public String name;
    private int age;
    public void setName(String name){
    this.name = name;    
    }
    public void setInt(int age){
    this.age = age;    
    }
    public String getName(){
    return this.name;    
    }
    public int getAge(){
    return this.age;
    }
    private void print(){
    System.out.println("Person------>void print()");
    }
}
class Student extends Person{
    public String name;
    void print(){
    System.out.println("父类中的属性:"+super.info);
    System.out.println("子类中的属性:"+this.info);
    }
}
public class OverrideDemo{
    public static void main(String args[]){
    Student stu = new Student();
    stu.print();
    }
}



3.4方法的覆写与的方法的重载

overloading                    overrideing
方法名称相同参数的类型或个数不同        方法名称参数的类型返回值类型全部相同
对权限没有要求                    被覆写的方法不能拥有更严格的权限
发生在一个类中                    发生在继承类中


3.5    super关键字
表示从子类调用父类中的指定操作,例如调用属性,方法,构造等。因为在子类实例化的时候会默认调用父类中的无参构造,如果现在希望调用有参构造方法,可以使用super方法传递参数。


class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
        System.out.println("父雷Person中的构造方法");
    }
    public void setName(String name){
    this.name = name;    
    }
    public void setInt(int age){
    this.age = age;    
    }
    public String getName(){
    return this.name;    
    }
    public int getAge(){
    return this.age;
    }
  }
class Student extends Person{
    private String school;
    public Student(String name,int age,String school){
        super(name,age);
        this.school = school;
        System.out.println("子类student中的构造方法");
    }
}
public class OverrideDemo{
    public static void main(String args[]){
    Student stu = new Student("张三",30,"山东大学");
    }
}


当子类调用无参构造方法时,父雷中不存在无参构造方法,此时就会报错。因为子类会在无参构造方法第一行隐含调用super方法,解决方法为:父类定义一个无参构造方法,或使用super调用父类存在参数的方法。

不管任何时候,子类实例化时候先去调用父类中的构造方法,默认调用无参构造。

总结:
使用 super 调用无参方法
1.建立含无参构造的类。
2.建立含无参构造子类,继承父类。
3.子类中构造第一行添加或不添加super

使用 super 调用含参数的方法
1.建立含参构造的类。
2.建立含参子类(覆写构造函数),继承父类。
3.子类中构造第一行添加super(内部参数同父类构造方法)

this与super的区别

this                                    super
属性访问:访问本类中的属性,如果本类没有这些属性则从父类中查找。    属性访问:访问父类中的属性
方法:访问本类中的方法,如果本类没有则从父类中查找。            方法:直接访问父类中的方法
调用构造:调用本类构造,必须放在构造方法首行。                调用构造:调用父类构造,必须放在子类构造方法的首行。
特殊:表示当前对象。                            特殊:无此概念

对于this和super本身都可以调用构造方法,而且调用的时候都必须放在构造方法首行,所以两个关键字不能同时出现。

疑问:如果在构造方法中(子类)使用了this,那么是不是就不调用父类中的构造方法?

  答:子类中不可能同时都调用this()方法,所以默认仍会调用父类的构造方法。


Java中的继承实现接口是两种不同的机制,但可以同时使用。 继承是一种对象关系,通过扩展已有的类创建一个新的类。子类继承了父类的属性和方法,并且可以重写父类的方法或添加自己的属性和方法继承可以实现代码重用和继承层次的构建,在面向对象编程中起到了非常重要的作用。 实现接口是一种约束,通过实现接口定义和规范了一组方法。接口中的方法没有具体的实现,需要在实现接口的类中具体实现。一个类可以实现多个接口,从而具备多个不同的行为。接口可以实现多态性和接口的解耦,是面向对象编程中的重要概念之一。 在Java中,一个类可以同时继承一个类并实现多个接口。通过继承类可以继承类的属性和方法,通过实现接口可以获得接口定义的方法继承实现接口一起使用可以使得一个类既具备了父类的行为,又能根据需要实现多个接口的行为。 例如,我们有一个动物类Animal,它有一些基本的属性和方法,如eat()和sleep()。我们还有一个接口Swim,其中定义了swim()方法。如果我们想创建一个能够游泳的狗类,我们可以让它继承Animal类并实现Swim接口。这样,这个狗类既能够继承Animal类的行为,如eat()和sleep(),又能够具备Swim接口定义的swim()行为。 综上所述,Java中可以同时使用继承实现接口的机制,通过继承类获得类的属性和方法,通过实现接口获得接口定义的方法。这样可以使得一个类同时具备多个不同的行为,实现更加灵活和可扩展的代码设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

e421083458

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值