java基础02类与对象
1.面向对象OOP
封装 继承 多态
类 --- 实例
类与对象:
1.一个类可以有多个对象
2.每个对象都对应一个类
2.基本操作
2.1 创建使用
//创建
[访问权限修饰符] class 类名{
//属性(特征)---> 抽 像
[访问权限修饰符] [普通修饰符] 数据类型 变量名称 = 123;
//成员变量尽可能不要初始化操作 尤其是引用数据类型
//方法(功能)
//其它[静态代码块,构造方法]
类名(){}
}
//实例化
类名 对象名 = new 类名();
外部类只能有两种访问控制级别: public 和默认
2.2 访问权限
| 同一个类 | 同一个包 | 不同包的子类 | 不同包的非子类 | |
|---|---|---|---|---|
| Private | √ | |||
| Default | √ | √ | ||
| Protected | √ | √ | √ | |
| Public | √ | √ | √ | √ |
protected:子类与父类不在同一包中,在子类中,子类实例可以访问其从父类继承而来的protected方法,而不能访问父类实例的protected方法。
2.3 构造方法
2.3.1 定义
/**
* 构造方法 无返回值 public
*/
类名(){}
系统自带无参构造方法,若自定义了构造方法,则系统的就没了 自定义无参构造方法
初始化块:构造对象时先执行 { },再运行构造器
2.3.2 调用构造器
1.如果此构造器第一行调用了另一个构造器,则先执行另一个
2.否则:所有字段初始为默认值;按声明顺序,执行初始化方法和初始块
(静态总共只执行一次)
3.执行构造器主体
2.4 方法重载
overload
同一类中,同名方法,形式参数不同,与返回值和修饰无关(以参数为区分)
例如多种构造方法
2.5 this
this指示隐式参数,当前对象,访问类的成员变量和成员方法
类的构造方法里面可以使用this()访问当前类的构造方法
2.6 static
静态修饰:属性、方法、代码块、内部类
属于类而非对象
静态方法:不需要具体对象,不能访问对象,能访问静态字段;
通过类名调用,也可通过对象名
2.7 final
final用于声明属性、方法和类
-
final属性不可变,指的是引用不可变,而不关心指向对象内容的变化,被final修饰的变量必须初始化
-
final方法不可被子类重写,可以实现inline(内联)的机制;但可以被重载
-
final类不可以被继承(如String、StringBuffer),所有的方法不可以被重写,但其内的非final变量可以被修改
2.8 成员变量和局部变量
1.成员变量是独立于方法外的变量,局部变量是类的方法中的变量
1)成员变量:实例变量、类变量、static类变量、非static实例变量
所有类的成员变量可以通过this来引用。
2)局部变量:形参、方法局部变量、代码块局部变量
存在于方法的参数列表和方法定义中以及代码块中。
2.成员变量可以被public,protect,private,static等修饰符修饰,而局部变量不能被控制修饰符及 static修饰;两者都可以定义成final型。
3.成员变量存储在堆,局部变量存储在栈。局部变量的作用域仅限于定义它的方法,在该方法的外部无法访问它。成员变量的作用域在整个类内部都是可见的,所有成员方法都可以使用它。如果访问权限允许,还可以在类的外部使用成员变量。
4.局部变量的生存周期与方法的执行期相同。当方法执行到定义局部变量的语句时,局部变量被创建;执行到它所在的作用域的最后一条语句时,局部变量被销毁。类的成员变量,如果是实例成员变量,它和对象的生存期相同。而静态成员变量的生存期是整个程序运行期。
5.成员变量在累加载或实例被创建时,系统自动分配内存空间,并在分配空间后自动为成员变量指定初始化值,初始化值为默认值,基本类型的默认值为0,复合类型的默认值为null。(被final修饰且没有static的必须显式赋值),局部变量在定义后必须经过显式初始化后才能使用,系统不会为局部变量执行初始化。
6.局部变量可以和成员变量同名,且在使用时,局部变量具有更高的优先级,直接使用同名访问,访问的是局部变量,如需要访问成员变量可以用this.变量名访问
3.继承
一个类派生出另一个类
单继承:一个类只有一个父类
(超类 子类)
3.1 extends
public class 子类 extends 父类{}
子类拥有父类里面(非private,父类构造)成员(public 默认 protected)。 子类可以拥有独有的成员,对于子类独有的成员,父类是无法访问的。
3.2 方法重写 override
覆盖父类方法
长得一样,但可以改写
方法的重写(override)两同两小一大原则:
方法名相同,参数类型相同
子类返回类型 <= 父类方法返回类型
子类抛出异常 <= 父类方法抛出异常
子类访问权限 >= 父类方法访问权限
3.3 super
调用父类的方法
super();调用父类构造
3.4 初始化
java对象初始化顺序
-
父类静态代码块,父类静态成员变量(同级,按代码顺序执行)
-
子类静态代码块,子类静态成员变量(同级,按代码顺序执行)
-
父类普通代码块,父类普通成员变量(同级,按代码顺序执行)
-
父类构造方法
-
子类普通代码块,子类普通成员变量(同级,按代码顺序执行)
-
子类构造方法
注意点:
-
静态内容只在类加载时执行一次,之后不再执行。
-
默认调用父类的无参构造方法,可以在子类构造方法中利用super指定调用父类的哪个构造方法。
4.多态
父类引用变量可以指向子类对象:Father 变量名=new Son();(向下)
Son 变量名=(Son) fathers;(向上)
-
多态成员变量:编译运行看左边(只能取到父中的值)
-
多态成员方法:编译看左边,运行看右边(调用的是重写后的方法)
instanceof:用来判断某个对象是否属于某种数据类型(自己也属于自己)
5.1定义
抽象方法:基类无法(或者没有必要)提供被覆盖方法的具体实现
抽象类:
1.有抽象方法的类一定是抽象类,而抽象类不一定有抽象方法
2.抽象类不可以直接实例化,只可以用来继承;也可以调用静态方法
3.抽象类的派生子类应该提供对其所有抽象方法的具体实现
4.如果抽象类的派生子类没有实现其中的所有抽象方法,那么该派生子类仍然是抽象类,只能用于继承,而不能实例化,但可以有构造函数(用于帮助子类快速初始化共有属性)
5.2 abstract
注意:不能修饰属性、构造器;不能修饰私有方法、静态方法、final方法
6.接口
面向接口编程:设计者
特点:
1.所有方法是抽象方法
2.没有方法体
3.方法全是公共public abstract (默认)
4.常量为public static final (默认)
5.接口可以继承多个接口,extends关键字后面可以是一个列表
6.JDK1.8后,接口中可以有静态方法,静态方法必须有方法体
6.1 interface
public interface 接口名{
//公开静态常量 全局常量:public static final
//公开抽象方法 抽象方法:public abstract
}
不能定义构造器,不能实例化
6.2 比较

