Java基础笔记(三)--面向对象基础、对象、继承与多态、抽象类与接口

面向对象基础

面向对象的三个特性: 封装、继承、多态.
封装: 使外部不能随意访问对象内部, 隐藏对象内部细节, 只保留有限的对外接口.
继承: Java 是单继承, 但可以实现多个接口.
多态: 多态是只父类中的成员变量和成员方法被子类继承后, 可以具有不同的状态或表现行为.
类声明:
类修饰符 class关键字 类名 extend关键字 父类 implements关键字 接口名{}
类修饰符包括: public/abstract/final
成员变量声明:
变量修饰符 数据类型 变量名;
变量修饰符: public/protected/private/static/final.
成员方法声明:
方法修饰符 返回值类型 方法名 异常抛出
{
    方法体
}
方法修饰符: public/protected/private/static/final/abstract/native/synchronized. native 修饰的方法是本地方法, 只能调用平台本地代码, 不能实现跨平台. syncchronized 修饰的方法是同步的, 当多线程方式同步方法时, 只能串行执行, 保证线程安全.

为防止类、接口、枚举和注释等命名冲突, Java 引入了包 (package) 概念, 包本质上是命名空间.
包定义
Java 使用 package语句定义包, 包定义语句只能放在源文件第一行, 每个源文件中只能有一个包定义语句. 格式如下:
package pkg1[.pkg2[.pkg3...]];
如果源文件中没有定义包, 那么会放入默认包中.
包采用层次结构管理文件, 如图:
Alt text
包引入
引入包使用import语句, import语句应位于package语句之后, 所有类的定义之前, import语句可以有多条. 其语法格式为:
import package1[.package2...].(类型名|*);

 

如果当前源文件与要使用的类型在同一个包中, 可以不用引入包.

常用包

1. java.lang 包
包括了 Java 核心语言类, 如 Object/Class/String/包装类/Math 等. 使用 java.lang 包中的类型不需要显示使用 import 语句引入, 由解释器自动引入.
2. java.io 包
提供多种输入/输出流类, 如 InputStream/OutputStream/Reader/Writer. 还有文件管理相关类和接口, 如 File/FileDescriptor 类以及 FileFilter 接口.
3. java.net 包
包括进行网络操作的各种类, 如 URL/Socket/ServerSocket 等.
4. java.util 包
包括一些实用工具类和接口, 如集合/日期/日历相关类和接口.
5. java.text包
包括文本处理、日期格式化和数字格式化等相关类和接口.
6. java.awt 和 java.swing 包
提供了 Java 图形用户界面开发需要的各种类和接口.

方法重载 (Overload)

方法名相同, 但方法的参数个数或参数类型不同即方法重载. 方法返回值类型不同不能用来区分方法重载.
调用重载的方法时, 编译器会先根据参数个数决定调用哪个方法, 参数类型不一致时, 会自动进行类型转换. 如果完全没有合适的方法, 则发生编译错误.

封装性与访问控制

私有级别: private, 仅同一个类部门的成员变量和成员方法可以访问.
默认级别: 默认级别没有关键字. 同一个包内的类可以访问.
保护级别: protected. 同一个包中, 保护级别和默认级别一样. 不同包中, 只有子类可以访问.

静态变量和静态方法

静态成员使用 static 修饰.

静态代码块

静态代码块在第一次加载类时执行, 且只执行一次.
格式:
static{
// 代码块
}

对象

创建对象分为: 声明和实例化. 声明并不为对象分配内存空间, 而只是分配一个引用. 实例化分为两个阶段: 为对象分配内存空间和初始化对象. 首先使用 new 运算符为对象分配内存空间, 然后再调用构造方法初始化对象.
一个引用变量没有通过 new 分配内存空间, 这个对象就是空对象. Java 使用 null 表示空对象. 引用变量的默认值就是 null.

构造方法

