继承关系&修饰符

继承

继承描述的类与类之间的关系,一般把多个子类的共性抽取到一个父类中,子类和父类就是继承关系。

举例 学生和老师以及人类的关系

  • 人类
public class Person  {
    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    //行为:吃饭
    public void eat(String food){
        System.out.println("正在吃"+food);
    }

}
  • 学生类
public class Student extends Person{
    //学号
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
    //行为:学习
    public void study(String subject){
        System.out.println("学生努力学习"+subject);
    }
}
  • 老师类
public class Teacher extends Person {
    public void teach(String subject){
        System.out.println("老师努力讲"+subject);
    }
}
  • 测试类
public class Demo1 {
    public static void main(String[] args) {
        Student stu = new Student();
        stu.setId("12345");
        stu.setName("张三");
        stu.setAge("20");

        String id = stu.getId();
        String age = stu.getAge();
        String name = stu.getName();
        System.out.println(id);
        System.out.println(name);
        System.out.println(age);
        System.out.println("----------");

        stu.eat("8元管饱");
        stu.study("Java");

        System.out.println("------------");
        Teacher t=new Teacher();
        t.setName("老王");
        t.setAge("18");
        //t.setId("006");Teacher类和Person都没有,会报错
    }
}

继承中成员的访问

  • 成员变量的访问

遵循就近原则:
子类局部有就用局部,局部没有就找子类成员的,子类成员没有就使用父类成员的。最终找不到就报错
当父类和子类有同名的成员变量时,就可以使用this和super进行区分
this.成员变量: 本类的成员变量
super.成员变量: 父类的成员变量

//动物类(父类)
public class Animal {
   public int age=10;
}

//狗类(子类)
public class Dog extends Animal {
    int age=2;
    public void show(){
        int age=6;
        System.out.println(age); //6
        System.out.println(this.age); //2   this.age 表示本类的成员变量age
        System.out.println(super.age); //10  super.age 表示父类的成员变量的age
    }
}
//测试类
public class Demo2 {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.show();
    }
}

成员方法的访问

  • 如果子类有就用子类的,子类没有就用父类;

  • 子类和父类有"一模一样"的方法,就用子类自己的方法。这种现象叫做【方法重写\复写\覆盖】

  • 方法重写的注意事项

    • @Override 是一个注解(用来标识一个方法是否符合重写的规则)
    • 方法名一样
    • 参数列表一样(参数类型和个数)
    • 返回值类型子类要小于等于父类(了解,一点用没有)
    • 子类权限要大于等于父类
      public > protected > 默认的(不写) > private
      在这里插入图片描述
  • 方法重写的意义
    当父类方法不满足子类要求时,在保证父类方法不变的前提下,子类可以做自己的实现

public class Animal {
  public void eat(){
      System.out.println("动物吃东西");
  }
}

public class Dog extends Animal {
    //复写父类方法
    @Override
    public void eat(){
        System.out.println("狗吃骨头");
    }
    //看家(子类特有方法)
    public void lookHome(){
        System.out.println("狗在看家");
    }

}

public class Demo4 {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.eat();//复写的方法
        d.lookHome();
    }
}
  • 构造方法的访问
    格式:
 public 类名(参数列表){
 ...
 }

构造方法什么时候执行?

创建对象的时候执行(每次new 一个对象,都会执行构造方法)

继承中构造方法如何访问

1.在每一个构造方法的第一行,都会隐含的有一句super(),去调用父类的空参数构造方法
2.如果不想去调用父类的空参数构造方法,可以手动的使用super(参数),去调用父类的有参数构造方法
3.this(...)super(...) 只能出现的构造方法的第一句

在这里插入图片描述

其他修饰符

  • 权限修饰符
    权限修饰符一共有四种,用来控制类的成员的作用范围
public > protected > 默认的(不写) > private

protected:protected修饰的变量或者方法,只给本类和子类使用;同一个包中也能访问
默认的: 被默认的修饰的变量或者方法,只能在同一个包中使用
  • final
    final是最终的意思,可修饰类、方法、变量
final修饰类
   不能被继承
final修饰方法
   不能被复写(重写)
final修饰变量
   -修饰局部变量: 变量值只能被赋值一次
   -修饰成员变量:没有默认值,必须手动赋值,但是变量值也只能被赋值一次
   注意事项:
      如果final修饰引用类型的变量,表示的是地址值不能被改变

举例

public static void main(String[] args){
    final Student s = new Student(23);
   s = new Student(24);  // 错误
   s.setAge(24);  // 正确
}
  • static
1.静态属于类,不属于任何一个对象
2.【静态的变量或者方法,建议使用类名调用】
3.被静态修饰的变量可以被该类的多个对象共享

静态注意事项:

1. 静态方法中不能有this关键字
2. 静态方法只能调用静态方法和静态变量
3. 非静态方法可以调用静态方法,也可以调用静态变量

静态在实际开发中经常用来写工具类

/*
如果一个类中的所有方法,都是静态的,那么这个类就是工具类
好处:类名直接调用方法,特别方便
*/
/*
数组工具类:专门用于操作数组的
 */
public class ArrayUtils {
    //求数组元素的和
    public static int getSum(int[] array){
        int sum=0;
        for (int i = 0; i < array.length; i++) {
            sum+=array[i];
        }
        return sum;
    }

    //打印数组中的元素
    public static  void printArray(int[] array){
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }
}
class Student {
public String name; //姓名
    public int age; //年龄
    public static String university; //学校 共享数据!所以设计为静态!
     public void show() {
        System.out.println(name + "," + age + "," + university);
    }
    }
public class StaticDemo {
    public static void main(String[] args) {
     // 为对象的共享数据赋值
        Student.university = "北京大学";
        
        Student s1 = new Student();
        s1.name = "林青霞";
        s1.age = 30;
        s1.show();
        
        Student s2 = new Student();
        s2.name = "风清扬";
        s2.age = 33;
        s2.show();
    }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值