6.2 implements
类实现接口 class xxx implements xx{ }
将抽象方法全实现后,实现类才能够实例化
7.内部类
类内部声明的类
7.1 成员内部类
静态/非静态
作为外部类成员:能调用外部类,可以static修饰,和权限修饰 (4 个作用域)
作为内部类,可以定义,final,abstract
7.2 局部内部类
(方法内、代码块、构造器内)局部内部类前不能用修饰符(相当于局部变量)
有名实现、匿名实现
8.枚举
enum
定义常量
switch 枚举常量
添加方法
实现接口
接口中组织枚举
9.异常
9.1异常、错误
异常指的是程序运行时发生的不正常事件;异常能够被程序处理,保证程序继续运行下去;
错误程序没法处理,例如内存泄漏。发生错误后,一般虚拟机会选择终止程序运行,程序员需要修改代码才能解决相关错误;
9.2 异常类

9.3 异常处理
9.3.1 try catch finally
形式:
try { 检测语句 }
catch (异常类型 变量名) { 处理语句 }
catch ( ) { }
finally { 最终都要执行
}
注意:
必须有try,catch可以有1个或多个,finally最多1个
catch语句的异常类型必须从子类到父类的顺序
finally块前有return语句,finally依然被执行
执行到try{}中的return时,将要返回的结果存储到一个临时栈中,
然后程序去执行finally{}中的程序,再返回临时栈结果
finally块前有System.exit(0)语句,finally不被执行
9.3.2 throw与throws
抛出异常其实就是创建了一个异常对象
然后用throw关键字交给异常处理机制去处理
throws用在方法声明处,声明该方法可能发生的异常类型
调用该方法时,编译期会提醒必须处理这些异常
9.3.3 自定义异常
自定义异常类
继承Exception类:非运行时异常(受检异常):Exception中除RuntimeException极其子类之外的异常。编译器会检查此类异常,必须对该异常进行处理,使用try-catch/throws否则编译不通过。


浙公网安备 33010602011771号