java基础02类与对象

java 类与对象

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对象初始化顺序

  1. 父类静态代码块,父类静态成员变量(同级,按代码顺序执行)

  2. 子类静态代码块,子类静态成员变量(同级,按代码顺序执行)

  3. 父类普通代码块,父类普通成员变量(同级,按代码顺序执行)

  4. 父类构造方法

  5. 子类普通代码块,子类普通成员变量(同级,按代码顺序执行)

  6. 子类构造方法

注意点:

  1. 静态内容只在类加载时执行一次,之后不再执行。

  2. 默认调用父类的无参构造方法,可以在子类构造方法中利用super指定调用父类的哪个构造方法。

4.多态

父类引用变量可以指向子类对象:Father 变量名=new Son();(向下)

Son 变量名=(Son) fathers;(向上)

  1. 多态成员变量:编译运行看左边(只能取到父中的值

  2. 多态成员方法:编译看左边,运行看右边(调用的是重写后的方法

instanceof:用来判断某个对象是否属于某种数据类型(自己也属于自己)

 

5.抽象类

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否则编译不通过。

继承RuntimeException类:运行时异常(不受检异常):RuntimeException类极其子类表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求处理异常,此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。

 

posted @ 2021-04-04 14:38  FremontUltimate  阅读(73)  评论(0)    收藏  举报