面向对象的三个特征:封装,继承,多态
构造方法(Constructor):创造对象,初始化对象信息
- 没有显示的构造器,系统默认创建一个空参构造器
- 显示定义构造器,系统就不会从创造默认空参构造器
一个类至少有一个构造器(包括系统默认)
<br /> 输出对象直接调用toString()方法
属性的赋值属性顺序
默认初始化<显示初始化<构造器<对象.方法,对象.属性
封装:
- 高内聚:类内部数据操作细节自己完成,不允许外部干涉
- 低耦合:仅对外暴露少量的方法用于使用
- 不对外成员变量,不对外暴露方法,单例模式
- 成员变量设置为private,通过方法来设置和获取值不让对象.属性调用修改和使用
修饰符的使用范围
修饰符 | 类内部 | 同包 | 不同包子类 | 不同包 |
---|---|---|---|---|
private | yes | |||
缺省 | yes | yes | ||
protected | yes | yes | yes | |
public | yes | yes | yes | yes |
class只可以使用public,和缺省<br /> this.调用对象属性,方法,构造方法<br /> this(形参) 调用其他的构造方法(必须声明在构造器首行)
package 声明在源文件的首行
同一包下不能命名同名的的接口,类
每 . 表示一层目录
import 包声明和类之间
java.long包下定义的可以不用导包
本包下定义的也不用导
如果要使用不同包的中同一个名的类,至少有一个需要全类名方法显示(xxx.类名);
子包仍需要导入
inport static 可以导入指定类或接口中静态结构:属性或方法 ;
继承
- 子类继承父类 ,子类就获取到了父类中声明的所有属性和方法(父类私有的方法,子类也获取到了,但是不能调用)
- 子类可以有自己特有的功能;
- 一个父类可以有多个子类
- 一个子类只能有一个父类(不允许多重继承)
- 子类直接继承父类以后,成为直接父类.间接继承的父类叫间接父类
- 子类可以获取直接父类和间接父类的属性和方法
- 任何类的父类都是Object ;Object的方法都可以用
step over 一行一行执行
step into 进入当前调用的方法中
step return 执行完当前代码,进入下一行
drop to frame 回到当前行所在方法的第一行
resume 执行当前所在代码,进入下一个断点,没有就结束
重写(override)
- 对父类同名同参数的方法,进行覆盖操作.
- 方法名和形参列表相同,
- 子类重写的权限修饰符不能消减父类 方法的权限修饰符(private不能重写)
- 返回值类型 父类返回值是void 重写只能void ;
- 父类有返回值A类型 , 子类返回值可以是A类和A的子类
- 父类返回值是基本类型,子类重写必须和父类一样一样
- 子类重写的方法抛出的异常不大于父类方法的异常类型
-
super
可以在子类中使用super.属性或则super.方法显式调用父类的方法
- 子父类重名,可以用super指定调用哪个属性值
- super.方法可以调用父类被重写的的方法;
- super(形参列表)可以显式调用父类的构造器,且必须写在首行,与this(形参)二选一
- 子类构造器没有显式this和super构造器,都会隐式调用super();
- 当子类继承父类后,”继承”父类的属性方法,子类有必要知道对象如何进行初始化.无论那个构造器创建对象,需要保证初始化父类
- 父类必须要提供一个空参构造器
多态
- 前提继承,和重写方法
- 父类的引用指向子类对象(父 f = new 子();)
- 子类调用父类同名的方法,执行的子类重写的方法
- 编译只能用父类的方法,执行就执行子类重写父类的方法(编译看左,运行看右)
- 对象的多态志适用方法,不适合属性(属性都是看左边)
- 多态是运行时行为, 调用编译期无法确定的,是运行是确定的,等到解释器才会确定调用的具体方法叫做动态绑定
- 总是可以将子类实例转换父类变量,称为向上转型,子类特有功能不能访问
- 创造了对象想要获取到子类的方法和属性 可以强制类型转换叫做向下转型(父类对象转换子类对象,前提是父类对象创造的是子类实例)
- 强转过程异常ClasscastException中可以使用instanceof关键字判断
a instanceof A 判断a是不是A的实例,A也可以是a的直接和间接父类,不是返回false 是返回true;
<br />**object**
equals() 例题3详情
- toString() 输出对象引用,就是调用toString(); 一些类重写toString() 就会显示”实体信息”;
包装类
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
转换 注意NumberFormatException异常
基本—>包装类
int num = 1 ; Integer i= new Integer(num) ; 其中num可以装String 和自己对应的基本类型
自动装箱 : int num = 1 ; Integer i = num ;
包装类—>基本类型
Integer num =new Integer(x); int in = num.Intvalue() 就可以转换成基本类型,其中x可以对应的基本类型和String
自动拆箱 : Integer num =new Integer(x); int in = num ;
基本,包装类—>String类型
连接运算: int num = 10 ; String str = num + “” ;
调用String方法: int num = 10 ; String str = String.valueOf(num);
toString方法
String类型—>基本,包装类
String str = “123”; int num = Integer.parseInt(str);
static
- 修饰属性,方法,代码块, 内部类
- 静态变量被类中所有的对象共享,静态代码不能访问类中实例对象
- 如果一个对象修改了静态的变量的值,同一个类的所有的对象都会受到影响
- 对象不需要创建对象就可以调用方法和属性 类名.属性,类名.方法
- 静态变量随着类的加载而加载,早于对象的创键.
- 类只会加载一次,静态变量也只有一份,在方法区静态域中.
- 静态属性和方法不能使用this以及super关键字
- 静态方法会被继承可以被子类调用
- mian方法作为程序的入口,也是一个普通的静态方法
- 操作静态属性的方法,通常为static
代码块
- 用来初始化类和对象,只能使用static修饰
- static代码块
- 可以有输出语句
- 随着类的加载而执行,只执行一次
- 不能调用非静态的属性,方法
- 作用:初始化类的信息
- 可以有输出语句
非static代码块
- 可以有输出语句
- 随着对象的创建而执行
- 每创建一次对象,就执行一次
作用:在创建对象时,对对象的属性等进行初始化
由父及子 静态先行
默认初始化<显示初始化/代码块赋值(写的顺序 )<构造器<对象.方法,对象.属性
- 可以有输出语句
final
- 修饰类,方法,变量
- final修饰类不能被继承
- 修饰方法不能再能重写
- 修饰变量就是常量
- 修饰局部变量
- 修饰形参
- static final 修饰方法,属性称全局常量
- 显示初始化,代码块,构造器
抽象类(abstract)
- 修饰类和方法
- 不能实例化,提供子类,让子类实例化
- 抽象方法没有方法体
- 包含抽象方法的类一定是抽象类
- 抽象类可以没有抽象方法
- 重写了父类所有抽象方法,就可以实例化,要是没有也必须定义为抽象类
- 不能和 private 和 static,final 共处
非匿名的类匿名的对象
抽象类 对象 = new 抽象类(){
重写方法 ;
}
内部类
在A类内部在声明一个类B, (A就是内部类,B就是外部类)
局部内部类(方法内,代码块,构造方法)和成员内部类(静态,非静态)
成员内部类
- 调用外部类的结构
- 可以static修饰
- 4钟不同的权限修饰符
- 类内可以定义属性,方法,构造器
- 可以被final修饰
- 可以被abstract修饰
- 创建静态成员内部类的实例:外部类.内部类 对象 = new 外部类.内部类()
- 创建非静态成员内部类:外部类 外部类对象 = new 外部类(); 外部类.内部类 内部类对象 = 外部类对象.new 内部类();
- 内部类调用外部类的非静态属性 外部类类名.this.方法 ; 或者直接调用 ;