Java 构造方法特点:
  1. 构造方法名必须与类名相同.
  2. 构造方法没有任何返回值, 包括 void.
  3. 构造方法只能与 new 运算符结合使用.
默认构造方法
Java 虚拟机为默认任何构造方法的类提供了一个无参数的默认构造方法, 默认构造方法的方法体内没有任何语句.
构造方法重载
一个类中可以有多个构造方法, 它们有相同的名字, 但参数列表不同.
构造方法封装

this 关键字

this 指向对象本身. this 有三种使用情况:
  1. 调用实例变量
  2. 调用实例方法
  3. 在一个构造方法中调用其他构造方法: this(参数列表)

对象销毁

Java 通过垃圾回收器回收对象然后释放. 当一个对象的引用不存在时, 认为该对象不再需要, 垃圾回收器自动扫描对象的动态内存去, 把没有引用的对象作为垃圾收集起来并释放.

继承与多态

如果类没有显示地继承任何类, 那么默认父类是 Object 类. java.lang.Object 类是 Java 的根类, 所有 Java 类都间接或直接继承了 Object 类.
子类使用 super 关键字调用父类方法. super 语句必须放在子类构造方法的第一行.

成员变量隐藏和方法覆盖

子类成员变量和父类一样, 会屏蔽父类中的成员变量, 成为成员变量隐藏.
如果子类方法和父类方法相同, 即方法名、参数列表、返回值都一样, 子类方法会覆盖父类方法.
在进行方法覆盖时可以添加@Override注解, 有如下好处:
  1. 提高程序可读性
  2. 编译器会检查@Override注解的方法在父类中是否存在, 如不存在则报错

多态

发生多态有三个条件:
  1. 继承. 多态发生一定要在子类和父类之间
  2. 覆盖. 子类覆盖父类方法
  3. 声明的变量类型是父类类型, 但实例则指向子类实例
判断一个对象是否属于某个引用类型, 可以使用instanceof运算符:
object instanceof type

 

引用类型的转换
只有属于同一颗继承树上的引用类型才可以转换. 引用类型转换有两个方向: 将父类引用类型变量转换为子类类型成为向下转型; 将子类引用类型变量转换为父类类型成为向上转型. 向下转型需要强制进行, 向上转型是自动的.

final 关键字

final 修饰变量
final 修饰的变量即为常量, 只能赋值一次. 但 final 修饰的局部变量和成员变量有所不同:
  1. final 修饰的局部变量必须使用前被赋值一次.
  2. final 修饰的成员变量没有在声明时被赋值时, 就必须在构造方法或静态代码块中初始化.
final 修饰类
final 修饰的类不能被继承.
final 修饰方法
final 修饰的方法不能被子类覆盖.

抽象类与接口

抽象类

抽象类和抽象方法的修饰符都是 abstract. 抽象类不能被实例化.

接口

接口中所有的方法都是抽象方法. Java 中使用 interface 关键字声明接口.
接口中的成员变量都是静态成员变量, 可以省略public static final修饰符.
类实现接口时使用 implements 关键字. 实现多个接口时, 多个接口之间使用逗号 (,) 分割. 实现接口时, 要实现接口中所有的方法.
接口与多继承
Java 是单继承, 但可以实现多个接口. Java 允许接口间的继承.
Java 8 新特性: 默认方法和静态方法
Java 8 在接口中提供了声明默认方法和静态方法的能力.
// 默认方法
default int method()
{
    return 0;
}

// 静态方法
static double methodE()
{
    return 0;
}

 

实现接口时, 接口中的原有抽象方法在实现类中必须实现. 默认方法可以根据需要有选择实现 (覆盖). 静态方法不需要实现, 实现类中不能直接拥有接口中的静态方法.
调用接口的静态方法只能通过接口名调用, 不能通过实现类.
posted @ 2019-08-14 17:21  有风来  阅读(197)  评论(0编辑  收藏  举报