Static
在类中,定义变量时,带有static修饰的变量是静态成员变量
或者说是这个类的公共变量,可以被共享访问
不需要通过具体的成员变量就可以使用
private static String name;
//name作为静态成员变量
private int id;
//id作为实例成员变量
public static void main(){
System.out.println(User.name);
//name是这个类的公共变量
User u1=new User();
System.out.println(u1.id);
//id就是对象u1的成员变量,当定义出新的成员时,新成员的变量也有id
静态方法只能访问静态的成员,不可以直接访问实例成员
实例方法可以访问静态成员也可以访问实例成员
静态方法中是不可以出现this关键字的。
继承
继承的概念
extends可以让一个类和另一个类建立1父子关系
public class Student extends People{}
Student被称为子类(派生类), People被称为父类(基类或超类)
当子类
继承父类后,就可以直接使用父类公共的属性和方法
继承的优点
继承可以提高代码的复用性
继承设计规范
子类们的相同特征(共性属性,共性方法)放在父类中定义,子类独有的属性和行为应该定义再子类自己里边
以下为一个新创建的子类对象的内存示意图
确实为一个整体对象,但分为两个部分
继承的特性
1,子类可以继承父类的行为和属性,但不能继承父类的构造器、
2,java是单继承模式,一个类只能继承一个父类
3,Java不支持多继承,但是支持多层继承
4,java中所有类都是Object的子类
5,子类不能继承父类的静态成员变量,虽然可以使用,但是是static的特点,父类共享给子类使用的;
6,子类可以继承父类的私有成员,只是不能直接访问
为什么不支持多继承?
假设可以实现多继承,一个子类拥有两个父类,而父类中含有两个不同的重名方法,那子类在执行方法时必定会出现错误
当多重继承父类时,
假如父类和父类的父类中含有重名的方法,子类会就近继承父类的方法;
当父类和子类拥有重名的方法会优先调用子类自己的,
就近原则
当涉及到元素访问时,
会优先访问子类局部
其次是子类成员
最后是父类
System.out.println(name);
//如果想要访问“子类名”,可以使用this.name指定访问当前子类对象的name
System.out.println(this.name);
//如果子类和父类存在重名的变量,想要使用父类的,可以使用super关键字
System.out.println(super.name);
什么是方法重写
在继承体系中,子类出现了和父类中一模一样的方法声明,就称子类这个方法是重写的方法
方法重写的应用场景
1,当子类需要父类的功能,但父类的该功能不完全满足自己的需求时、
2,子类可以重写父类中的方法
3,重写时要在方法开头加上@Override,重写校验注解,同时可以作为重写的标志
重写时先使用super关键字,调用父类的方法,再加上子类所特有的部分
重写的要求
1,重写方法的名称,形参列表必须与被重写方法的名称和参数列表一致
2,私有方法不能被重写
3,子类重写父类方法时,访问权限必须大有或者等于父类(缺省<protected<public)
4,子类不能重写父类的静态方法,如果重写会报错
继承后,构造器的行为
调用子类所有构造器都会默认先访问父类中的无参构造器,再执行自己
为什么?
1,子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据
2,子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化
怎么调用父类构造器的?
子类构造器的第一行语句默认都是:super(),虽然可以不写,但是始终存在
继承后,子类构造器访问父类有参构造器的特点
super关键字可以在子类中调用父类的私有变量
数据进行如下流程的传递
super调用父类有参构造器的作用
初始化继承父类的数据
如果父类中没有无参数构造器,只有有参数构造器,会出现什么现象呢
会报错,因为子类默认会调用无参构造器
如何解决
子类构造器中可以通过书写super(....),手动调用父类的有参构造器
this和super的使用总结
this关键字可以通过提供不同的参数列表来调用本类的其他构造器
子类通过this()去调用本类的其他构造器,其他构造器会通过super去手动调用父类的构造器,最终还是会调用父类的构造器
所以this和super都只能放在构造器里的第一行,且不能存在于同一个构造器中