Java 02入门,封装继承多态
static关键字
1.介绍
静态的意思,可以修饰变量以及函数
2.特点
1.被类的所有对象所共享
2.多了一种调用方式,可以通过类名进行调用
3.随着类的加载而加载,优先于对象存在*****
3.作用
1.在一个对象里面的一个变量改为static,那么所有的数据均变为这个值,那么在底层储存里面,就会节约空间,也就是第一个特点,被所有对象所共享;
2.通过类名进行调用指的是,可以直接Student.school;进行调用,并且也推荐使用该种调用
3.在对象创立前就可以进行调用了
4.成员变量static使用场景
1.需要所有对象共享的时候
5.内存图
1.首先在方法区加载调用的类和主方法main
2.java虚拟机调用main在栈空间里开辟main方法
3.这个时候调用了user,方法区加载类user
4.此时在堆内存里开辟一块静态成员变量区,将number存入
5.也就是说,只要调用了user类就会产生静态成员变量区
6.堆内存里的数据具有默认值
7.new创建对象,先在栈空间的调用user,在堆内存里创建对象
8.地址传回,完成了对象的创建
6.static成员方法
1,一般是创建工具类的时候才会使用static
7.技巧
解释:建立一个private的工具类,里面都是static。实现仅仅通过对象名进行调用了
8.注意事项
在静态的方法中,只能调用静态方法,不能调用非静态方法原因:在内存中,只有类被创建的时候,才有非静态的方法和常量
不能使用this关键字原因:同理,对象没有创建,没有对象也就是没有this
9.重新认识main方法
继承
1.介绍
让类与类之间产生关系(子父类关系),子类可以之间使用父类中的非私有成员
父类也称为基类和超类
子类也称为派生类
格式:public class erzi extends fuqin{
}
2.注意
1.一个包里只能有一个public
2.父类建立的成员尽量使用private,建立对应的get和set方法,方法为public,然后儿子继承即可
3.使用场景
当类与类之间,存在共性的内容,并且产生了is a的关系,就可以考虑使用继承,来优化代码
4.访问特点
成员变量
如果出现了重名的成员变量,使用的时候会优先使用子类的成员变量
也就是就近原则;
如果我一定要用父类的成员变量,使用super.变量名,就可以了
成员方法
尽管也会调用子类的成员方法,但实际上跟上面的变量是不一样的,这边相当于重写的父类该种方法也就是override回忆overload是重载,某些地方不同
@Override
使用
1.在进行重写的时候,加上@Override,不报错,就是重写成功了
2.当子类需要父类的方法时,觉得父类的逻辑不好,需要修改和加强的时候,就可以进行重写了
注意事项
1.父类的私有的方法不可以进行重写
2.子类重写父类的时候,权限需要大于等于父类
5.权限修饰符
在不同包进行继承的时候需要进行导包操作,也就是import 需要的目标包、
protected
不同包的子类
也就是说不同包的extends的对象的那个才可以进行调用实际开发的时候不怎么用
6.继承的特点
只支持单继承,不支持多继承,但支持多继承
一个儿子只能拥有一个父亲
为什么不支持呢,为了防止逻辑冲突
7.访问的特点
构造方法
1.构造方法是不可以被继承的;
2.子类在初始化之前,需要先完成父类的初始化
3.在所有构造方法的第一行,实际上都默认了存在super(),去调用父类的调用父类的构造方法,除了Object类
细节
java当中的所有的类,都会之间或者简介继承到了Object类
8.继承内存图解
1,首先在栈空间里调用main方法,然后建立了new,因此在堆内存里建立地址
2.调用了构造,因此构造方法进栈
3.地址指向创建的对象,对象的父亲建立特殊的super,调用super
4.super指向父亲的构造,调用父类的构造赋值
5.父类构造方法使用完,弹栈
6.子类构造方法构造完,弹栈
7.将地址传回,就实现了需要构造的对象
9.this和super详解
this
简介
代表本类对象的引用
super
简介
代表父类储存空间的标识
技巧
在使用super的时候,如果子类中不存在当前的调用的对象和方法,那么super.可以进行省略或者不写,甚至可以写this
原因
子类会继承父类的所有的属性
所以说省略的并不是super,而是this
开闭原则
对功能拓展做开放,对修改代码做封闭
例如,我某一个程序进行了升级,或者说是多了一个变量,重新写一份代码即可
减少了冗余的代码
警告
并不是说不能使用this,只是同时使用this和super的构造方法是不正确的
10.final
简介
可以修饰方法,类,变量
不能被重写,不能被继承,不能被赋值
应用
对于一些不想被继承或者被重写的,在前面加上final既可
当一个类全部都是final的时候,父类前面加上final,不让他被继承即可
例如
final class fa{
不能被继承,但是它可以有父类
}
修饰数据
基本数据类型:数据值不允许被改变
引用数据类型:地址值不可以改变但是可以改变内容
修饰成员变量
1.final修饰的成员变量需要有值,不允许是默认值;
2.final修饰的成员变量的初始化时机:在定义的时候赋值或者是构造的时候赋值
3.江湖规则:命名:如果是一个单词,那么所有内容大写;
多个单词,仍然是大写,但是多个单词之间用下划线连接
包
1.简介
1.本质上就是文件夹,用来管理类文件的
2.建包的语法格式,一般是公司域名的倒写+技术名称。,建议全部小写
2.导包
1.相同包下的类可以直接进行访问,不同的包下的类必须进行导包,才可以进行使用,导包格式: import 包名.类名
2.如果一个类需要用到不同类,但是类的名称相同,这个时候需要带包导入
解决方式:
使用全类名进行创建对象:包名+类名;
例如
抽象类
1.简介
1.特殊的父类
2.内部允许编写抽象的方法
2.抽象方法
1.当我们将共性的的方法,抽取到父类之后,发现这个方法的父类中无法给出具体明确,而且这个方法,还是子类中必须要有的方法,就可以设计为抽象方法
2.如果一个对象他有抽象方法,那么他就是抽象类,需要加abstract
3.抽象方法需要生活在抽象类之中
4.记得加上@Override哦
5.抽象类的儿子必须重写抽象类中的抽象的方法
3.抽象类的注意事项
A.不能进行实例化
也就是不能进行new
为什么呢?
因为抽象类中的抽象方法没有方法体,调用无意义
B。存在构造方法
交给子类通过super进行使用
C存在普通方法
交给子类进行使用
D.抽象类的子类
1.要不然全部进行重写
2.要不然子类自己成为一个抽象类
注意:此时需要重写父亲的子类
4.冲突
final:子类不能重写
private:私有的子类不能进行重写
static:可以通过类名调用
接口
1.简介
1.本质上就是规则的声明
2。如果发现一个类,所有的组成,都是抽象方法
-没有成员变量
-没有普通方法
那么我们通常会设计为java中的接口,因为现在这个类的价值,就只有一个一个作用,就是声明规则
2。规则
本质上就是抽象类,不允许创建对象
需要有儿子去继承implements;
实现了接口的类我们称之为实现类
并且允许implements多个接口
为什么?
继承多个规则呗
3.实现类
跟抽象类一样,
为抽象类或者是全部将父亲的抽象方法进行重写,
很少将继承interface继承的儿子定义为抽象类
4.成员特点
A.成员变量
1.只能定义常量
2.会在变量面前public static final
3.简单理解就是接口是规则的指定,儿子没有权限进行修改
4.所以尽量大写啊
B.成员方法
全部是抽象方法
系统默认加上public 和 abstract
C.构造方法
1.没有构造方法
2.所以继承的子类里面那个默认存在的super是继承的object类
5.接口与类的关系
1.类与类之间:继承关系,只支持单继承,不支持多继承,但可以进行多层继承
2.类与接口之间:实现关系,可以进行单实现,也可以多实现,甚至是在继承一个类的同时,实现多个接口
3.接口与接口之间:可以单继承,也可以多继承
6.抽象类与接口的区别
成员变量,方法,继承
使用场景:
抽象类是对事物进行描述
但是接口本质上是制定规则
先制定规则,那么之后在进行实现的时候就不会出现漏了的问题
让代码进行规范
抽象类是对事务做抽象(描述事务)
接口是对行为做抽象(指定规则)
多态
alt 加回车
将接口的所有的内容放入
1.引入
实际上就是创建一个接口指向空的指针,然后需要什么就指向需要的对象,懂?
就是实现了对象
2.前提实现
1.有继承/实现关系
2.有方法的重写
3.有父类引用指向子类对象
对象多态
3.有父类引用指向子类对象
Animals a=new dog();
好处
可以将方法的形参改为父类类型,这个方法就可以接收到父类的任意子类的对象了
行为多态
好处
同一个方法,具有多种不同的表现的形式,或者形态的能力
3.成员变量的访问特点和好处
成员变量
1.使用的是父亲的该成员变量
2.编译看左边,运行看左边
如果父类没有会直接报错
成员方法
1,使用儿子的成员方法
2,编译看左边,运行看右边
原因:担心你调用的方法,在父类中使一个抽象的方法
静态的
静态的成员,推荐类名进行调用
细节:但是一种假象
-生成字节码文件之后,会自动将对象名进行调用,改用类名进行调用
所以类是谁,调用的就是该类的成员的static
4.好处和弊端
1.提高了程序的扩展性
弊端:不能调用子类的特有成员
为什么?
因为他需要先检测父类有没有,没有怎么调用呢
5.弊端处理
多态中的转型
向上转型
向下转型
需要强制转型
debug
ClassCastException:类型转化异常
在引用数据类型的强转的过程中,需要的数据类型与默认的不匹配
例如这个时候我的父类的a指向子类的b,但是我这个时候要强制转化为c,就会出现这个问题
instanceof
判断左边的引用,是否等于右边的数据类型,返回值为boolean,例如
左边父类,右边子类