目录
一、包
包
(package)
是组织类的一种方式,使用包的主要目的是保证类的唯一性。
1.1 导入包中的类
- 使用import 语句导入某个包
例如:import java.util.Date;
- 如果需要使用 java.util 中的其他类,可以用import java.util.*
1.2 将类放到包中
规则:
-
在文件的最上方加上一个 package 语句指定该代码在哪个包中
-
如果一个类没有 package 语句, 则该类被放到一个默认包中
-
包名需要指定成唯一的名字, 通常会用公司的域名的颠倒形式 ( 例如 com.bit.demo1 )
-
包名要和代码路径相匹配,例如创建 com.bit.demo1 的包,那么会存在一个对应的路径 com/bit/demo1 来存储代码
1.3 包的访问权限控制
如果某个成员不包含
public
和
private
关键字
,
此时这个成员可以在包内部的其他类使用,
但是不能在包外部的类使用
1.4 常见的系统包
1. java.lang:
系统常用基础类
(String、
Object),
此包从
JDK1.1
后自动导入。
2. java.lang.reflflect:java
反射编程包;
3. java.net:
进行网络编程开发包。
4. java.sql:
进行数据库开发的支持包。
5. java.util:
是
java
提供的工具程序包。
(
集合类等
)
非常重要
6. java.io:I/O
编程开发包
二、继承
继承表示 is - a 的关系
2.1 基本语法
class 子类 extends 父类 {}
2.2 规则
- 使用 extends 指定父类
- Java 中一个子类只能继承一个父类 (C++/Python等语言支持多继承)
- 子类会继承父类的所有 public 的字段和方法
- 对于父类的 private 的字段和方法,子类中是无法访问的
- 子类的实例中, 也包含着父类的实例。 可以使用 super 关键字得到父类实例的引用
2.3 protected 关键字
对于类的调用者来说,
protected
修饰的字段和方法是不能访问的 ,对于类的子类
和
同一个包的其他类
来说,
protected
修饰的字段和方法是可以访问的。
注:
Java 中对于字段和方法共有四种访问权限:
- private: 类内部能访问,类外部不能访问
- 默认(也叫包访问权限):类内部能访问,同一个包中的类可以访问, 其他类不能访问
- protected:类内部能访问,子类和同一个包中的类可以访问, 其他类不能访问
- public:类内部和类的调用者都能访问
范围 | private | defalut | protected | public |
同一包中的同一类 | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
同一包中的不同类 | 可以访问 | 可以访问 | 可以访问 | |
不同包中的子类 | 可以访问 | 可以访问 | ||
不同包中的非子类 | 可以访问 |
2.4 多层继承
代码示例:
public A {
}
public B extends A {
}
public C extends B {
}
2.5 final关键字
修饰类表示被修饰的类不能被继承
三、组合
组合表示has
-
a的关系
组合是将一个类的实例作为另外一个类的字段
代码示例:
public class Student {
}
public class Teacher {
}
public class School {
public Student[] students;
public Teacher[] teachers;
}
四、多态
4.1 向上转型
把子类对象或引用给父类
代码示例:
Dog dog = new Dog("小狗",3);
Animal animal = dog;
Animal animal = new Dog("小狗",3);
向上转型之后,只能通过父类的引用来访问父类自己特有的属性和方法,不能访问子类特有的属性和方法。
4.1.1 向上转型发生的时机
- 直接赋值
- 方法传参
- 方法返回
4.2 向下转型
把父类引用给子类
代码示例:
Animal animal = new Brid("小鸟",3);
Bird bird = (Bird) animal;
4.3 方法重写
4.3.1 规则
- 函数名相同
- 函数参数列表相同
- 函数返回值相同
4.3.2 注意:
- 静态方法不能重写
- private方法不能重写
- 子类的访问权限要大于父类
- 若一个方法被final修饰就不能重写
4.3.3 重载和重写的区别
区别 | 重载 | 重写 |
概念 | 方法名称相同,参数的类型及个数不同 | 方法名称、返回值类型、参数的类型及个数完全相同 |
范围 | 一个类 | 继承关系 |
限制 | 没有要求 | 被重写的方法不能比父类的访问控制权限更严格 |
4.4 super关键字
用于子类内部调用父类方法
- 访问父类成员变量
- 访问父类成员方法
- 访问父类构造方法
4.4.1super 和 this 的区别
区别 | this | super |
概念 | 访问本类中的属性和方法 | 由子类访问父类中的属性和方法 |
查找范围 | 先查找本类,本类没有就调用父类 | 不查找本类,直接调用父类 |
特殊 | 表示当前对象 | 无 |
五、抽象类
没有实际工作的方法,可以将它设计成一个抽象方法,包含抽象方法的类称为抽象类。
5.1 语法规则
代码示例:
class abstract Shape {
abstract public void draw();
}
注:
- 抽象类不能直接实例化
- 抽象类中可以有和普通类一样的成员
- 一个普通类如果继承了抽象类,这个类需要重写抽象类中的抽象方法
- 一个抽象类A继承了另一个抽象类B之后,可以不重写B中的方法,但是一旦A被继承后,一定要重写所有的抽象方法
- 抽象方法不能是private 和 final修饰的
5.2 抽象类的作用
抽象类存在的最大意义就是为了被继承。
抽象类本身不能被实例化,
要想使用,
只能创建该抽象类的子类,
然后让子类重写抽象类中的抽象方法。
六、接口
6.1 语法规则
interface IShape {
}
- 使用 interface 定义一个接口
- 接口中的方法默认都是public abstract
- 接口中的成员变量默认都是public static final
- 接口不能实例化
- 一个类使用 implements 关键字实现接口
- 一个普通类可以既继承类也实现接口(多个),一个抽象类可以实现一个接口
- 接口中可以有静态方法
6.2 接口间的继承(扩展)
代码示例:
interface TT1 {
void funcTT1();
}
interface TT2 extends TT1{
void funcTT2();
}
interface TT3 extends TT2{
void funcTT3();
}
class TTClass implements TT3{
需重写TT1-TT3中所有的方法
}
6.3 抽象类和接口的区别
区别 | 抽象类 | 接口 |
结构组成 | 普通类 + 抽象方法 | 抽象方法 + 全局变量 |
权限 | 各种权限 | public |
子类使用 | 使用extends继承抽象类 | 使用implements实现接口 |
关系 | 一个抽象类可以实现若干个接口 | 接口不能继承抽象类,但是接口可以使用extends继承多个父接口 |
子类限制 | 一个子类只能继承一个抽象类 | 一个子类可以实现多个接口 |