⾯向对象的三⼤特征
⼀、封装
将类的某些信息隐藏在类内部,不允许外部程序直接访问(隐藏对象的信息)通过该类提供的⽅法来实现对隐藏信息的操作和访问(流出访问的接⼝)
特点:1.只能通过规定的⽅法访问数据
2.隐藏类的实例细节,⽅便修改和实现
static关键字
1、类属性(静态属性)
1.类对象共享
2.类加载时产⽣,销毁时释放。
对象名.静态变量名
类.静态变量名
使⽤实例化后的对象操作时,会有黄⾊叹号警报,应直接⽤ 类.静态变量名 调⽤。
普通代码块
在⽅法体中直接写 {} 顺序执⾏,先出现,先执⾏。
构造代码块
在类中直接写 {} 构造代码块是在类被创建时调⽤,先于构造⽅法
静态代码块
在类中直接写 static{} 类加载时调⽤,优先于构造代码块执⾏
以上三个,当⼀个类多次实例化,静态代码块只执⾏⼀次,其他两种会执⾏多次。
顺序:静态代码块→构造代码块→普通代码块
2、类⽅法(静态⽅法)
1.静态⽅法中不能直接访问同⼀个类中的⾮静态成员(⽅法和属性),只能直接调⽤静态成员
2.静态⽅法中不能使⽤this,可以通过实例化调⽤其他⽅法
⼆、继承
⼀种类与类之间的关系
使⽤已存在的类的定义作为基础建⽴新类
新类的定义(⼦类或⾔派⽣类)可以增加新的数据或新的功能,也可以⽤⽗类的功能,但不能选
择性地继承⽗类(基类)
即⼦类可以访问⽗类的⾮私有成员
⽗类⽆法访问⼦类任何成员对象
继承的关系
满⾜"A is a B"的关系就可以形成继承关系
⼀个⼦类只能继承⼀个⽗类
java面向对象的特征有哪些方面
继承优先于多态(⽗类引⽤优先于接⼝引⽤)
特点:1.利⽤代码复⽤
2.缩短开发周期
访问修饰符
protected:允许在当前类、同包⼦类/⾮⼦类、跨包⼦类调⽤;跨包⾮⼦类不允许调⽤
默认:允许在当前类、同包⼦类/⾮⼦类调⽤;跨包⼦类/⾮⼦类不允许调⽤
⼤⼩顺序:private→默认→protected→public
⽅法重载
1、同⼀个类中
2、⽅法名相同,参数列表不同(参数顺序、个数、类型)
3、⽅法返回值、访问修饰符任意
4、与⽅法的参数名⽆关
⽅法重写
1、有继承关系的⼦类中
2、⽅法名相同,参数列表相同(参数顺序、个数、类型)
3、访问修饰符,访问范围需要⼤于等于⽗类的访问范围
4、与⽅法的参数名⽆关
5、⽗类中的static⽅法不能被⼦类重写(如果⼦类和⽗类中有同名的static修饰的⽅法名时,则
不为重写)
⼦类与⽗类的加载顺序
⽗类静态⽅法→⼦类静态⽅法→⽗类对象构造→⼦类对象构造
⽗类构造⽅法
⽗类的构造不允许被继承、不允许被重写,但是会影响⼦类对象的实例化
⼦类构造⽅法
⼦类构造默认调⽤⽗类⽆参构造⽅法
可以通过super()调⽤⽗类允许被访问的其他构造⽅法
super()必须放在⼦类构造⽅法有效代码第⼀⾏
super
1.⼦类的构造的过程中必须调⽤其⽗类的构造⽅法
2.如果⼦类的构造⽅法中没有显式标注,则系统默认调⽤⽗类的⽆参的构造⽅法
3.如果⼦类构造⽅法中既没有显式标注,且⽗类中没有⽆参的构造⽅法,则编译出错
4.使⽤super调⽤⽗类指定构造⽅法,必须在⼦类的构造⽅法的第⼀⾏
代表⽗类引⽤:
1.访问⽗类成员⽅法super.⽅法名()
2.访问⽗类属性super.属性名
3.访问⽗类构造⽅法super();
this和super都不能在静态⽅法中使⽤
Object类
Object类是所有类的⽗类
⼀个类没有使⽤extends关键字明确标识继承关系,则默认继承Object类(包括数组)
Java中的每个类都可以使⽤Object中定义的⽅法
equals⽐较的是两个引⽤是否指向同⼀对象,==⽐较的是内部的值,当⽐较的为复合数据类型(类)⽐较的则是内存地址 equals可以通过重写,改变⽐较的值
toString
1.输出对象名时,默认会直接调⽤勒种的toString
2.继承Object中的toString⽅法时,输出对象的字符串表⽰形式:类型信息+@+地址信息
3.⼦类可以通过重写toString⽅法的形式,改变输出的内容以及表现形式
final关键字
final 类,该类不可被继承
final ⽅法,该⽅法不可被重写,但可以被⼦类继承使⽤
final ⽅法内局部变量:只要在具体被使⽤之前进⾏赋值即可,⼀旦赋值不允许被修改
变量成员属性
赋值过程:
1、定义直接初始化
2、构造⽅法
3、构造代码块
final可配合static使⽤,类似于常量
使⽤final修饰可以提⾼性能,但会降低可扩展性
多态:
概念:允许不同类的对象对同⼀消息做出不同反应
两种多态:1.编译时多态:设计时多态⽅法重载
2.运⾏时多态:程序运⾏时动态决定调⽤哪个⽅法(多数)
必要条件:1.满⾜继承关系
2.⽗类引⽤指向⼦类对象
向上转型(隐式转型、⾃动转型)
⽗类引⽤指向⼦类对象可以调⽤⼦类重写的⽅法以及 ⽗类派⽣的⽅法,⽆法调⽤⼦类独有⽅法
注意:⽗类中的静态⽅法⽆法被⼦类重写,所以向上转型之后,只能调⽤到⽗类原有的静态⽅
法
⼩类转型为⼤类例如:⽗类 对象名=new ⼦类名();
instanceof运算符
⽤于判断该类是否是由该类实例化产⽣的
极⽗类、⽗类、该类返回值都为true
⽤法:对象名 instanceof 类名
返回值:true/false
抽象类:
abstract 类名(){}
当此类为抽象类时,不可被实例化,只能被继承,可以通过向上转型完成对象实例
⼦类必须需要重写抽象⽗类中的⽅法,否则报错
抽象类⾥可以没有抽象⽅法
应⽤场景:某个⽗类只是知道其⼦类应该包含怎样的⽅法,但⽆法准确知道这些⼦类如何实现这些⽅法
优点:1.限制了⼦类的设计随意性
2.阻⽌了⽆意义⽗类的实例化
抽象⽅法:
abstract ⽅法名();
不允许包含⽅法体(不允许具体实现)⼦类必须重写⽗类的抽象⽅法,否则,⼦类也是抽象类
包含抽象⽅法的类⼀定是抽象类
static final private关键字都不可以与abstract并存的
为什么要⽤抽象类、抽象⽅法
1、⼦类的具体⽅法不需要在⽗类中实现,只需要在⽗类中建⽴⼀个抽象类,⽤来提醒程序员
2、需要⽤抽象⽅法提醒程序员,必须实现这个⽅法(⼦类中重写)(随着每⼀个⼦类不同⽽实现⾃⼰的特征)
接⼝
作⽤:1、接⼝定义了某⼀批类所需要遵守的规范
2、接⼝不关⼼这些类的内部数据,也不关⼼这些类⾥⽅法的实现细节,它只规定这些类⾥必须提供某些⽅法 格式:interface 类名()
{public void ⽅法名();}
接⼝名 对象名=new 类名();
规则:1、类名以I 打头例如 I类名()
2、接⼝的访问修饰符为public
3、接⼝中抽象⽅法可以不写abstract关键字
4、访问修饰符默认public
5、当⼀个类实现接⼝时,此类必须重写接⼝中的所有⽅法体,否则需要将该类设置为
抽象类
6、⽽且以接⼝名 对象名=new 类名();这种样式的对象名不可以引⽤类中的⽅法体
7、接⼝中可以包含常量,默认为public static final,⽤接⼝名.常量名调⽤或者⽤实现接
⼝的类调⽤ 对象名.常量名
8、对象名⽆法引⽤类中特有的⽅法体,
9、我们可以利⽤接⼝来描述不同的类型拥有相同的⾏为特征
default
默认⽅法,可以带⽅法体jdk1.8
可以在实现类中重写,并可以通过接⼝的引⽤调⽤
当实现类中实现多个接⼝,且接⼝中都有默认⽅法,必须在实现类中重写接⼝中的默认⽅法
static
静态⽅法,可以带⽅法体jdk1.8
不可以在实现类中重写,可以⽤接⼝名调⽤
接⼝名.super.静态⽅法名()
多接⼝中重名常量
当⼀个常量在⼀个类的⽗类和其多个接⼝中都有时,系统⽆法⾃⾏判断⼦类调⽤的是哪⼀个,只有在⼦类中重写该常量才不报错
接⼝的继承
接⼝也可以实现继承关系,并且⼀个接⼝可以继承多个⽗接⼝
当⽗接⼝中有多个重名的⽅法时,⼦接⼝需要重写⽅法体避免出错
内部类
概念:1.在Java中,可以将⼀个类定义在另⼀个类⾥⾯或者⼀个⽅法⾥⾯,这样的类成为内部
类
2.与之对应,包含内部类的类被称为外部类
为什么要使⽤内部类
通过外部类访问外部类,提供了更好的封装⼿段
内部类隐藏在外部类之内,更好的实现了信息隐藏
不允许其他的类随意访问
内部类与外嵌类的关系:
1.内部类的外嵌类的成员变量在内部类中仍有效果,内部类中的⽅法也可以调⽤外嵌类中的
⽅法
2.内部类的类体中不可以声明类变量和类⽅法。外嵌类的累体重可以⽤内部类声明对象,作
为外嵌类的成员
3.内部类仅供它的外嵌类使⽤,其他类不可以⽤某个类的内部类声明对象
内部类的分类
成员内部类、静态内部类、⽅法内部类、匿名内部类
成员内部类
内部类中最常见的就是成员内部类,也成为普通内部类 class 内部类名{}
特点:1.内部类在外部使⽤时,⽆法直接实例化,需要借助外部类信息才能完成实例化
⽅式⼀:外部类.内部类 对象名=new 外部类().new 内部类()
⽅式⼆:外部类对象.new 内部类
⽅式三:外部类对象.获取⽅法()
2.内部类的访问修饰符,可以任意,但是访问范围会受到影响
3.内部类可以直接访问外部类的成员;如果出现同名属性,优先访问内部类中定义的
4.可以使⽤ 外部类.this.成员 的⽅式,访问外部类中同名的信息
5.外部类访问内部类信息,需要通过内部类实例,⽆法直接访问
6.内部类编译后.class⽂件命名:外部类$内部类.class
静态内部类
static class 内部类名{}
1.静态内部类对象可以不依赖于外部类对象,直接创建
2.静态内部类中,只能直接访问外部类的静态成员,如果需要调⽤外部类的⾮静态成员,
可以通过对象实例
3.获取静态内部类对象实例:外部类.内部类 对象名=new 外部类().new 内部类()
4.可以通过 外部类.内部类.静态成员 的⽅式,访问内部类中的静态成员
5.当内部类属性与外部类属性同名时,默认直接调⽤内部类中的成员;如果需要访问外部
类中的静态属性,则可以通过 外部类.属性 的⽅式;
6.如果需要访问外部类中的⾮静态属性,则可以通过 new 外部类().属性 的⽅式;
⽅法内部类
1.定义在⽅法内部,作⽤范围也在⽅法内
2.和⽅法内部成员使⽤规则⼀样,class前⾯不可以添加public、private、protected、static
3.类中不能包含静态成员
4.类中可以包含final、abstract修饰的成员
使⽤时⼀般将⽅法设置为Object⽅法,并return new 内部类名().⽅法名();
例如:
⽅法内部类
匿名内部类
类的定义和创建⼀起完成
适⽤场景:1、只⽤到类的⼀个实例
2、类在定义后马上⽤到
3、给类命名并不会导致代码更容易被理解
特点:1.匿名内部类没有类型名称、实例对象名称
2.编译后的⽂件命名:外部类$数字.class
3.⽆法使⽤private、public、protected,abstract、static修饰
4.⽆法编写构造⽅法,可以添加构造代码块
5.不能出现静态成员
6.匿名内部类可以实现接⼝也可以继承⽗类,但不可兼得
图解:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论