三大特性
封装
demo03
高内聚,低耦合
(该藏的藏,该露的露)(数据的隐藏)
高内聚:类的内部数据操作细节自己完成,不允许外部干涉
低耦合:仅暴露少量的方法给外部使用
通过操作接口来访问
属性私有,get/set
先找个对象(get)再给这个对象赋值(set),需要这个对象的时候再调用(get)出来
eg.先要有个实实在在的孩子才能给他取名字
作用
- 提高程序的安全性,保护数据。
- 隐藏代码的实现细节
- 统一接口
- 系统可维护增加了
extends继承
即“扩展”,子类是父类的扩展
- JAVA中只有单继承,没有多继承
- 继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖、组合、聚合等
- java中所有的类都默认直接或间接地继承object
-
调用
-
私有的东西无法被继承
-
隐藏代码,默认调用父类的无参构造
-
super里要赋值,不然默认调用无参构造
super:
-
super调用父类的构造方法,必须在构造方法的第一个
-
super必须只能出现在子类的方法或构造方法中
-
super和this不能同时调用构造方法
super VS this:
- 代表的对象不同
this:本身调用这个对象
super:代表父类对象的应用
- 前提
this:没有继承也可以使用
super:只能在继承条件下才可以使用
- 构造方法
this:本类的构造
super:父类的构造
方法重写override
- 重写都是方法的重写,和属性无关
- 静态的方法和非静态的方法区别很大
静态方法:方法的调用只和左边定义的数据类型有关
重写需要有继承关系,子类重写父类的方法(eg.父亲可以向你求助)
- 方法名必须相同!只能重写父类的方法,不能重写属性
- 子类的方法和父类必须一致,方法体不同
- 参数列表必须相同
- 修饰符范围可以扩大但不能缩小(public>protected>default>private)
- 抛出的异常:范围可以被缩小但不能扩大(ClassNotFoundException—>Exception)
- 父类的功能,子类不一定需要或者不一定满足
多态
一个对象的实际类型是确定的,可以指向的引用类型就不确定了,父类的引用指向子类
-
对象能执行哪些方法主要看对象左边的类型,和右边的关系不大
-
子类和父类有相同的方法时,只要子类没有重写父类则调用父类,要是子类重写了父类的方法,则执行子类的方法
注意点:
- 多态是方法的多态,属性没有多态
- 若是调用子类里有而父类里没有的方法,则会强制转换
- 有些方法不能重写:
static方法:属于类,不属于实例
final 常量
private方法
instanceof
通过上例得出:X instanceof Y 则X与Y之间一定要存在上下级的关系
父类转子类(向下转型):
强制转换
子类转父类(向上转换):
直接调用,可能丢失自己本来的方法
static
-
静态方法可以直接调用静态方法里的所有东西,但不能直接调用非静态方法(new)
非静态方法也可以直接调用静态方法里的东西
-
静态可以通过类名访问,非静态不行
static是和类一起加载的,且只能执行一次
可用匿名代码块赋初始值
由运行结果可得:先运行出静态代码块(static和类一起加载出来),然后是匿名代码块(匿名代码块和对象一起加载出来),最后是构造方法;
静态导入包
final
final是常量修饰符,只要被final修饰就没有子类
(final断子绝孙)
抽象
- 不能new这个抽象类,只能靠子类去实现它(约束!)
- 抽象类中可以写普通的方法
- 抽象方法必须在抽象类中
- 用extends关键字重写方法且只能单继承!
即抽象的抽象 约束!
接口
- 只有规范!自己无法写方法(约束和实现分离)
- 接口的本质是契约
- 接口不能被是实例化,接口中没有构造方法
- 必须要重写接口中的方法
方法
类 通过关键字implements实现接口
常量
public interface TimeService {
//接口里的属性都是常量 public static final
public static final int a = 12;
int b = 77;
}
内部类
成员内部类
package oop.demo10;
public class Outer {
private int ID = 22;
public void out(){
System.out.println("这是外部类");
}
class Inner{
public void In(){
System.out.println("这是内部类");
}
//获得外部类的私有属性
public void getID(){
System.out.println(ID);
}
}
}
一个java类中可以有多个class类,但只能有一个public class
public class demo01 {
}
class Test{
}
局部内部类
public class demo01 {
public void Outer(){
class Inner{
public void in1(){
System.out.println("这是局部内部类");
}
}
}
}