包
包的三大作用:
- 区分相同名字的类
- 当类很多时,可以很好的管理类
- 控制访问范围
包基本语法:
package com.wanlaizhou
- package 关键字,表示打包
- com.wanlaizhou 表示包名
包的本质分析(原理)
包的本质就是创建不同的文件夹/目录来保存类文件
包的命名:
-
命名规则:
只能包含数字、字母、下划线、小圆点,但不能以数字开头,不能是关键字或保留字
-
命名规范:
小写字母+小圆点一般是
com.公司名.项目名.业务模块名
如:com.sina.crm.user
常用的包:
java.lang.* //lang包是基本包,默认引入,不需要再引入
java.util.* //util包,系统提供的工具包,工具类,使用Scanner
java.net.* //网络包,网络开发
java.awt.* //是做java的界面开发,GUI
如何引入包:
语法:
import 包;
import java.util.*; //导入整个包
import java.util.Scanner; //导入Scanner类
建议需要哪个类就导入哪个类,不建议整个导入
注意事项和细节:
-
package的作用是声明当前类所在的包,需要放在类或者文件的最上面,一个类中最多只有
一句package
-
import 指令 位置放在package的下面,在类定义前面,可以有多句且没有顺序要求
访问修饰符
java提供四种访问控制符修饰符号,用于控制方法和属性的访问权限
- 公开级别:public,对外公开
- 受保护级别:protected,对子类和同一个包中的类公开
- 默认级别:没有修饰符号,向同一个包的类公开
- 私有级别:private,只有类本身可以访问,不公开
访问级别 | 访问控制修饰符 | 同类 | 同包 | 子类 | 不同包 | |
---|---|---|---|---|---|---|
1 | 公开 | public | √ | √ | √ | √ |
2 | 受保护 | protected | √ | √ | √ | × |
3 | 默认 | 没有修饰符 | √ | √ | × | × |
4 | 私有 | private | √ | × | × | × |
注意事项
- 修饰符可以用来修饰类中的属性、成员方法以及类
- 只有默认的和public才能修饰类,并且遵循上述访问权限的特点
- 继承特性后续补充
- 成员方法的访问规则和属性完全一样
面向对象编程三大特征
封装
就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法),才能对数据进行操作。
好处:
- 隐藏实现的细节:方法(连接数据库)<–调用(传入参数)
- 可以对数据进行验证,保证安全合理
实现步骤:
- 进行属性私有化private(不能直接修改属性)
- 提供一个公共的(public)set方法,用于对属性判断并赋值
- 提供一个公共的(public)get方法,用于获取属性的值
构造器中调用set()、get()方法,可以保持数据验证,否则set()方法的验证会失效
class Person {
public int age;
public Person(int age) {
this.age = age;
}
public void setAge(int age) {
if (age >= 1 && age <= 120) {
this.age = age;
} else {
System.out.println("输入年龄范围不对,已置为18");
this.age = 18;
}
}
}
继承
代码复用性
继承可以解决代码复用,让编程更加靠近人类思维,当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,再父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可
继承的语法
class 子类 extends 父类{
}
//1、子类会自动拥有父类定义的属性和方法(暂不考虑私有)
//2、父类(基类、超类)
//3、子类(派生类)
继承带来的便利:
- 代码的复用性提高了
- 代码的扩展性和维护性提高了
继承的细节:
-
子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问;但是私有属性和方法不能在子类直接访问,要通过父类提供的公共的方法去访问
-
子类必须父类的构造器,完成父类的初始化
-
当创建子类对象时,不管使用子类的哪个构造器,默认情况下都会去调用父类的构造器;如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则编译不会通过
-
如果希望指定去调用父类的某个构造器,则显示地调用一下
-
super在使用时,必须放在构造器的第一行,只能在构造器中
-
super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
-
java所有类都是Object类(相当于女娲)的子类,Object类是所有类的基类
-
父类构造器的调用不限于直接父类,将一直往上回溯直到Object类(顶级父类)
-
子类最多只能继承一个父类(指直接继承)即java中是单继承机制
如何让A类继承B类和C类?
B继承C,A继承B
-
不能滥用继承,子类和父类直接必须满足is-a的逻辑关系
继承本质详解:
class Grandpa{
String name = "Grandpa";
int age = 60;
}
class Father{
String name = "Father";
int age = 39;
}
class Son{
String name = "Son";
}
/*
若Father类中,age属性变为私有,
Son son = new Son();
此时去调用son.age,会报错,而不会访问到Grandpa类的age属性
*/
super关键字
- super代表父类的引用,用于访问父类的属性、方法、构造器
- 基本语法:
- 访问父类的属性,但不能访问父类的私有属性
- 访问父类的方法,但不能访问父类的私有方法 super.方法名(参数列表)
- 访问父类的构造器,super(参数列表),只能放在构造器的第一句
- super带来的便利/细节
- 调用父类构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)
- 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super,如果没有重名,使用super、this、直接访问是一样的效果(this和直接访问是先查找本类,再找父类,super是直接查找父类)
- super不限于直接父类,可以使用super去访问父类的父类。如果多个基类中都有同名的成员,遵循就近原则,当然也要遵循访问权限
super 和this 的比较:
方法重写/覆盖 (override)
-
子类有一个方法和父类的某个方法的名称、返回类型、参数一样,那么就说子类的方法覆盖了父类的方法
-
注意事项/细节
-
子类方法的参数、方法名要和父类方法的参数、方法名完全一样
-
子类方法的返回类型和父类方法的返回类型一样,或者是父类方法返回类型的子类
-
子类方法不能缩小父类方法的访问权限
public > protected > 默认 > private
-
重载和重写: