【继承-学习笔记】

static静态变量

static 表示静态,是java中一个修饰符,可以修饰成员方法,成员变量
1.被static修饰的成员变量,叫做静态变量
特点:
静态变量被所有对象共享
不属于对象,属于类
随着类的加载而加载,优先于对象存在
调用方式:
类名调用(推荐)
对象名调用
2.被static修饰的成员方法,叫做静态方法
特点
多用在测试类和工具类中
javabean类中很少会用

测试类用来检查其他类是否书写正确
javabean类:用来描述一类事物的类
工具类:帮助我们做一些事情,但是不描述任何事物的类
类名见名知意
私有构造方法(不能创建对象)
方法定义为静态

调用方式
类名调用(推荐)
对象名调用

定义一个工具类,完成数组返回和求平均值
day13-code->staticDemo2
定义一个集合,用于存储3个学生对象
学生类的属性为:name,age,gender
定义一个工具类,用于获取集合中最大学生的年龄

day13-code->staticDemo3

static的注意事项
1.静态方法只能访问静态变量和静态方法(因为没有对象来调用非静态的成员变量或方法)
2.非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
3.静态方法中没有this关键字

继承

封装对象代表什么,就得封装对应的数据,并提供数据对应的行为
继承
java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系.

public class Student extends Person(){}

Student称为子类(派生类),Person称为父类(基类或超类)

使用继承的好处
可以把多个子类中重复的代码抽取到父类中,提高代码的复用性
子类可以在父类的基础上,增加其他的功能,使子类更强大
什么时候使用继承
当类和类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码

继承的特点

Java只支持单继承一个子类只有一个父类,一个父类可以有多个子类
不支持多继承子类不能同时继承多个父类
支持多层继承子类A继承父类B,父类B可以继承父类C
每个类都直接或者间接的继承于Object类
在父类中方法的权限修饰符是private,子类无法访问该方法,子类只能访问父类中非私的
在这里插入图片描述

继承中成员变量的访问特点

就近原则先在局部位置找,在本类成员位置找,父类成员位置找,逐级往上
如果出现重名的成员变量,name从局部位置网上找,this.name从本类成员位置往上找,super.name从父类成员位置开始往上找
在这里插入图片描述

继承中成员方法的访问特点

就近原则

方法的重写
当父类的方法不能满足子类现在的需求时,需要进行方法的重写
书写格式
在继承体系中,子类出现了和父类一模一样的方法声明,我们就称子类这个方法是重写的方法
@Override重写注释
1.@Override是放在重写后的方法上,校验子类重写时语法是否正确
2.加上注释后如果有红色波浪线,表示语法错误
3.建议重写方法都加@Override注解,代码安全.优雅
在这里插入图片描述
方法重写注意事项和要求
1.重写方法的名称,形参列表必须与父类中的一致
2.子类重写父类方法时,访问权限子类必须大于等于父类
3.子类重写父类方法时,返回值类型子类必须小于等于父类
4.建议:重写的方法尽量和父类保持一致
5.只有被添加到虚方法表中方法才能被重写

继承中的构造方法

1.父类中的构造方法不会被子类继承,但可以通过super调用
2.子类中的所有构造方法会默认先访问父类中的无参构造,再执行自己
子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据.子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化.

怎么调用父类构造方法?
子类构造方法的第一行语句默认都是:super(),不写也存在,且必须在第一行
如果想调用父类有参构造,必须手动写super进行调用

this.super的使用
this理解为一个变量,表示当前该方法调用者的地址值
super代表父类的存储空间
在这里插入图片描述

public class Student{
	String name;
	int age;
	String school;
	public Student(){
		this(null,0,"大学");//表示调用本类的其他构造方法,默认school为"大学"//给数据默认值时用
		//在此处构造方法中不会添加super(),因为调用的其他构造方法当中已有super();
	}
	public Student(String name,int age,String school){
		this.name = name;
		this.age = age;
		this.school = school;
	}
}

