方法
public static void main(String[] args) {}
public 公共的 方法的访问修饰符
static 静态的 方法的修饰符
void 空白的 方法的返回值类型
main 主要的 方法的名称
() 方法的参数列表
{} 方法体
方法的组成部分:
方法的定义
方法体
数组
初始化,遍历,操作,system/arrays提供数组拷贝方法,排序
二维数组使用
注意:在使用之前必须先要对一维数组进行初始化
可变参数
语法: 数据类型... 参数名
类和对象
类和对象的关系
如何创建类/对象
成员变量
成员变量vs局部变量
成员方法(不能用static修饰)
方法的重载(同名不同参)
构造方法
概念
类中的特殊方法,用于创建类的对象
给对象的属性赋值,new创建对象的同时传入值
语法:
public 构造方法名(){}
特点
构造方法名必须与类名完全一致
构造方法的重载
一个类无论提供多少个构造方法,一定要保留一个无参构造方法
第一行没有super或this会默认调用父类的无参构造方法
快捷键
alt+shift+s
对象的创建空间(栈、堆)
this(就近原则)表示当前类的对象
调用本类的属性/方法/构造方法
封装
封装
private访问修饰符
可将属性修饰为私有,仅本类可见
提供公共访问方法,以保证数据的录入
get/setXxx方法(取值/赋值)
快捷键:alt+insert、选择Generate
JavaBean:实体类
数据承载Bean(类似数据库一张表)
私有化模块
提供set、get方法
提供有参和满参构造
业务逻辑Bean(Service(增删改查))
继承
继承
extends
类与类之间特征和行为的一种赠与或获得
特点
子类继承父类可以享有父类的属性方法
单继承(一子类只继承一父类,一个父类可有多个子类)
支持多重继承,所有类默认继承自Object
定义子类独有的属性方法
不能被继承
使用private修饰的属性方法不能被子类继承
构造方法不能被继承(是用来创建类的对象)
父类中使用默认的修饰符的修饰的属性和方法在不同包的子类中不能被继承
子类对象的创建过程
对象的创建过程:
1、开辟空间
2、实例化成员变量
3、执行构造方法
4、将创建的对象赋给对象名
继承后对象的创建过程
先创建其父类的对象,实例化父类的成员变量,执行父类的构造方法
在创建子类的对象 ,实例化子类的成员变量,执行子类的构造方法
访问修饰符(属性方法类)
本类 本包 不同包子类 其他包
private私有的 *
默认的(缺省的) * *
protected受保护的 * * *
public公开的 * * * *
注意:
外部类的修饰符只能是public或默认
类的成员(包括内部类)的修饰符可以是以上四种
类的成员不写访问修饰符默认为default,默认对于同⼀个包的其他类相当于公开,对于不是同⼀个包的其他类相当于私有
受保护(protected)对⼦类相当于公开,对于不是同⼀个包没有⽗⼦关系的类相当于私有
方法重写
方法重载
在一个类中的出现同名方法称之为方法的重载
方法重写
子类中出现与父类相同签名的方法,称 为方法的重写
相同签名:方法名、参数列表、返回值类型相同、访问修饰符(要比父类更宽泛)
原因:父类的方法无法满足子类的需求
父类代表一种普适性
注意:@Override检查是否满足重写的要求
父类中的私有方法子类无法重写(私有方法不能被继承)
不能被继承的方法就不能被重写
Super关键字
调用父类的属性/方法
没有重名时一致,重名super代表父类
调用父类的构造方法
先有爹再有儿子!!
new子类之前父类的都会被执行
父类和子类先分配空间
对Objected属性初始化
实例化:构建Objected对象
执行构造方法
子类对象逐级执行
super();调用父类的无参构造
多态
多态
父类引用指向子类对象,从而产生多种形态(英雄联盟Q技能)
同一个事件发生在不同对象会产生不同的结果,不同动物吃法不一样
Animal a=new Dog();
设计原则:开闭原则
对扩展开放,对修改关闭
编译看左边运行看右边
父类引用仅可调用父类声明的属性和方法,无法调用子类独有的方法(编译看左边)
调用的一定是子类重写的方法(运行看右边)
特点
多态产生前提
必须要有继承
必须要有重写
父类的引用指向子类的对象(向上转型)
调用子类自己独有的方法和属性(向下转型-强转)
如果发生多态要调用子类自己独有的方法和属性,那么需要发生向下转型。但是发生向下转型之前必须要发生过向上转型
须先发生向上转型,否则ClassCastException
向下转型之前,最好先通过instanceOf判断
对象 instanceOf 类型:判断该对象是否属于该类型,属于返回true,否则false
不管怎么转对象还是那个对象
- 多态的引用场景
方法的参数
方法的返回值
修饰符
abstract
例如动物不是客观存在的,不完整的类,此类不能new对象
修饰抽象类
特点:
不能被实例化,不能new
抽象类是用来当父类的
抽象方法的特点:
必须出现在抽象类
抽象方法不能有方法体(方法的实现{})
抽象方法必须在非抽象子类中重写
产生继承关系后,子类必须重写父类中所有的抽象方法,否则子类还是抽象类
什么时候用
抽象类较少用,更多的使用接口!
抽象方法常用,在接口中全部都是抽象方法,抽象方法的作用就是为了让子类去重写
static
修饰成员变量,成员方法,代码块
静态属性
静态方法
类名.方法名调用
由于static方法在加载class时首先完成,比构造方法早,此时非static的属性和方法还没有完成初始化。
在static方法内部无法直接调用非static的方法,可以通过先实例化对象,再通过该对象调用非static方法,
在非static方法中可以调用static方法,通过直接调用 方法名()或者 类名.方法名()。
-
表示静态的,多个对象之间共享
可以修饰成员变量,成员方法,代码块,内部类
-
静态方法只能调用静态属性/方法
静态方法在类加载的时候就已经存在,而成员方法要等到new完对象
-
静态方法中不能使用this和super关键字
对象没new好 -
静态方法可以被子类继承,但是不能被重写
变量和方法都拷贝了一份 -
抽象方法不能使用static修饰
-
未来工具类中方法都是静态的
public class Test01 {
public static void main(String[] args) {
String[] names = makeNames();
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
}
//1、从键盘录入五个名字到数组中,遍历数组输出这五个名字
public static String[] makeNames() {
Scanner sc = new Scanner(System.in);
String[] names = new String[5];
for (int i = 0; i < names.length; i++) {
System.out.println("请输入第"+(i+1)+"个人的名字");
names[i] = sc.next();
}
return names;
}
}
//main方法也是static
静态代码块
代码块会在创建对象的时候自动执行,不用手动调用,按先后顺序执行,优先于构造方法
静态代码块会在类加载的时候自动执行,无需手动调用,优先于代码块,只会在类加载的时候执行一次
new对代码块有影响,对静态无影响
类加载的触发机制
- 创建对象的时候new
- 创建子类对象的时候(先要创建其父类对象)
- 在调用类中的静态属性和方法的时候
- Class类中提供的静态方法Class.forName()方法的时候(反射.主动)
代码块
在对象被创建的时候自动调用,每次创建对象都会执行。优先于构造方法先执行
类的加载时机
类加载的时机:
1、创建对象
2、创建子类对象
3、调用静态属性和方法
4、Class.forName("类的全限定名"); 全限定名:包名+类名
final
- 修饰类,属性,方法
- 使用final修饰的类不能被继承
- 使用final修饰的方法不能被重写,但可以被继承
- 使用final修饰的属性称为常量
- 修饰的属性称为常量
- 常量必须要赋值,且不能修改
- 常量的最后赋值时机
- 非静态常量
- 直接赋值
- 在代码块中赋值
- 在构造方法中赋值(如果一个类有多个,则在每一个构造方法中赋值)
- 静态常量
- 直接赋值
- 在静态代码块中赋值
- 非静态常量
接口
面向接口编程思想
除了从父类中继承还可以通过接口扩展
先写接口,再写接口实现类
语法
public interface 接口名()
实现接口:
public class 实现类(子类) implements 接口{}
特点
没有构造方法,不能创建对象,不能被实例化
只能定义:公开静态常量、公开抽象方法
抽象方法必须要被非抽象类重写
没有普通属性、方法、 构造方法、静态代码块、代码块
一个类引多个接口用,隔开
和抽象类区别
相同点
- 可编译成字节码文件。
- 不能创建对象。
- 可以作为引用类型。
- 具备Object类中所定义的方法。
不同点
- 所有属性都是公开静态常量,隐式使用public static final修饰。
- 所有方法都是公开抽象方法,隐式使用public abstract修饰。
- 没有构造方法、动态代码块、静态代码块。
接口作用
微观:扩充类的能力
因为一个类只能继承一个父类,如果父类的方法不满足子类的时候,这时我们通过接口的方式,为这个类扩充功能
(一个类可以实现多个接口)-添加多个能力
宏观:定义类的约束(标准)
未来更多面向接口编程,先定义接口表示出来,定义规范,再写实现类
统一的接口文档
接口的规范
任何类在实现接口时,必须实现接口中所有的抽象方法,否则此类为抽象类。
实现接口中的抽象方法时,访问修饰符必须是public。
同父类一样,接口也可声明为引用,并指向实现类对象。
接口常见关系
类与类:
单继承
extends 父类名称
类与接口:
多实现
implements 接口名称1 , 接口名称2 , 接口名称n
接口与接口:
多继承
extends 父接口1 , 父接口2 , 父接口n
接口常量
接口中只有公开的静态常量,定义了很多用于表示状态(已支付、未支付、支付已发货、支付未发货…) 以后在开发中可以用枚举类代替
接口的回调
底层用的多
先有接口的使用者,后有接口的实现者
B方法没写好,A不影响
new一个接口
调用接口实现的方法
封装一个框架、工具类…
子类实现接口,就要实现接口里的所有方法,用不上——>适配器
回调原理
接口回调 |
---|
①接口
//此接口的作用是判断数字是否是质数
interface MyInterface{
boolean isZS(int num);
}
②工具
//此方法已经调用了接口中的方法
public static void gdbh(int num,MyInterface mi) {
for (int i = 3; i <= num/2; i++) {
if(mi.isZS(i) && mi.isZS(num-i)) {
System.out.println(num+"="+i+"+"+(num-i));
}
}
}
③接口的实现者
//这是接口的实现者,在调用工具前,需要有接口的实现
class MyInterfaceImpl implements MyInterface{
@Override
public boolean isZS(int num) {
for (int i = 2; i < num; i++) {
if(num % i == 0) {
return false;
}
}
return true;
}
}
④工具的调用者
public static void main(String[] args) {
//使用工具
gdbl(14, new MyInterfaceImpl() );
}
接口回调的编码顺序①②③④
内部类
内部类的概念:
在一个类中定义的类,称之为内部类(InnerClass),外面的类的称之为外部类(OutClass)
内部类的分类:
1、成员内部类
2、静态内部类
3、局部内部类
4、匿名内部类
内部类的特点:
1、内部类可以访问到外部类的私有成员,且不破坏封装性
2、内部类也会生成.class文件。名为:外部类名$内部类名.class
外部类的特点:
一个java 文件中可以编写多个类,但是只能有一个类能使用public修饰,称之为主类。主类
名必须与文件名一致
建议:以后开发中,一个java文件就编写一个类
匿名内部类
匿名内部类:本身就是一个对象
语法:
new 父类(){
重写父类的方法
}
特点:
1、匿名内部类本身就是一个对象
2、一般在匿名内部类中不会定义属性和方法,因为没有意义
3、匿名内部类的父类一般都是抽象类或者是接口
匿名内部类的应用场景
如果一个方法的参数是接口,且这个接口只需要实现一次,那么就可以使用匿名内部类
这个接口的实现每一次都不相同,就可以使用匿名内部类