面向对象8
main()方法的剖析
public static void main(String args[]){}
1、理解1:看做是一个普通的静态方法 理解2:看做是程序的入口,格式是固定的。
2、与控制台交互
如何从键盘获取数据?
方式1:使用Scanner 方式2:使用main()的形参进行传值。
代码块
回顾:类中可以声明的结构:属性、方法、构造器;代码块(或初始化块)、内部类
-
代码块(或初始化块)的作用: 用来初始化类或对象的信息(即初始化类或对象的成员变量)
-
代码块的修饰: 只能使用static进行修饰。
-
代码块的分类: 静态代码块:使用static修饰 非静态代码块:没有使用static修饰
-
具体使用: 4.1 静态代码块:
随着类的加载而执行 由于类的加载只会执行一次,进而静态代码块的执行,也只会执行一次 作用:用来初始化类的信息 内部可以声明变量、调用属性或方法、编写输出语句等操作。 静态代码块的执行要先于非静态代码块的执行 如果声明有多个静态代码块,则按照声明的先后顺序执行 静态代码块内部只能调用静态的结构(即静态的属性、方法),不能调用非静态的结构(即非静态的属性、方法)
4.2 非静态代码块: > 随着对象的创建而执行 > 每创建当前类的一个实例,就会执行一次非静态代码块 > 作用:用来初始化对象的信息 > 内部可以声明变量、调用属性或方法、编写输出语句等操作。 > 如果声明有多个非静态代码块,则按照声明的先后顺序执行 > 非静态代码块内部可以调用静态的结构(即静态的属性、方法),也可以调用非静态的结构(即非静态的属性、方法)
属性赋值过程
-
可以给类的非静态的属性(即实例变量)赋值的位置有: ① 默认初始化
② 显式初始化 或 ⑤ 代码块中初始化
③ 构造器中初始化
④ 有了对象以后,通过"对象.属性"或"对象.方法"的方法进行赋值
-
执行的先后顺序: ① - ②/⑤ - ③ - ④
-
关于字节码文件中的<init>的简单说明:(通过插件jclasslibbytecode viewer查看)
<init>方法在字节码文件中可以看到。每个<init>方法都对应着一个类的构造器。(类中声明了几个构造器就会有几个<init>) 编写的代码中的构造器在编译以后就会以<init>方法的方式呈现 <init>方法内部的代码包含了实例变量的显示赋值、代码块中的赋值和构造器中的代码。 <init>方法用来初始化当前创建的对象的信息的。
-
给实例变量赋值的位置很多,开发中如何选?
显示赋值:比较适合于每个对象的属性值相同的场景
构造器中赋值:比较适合于每个对象的属性值不相同的场景
final关键字的使用
-
final的理解:最终的
-
final可以用来修饰的结构:类、方法、变量
-
具体说明:
3.1 final修饰类:表示此类不能被继承。 比如:String、StringBuffer、StringBuilder类
3.2 final修饰方法:表示此方法不能被重写 比如:Object类中的getClass()
3.3 final修饰变量:既可以修饰成员变量,也可以修饰局部变量。 此时的"变量"其实就变成了"常量",意味着一旦赋值,就不可更改。
3.3.1 final修饰成员变量: 有哪些位置可以给成员变量赋值? > 显式赋值 > 代码块中赋值 > 构造器中赋值
3.3.2 final修饰局部变量:一旦赋值就不能修改 > 方法内声明的局部变量:在调用局部变量前,一定需要赋值。而且一旦赋值,就不可更改 > 方法的形参:在调用此方法时,给形参进行赋值。而且一旦赋值,就不可更改
-
final与static搭配:修饰成员变量时,此成员变量称为:全局常量。 比如:Math的PI
抽象类与抽象方法
-
abstract的概念:抽象的
-
abstract可以用来修饰:类、方法
-
具体的使用:
4.1 abstract修饰类: > 此类称为抽象类 > 抽象类不能实例化。 > 抽象类中是包含构造器的,因为子类对象实例化时,需要直接或间接的调用到父类的构造器。 > 抽象类中可以没有抽象方法。反之,抽象方法所在的类,一定是抽象类。
4.2 abstract修饰方法: > 此方法即为抽象方法 > 抽象方法只有方法的声明,没有方法体。 > 抽象方法其功能是确定的(通过方法的声明即可确定),只是不知道如何具体实现(体现为没有方法体) > 子类必须重写父类中的所有的抽象方法之后,方可实例化。否则,此子类仍然是一个抽象类。
-
abstract不能使用的场景: 5.1 abstract 不能修饰哪些结构? 属性、构造器、代码块等。
5.2 abstract 不能与哪些关键字共用?(自洽)
不能用abstract修饰私有方法、静态方法、final的方法、final的类。
私有方法不能重写 避免静态方法使用类进行调用 final的方法不能被重写 final修饰的类不能有子类
接口的使用
-
接口的理解:接口的本质是契约、标准、规范,就像我们的法律一样。制定好后大家都要遵守。
-
定义接口的关键字:interface
-
接口内部结构的说明:
可以声明: 属性:必须使用public static final修饰 方法:jdk8之前:声明抽象方法,修饰为public abstract jdk8:声明静态方法、默认方法 jdk9:声明私有方法
不可以声明:构造器、代码块等
-
接口与类的关系 :实现关系
-
格式:class A extends SuperA implements B,C{}
A相较于SuperA来讲,叫做子类 A相较于B,C来讲,叫做实现类。
-
满足此关系之后,说明:
类可以实现多个接口。 类针对于接口的多实现,一定程度上就弥补了类的单继承的局限性。 类必须将实现的接口中的所有的抽象方法都重写(或实现),方可实例化。否则,此实现类必须声明为抽象类。
-
接口与接口的关系:继承关系,且可以多继承
-
接口的多态性: 接口名 变量名 = new 实现类对象;
-
面试题:区分抽象类和接口
共性:都可以声明抽象方法 都不能实例化
不同:① 抽象类一定有构造器。接口没有构造器 ② 类与类之间继承关系,类与接口之间是实现关系,接口与接口之间是多继承关系