先有很多员工,按照工作内容不同分教研部员工和行政部员工
1.教研部根据教学方式不同又分为讲师和助教,行政部根据负责事项不同又分为维护员工和采购员工
2.公司的每一个员工都有编号,姓名和其负责的工作.每个员工都有工作的功能,但是具体工作内容又不一样

多态

什么是多态?
同类型的对象,表现出的不同形态
多态的表现形式?
父类类型 对象名称 = 子类对象;
多态的前提
1.有继承关系
2.有父类引用子类对象
3.有方法重写

多态调用成员的特点

变量调用:编译看左边,运行也看左边
编译看左边:javac编译代码的时候会看左边的父类中有没有这个变量,如果有编译成功;如果没有编译失败
运行看左边:java运行代码的时候,实际获取的是左边父类中的成员变量的值
方法调用:编译看左边,运行看右边
编译看左边:javac编译代码的时候会看左边的父类中有没有这个方法,如果有编译成功;如果没有编译失败
运行看右边:java运行代码的时候,实际获取的是右边子类中的方法

多态的优势和弊端

优势:
1.在多态形势下,右边对象可以实现解耦合,便于扩展和维护

Person p = new Student();
p.work();//业务逻辑发生改变时,后续代码无需修改

2.定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利
弊端
1.不能调用
子类
特有方法//在编译时会检查父类中有没有该方法
解决方案:将调用者父类变回子类类型即可

Person p = new Student();
Student s = (Student)p;//强制类型转换,不能转成其他类的类型,会报错ClassCastException

a instanceof Dog//判断a是不是Dog类
a instanceof Dog d//判断a是不是Dog类,如果是则强制转换成Dog类型,转换之后变量名为d;如果不是则不强转,结果直接是false

练习
在这里插入图片描述

 public void keepPet(Dog dog,String something){
        System.out.println("年龄为" + age + "岁的" + name + "养了一只" + dog.getColor() + "颜色的" + dog.getAge() + "岁的狗");
        System.out.println(dog.getAge() + "岁的" + dog.getColor() + "颜色的狗两之前腿死死抱住" + something + "猛吃");
    }
public void keepPet(Cat cat,String something){
        System.out.println("年龄为" + age + "的" + name + "养了一只" + cat.getColor() + "颜色的" + cat.getAge() + "岁的猫");
        System.out.println(cat.getAge() + "岁的" + cat.getColor() + "颜色的猫眯着眼睛侧着头吃" + something);
    }

包.final.权限修饰符.代码块

包就是文件夹,用来管理各种不同功能的java类,方便后期代码维护

包名的规则:公司域名的反写+包的作用,需要全部英文小写,见名知意

使用其他类的规则:
1.使用同一个包中的类,不需要导包
2.使用java.lang包中的类时,不需要导包
3.其他情况都需要导包
4.如果同时使用两个包中的同类名,需要用全类名

final

final修饰方法表明该方法是最终方法,不能被子类重写
final修饰类表明该类是最终类,不能被继承
final修饰变量叫做常量,只能被赋值一次
在实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性
常量的命名规范
单个单词:全部大写
多个单词:全部大写,单词之间用下划线隔开
final修饰的变量是基本类型:那么变量存储的数据值不能发生改变
final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,对象内部属性值可以改变
在这里插入图片描述

权限修饰符

在这里插入图片描述
权限修饰符的使用规则
实际开发中,一般只用private和public
成员变量私有 + 方法公开
特例:如果方法中的代码是抽取其他方法中共性代

代码块

1.局部代码块方法里面:提前结束变量的生命周期
2.构造代码块写在成员位置的代码块,可以把多个构造方法中重复的代码抽取出来.在执行时,我们在创建本类对象的时候会先执行构造代码块 再执行构造方法
3.静态代码块
格式: static()
**特点:**需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次
使用场景在类加载的时候,做一些数据初始化的时候使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值