Java继承

本文介绍了Java中的继承概念,包括类的继承、父类与子类、继承的好处和格式。通过示例展示了如何创建人类、学生和教师类,并讨论了继承后的成员访问规则。强调了Java的单继承特性以及成员访问的限制。此外,还提及了多类定义在同一.java文件中的规范。
摘要由CSDN通过智能技术生成

1.概念:  

  • 在Java中指的是【一个类】可以【继承】【另一个类】
  • 【被继承的类】叫做【父类/超类/基类】
  • 【继承其他类的类】叫做【子类】
  • 继承后,【子类】中就拥有了【父类】中所有的成员(成员变量和成员方法)                               那么,【子类】就不需要在额外的区定义和【父类】一样的成员了,可以直接调用

2、继承的好处:

  1.   提高代码的复用性(减少沉余)
  2.   使类与类之间产生了关系

 3、继承的格式:

  • 关键字extends
    •     通过extends  关键字
    •     可以声明一个类区继承另一个类
      • 子类  与  父类  的关系

 给出一个人类的类:

//人类的类
public class Person {

    //成员变量
    String name;
    int age;

    //成员方法
    public void eat(){
        System.out.println("吃饭");
    }
    public void sleep(){
        System.out.println("睡觉");
    }
}

在定义一个学生的类:

//学生类
public class Student {
    //成员变量
    double score;

    //成员方法
    public void stydy(){
        System.out.println("学习");
    }
    public void eat(){

        System.out.println("吃饭");
    }
    public void sleep(){
        System.out.println("睡觉");
    }
}

最后定义教师的类用extends来调用父类Person

//教师类
public class Teacher extends Person {

    //成员变量
    double salary;   //工资
    //String name;
    //int age;

    //成员方法

    public void teach(){
        System.out.println("上课");
    }
   
}

创建一个测试类,如图

测试类:

public class Tests {
    public static void main(String[] args) {
 
        //实例化一个teacher对象

        Teacher teacher = new Teacher();
        teacher.name = "张老师";  //父类成员属性
        teacher.age = 30;       //父类成员属性
        teacher.salary = 3000;  //子类成员属性
        teacher.teach();        //父类成员方法
        teacher.sleep();        //父类成员方法
        teacher.teach();        //子类成员方法

4、继承总结:

  通过继承extends可以将一些共性的属性,行为抽取到一个父类中
      子类只需要继承即可,提高了代码的复用性
  另外需要注意一点:
  Java是单继承的,一个类只能继承一个直接父类,并且满足is-a的关系
      is - a 的关系
          Person 是父类、Teacher 是子类 -->  class Teacher extends Person
                 Teacher is a Person
                 Student is a person
         Dog is a Person ???   //语法上是可以的,但不符合显示逻辑
             (dog is a person 的关系也走不通)

5、多类:

为了开发学习方便,我们把多个类定义在一个.java文件中
当一个Java文件存在多个类的时候,必须保证java文件的名称和公共类的;类名称一致即可
       换句话说,只要这个java文件的pubic class 类名称和Java文件名称相同即可
--> 注意: 一个.java文件中只允许存在一个public class
比如:
Person 类中除了public class Person,还有class Dog, class Cat
      然后编译的时候自动产生三个编译文件,即Person.class  Dog.class  Cat.class

5、继承后,成员访问的规则

1.继承后构造方法的访问规则:
          规则一:
                构造方法的访问规则:
                       父类的构造方法不能被子类继承

class Fu{
    //构造方法
    public  Fu(){
    }

    public Fu(String name ,int age){
    }
}

class Zi extends Fu{

}

public class Tsets {
    public static void main(String[] args) {
        // Zi类默认系统提供了无参构造方法
        Zi zi = new Zi();
        // Zi类继承了Fu类,那么Fu类中的构造方法是否可以被继承呢
        // Zi zi_1= new Zi("张三",18);   // 代码编报错,因为没有继承关系
        
    }

}

2.继承后私有成员的访问规则:
          规则二:父类的私有成员可以被子类继承,但不能直接访问

class Fu{
    // 私有的成员属性
    private int num = 100;
    // 私有成员方法
    private void method(){
        System.out.println("父类中的私有成员方法");
    }
}
class Zi extends Fu{
}
public class Tests {
    public static void main(String[] args) {
        //实例化一个子类对象,测试子类对象是否 可以调用父类私有成员
        Zi zi = new Zi();
        //System.out.println(zi.num); // 编译错误
        //zi.method();  //编译错误


3.继承后非私有成员的访问规则

        规则三:

                 继承后,子类可以调用父类的非私有成员变量或方法

                 当通过子类访问非私有成员时,会优先在子类中查找,如果找到就使用子类,

                        没有找到就会去父类去找。

class Fu{
    int money = 100;
    public void method(){
        System.out.println("Fu类中的成员方法method");
    }

}

class Zi extends Fu{
    /*
    * 如果子类中和父类的成员一摸一样
    *   那么调用的相同名称的变量或者方法的时候,会调用子类还是父类
    * */
    int money = 10;
    @Override
    public void method(){
        System.out.println("Zi类中的成员方法method");
    }

}

public class Tsets {
    public static void main(String[] args) {
        //实例化一个Zi类对象,测试调用父类的非私有成员
        Zi zi = new Zi();
        System.out.println(zi.money);
        zi.method();
    }

4、总结:

   构造方法不能被继承

   父类的私有成员可以 被继承 ,但子类不能直接调用,因为父类私有成员只限于本类中

   当通过子类访问非私有成员时,优先子类,子类没有再去父类查找

    --> 一个Java文件可以定义多个类,但该文件只能有一个public修饰的类,该类的名称和文件名  一致

         效果:相当于三个文件中的代码放到了一个文件中,使用还是和之前一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值