访问修饰符
继承的内存分布
this和super的区别
重载(overload)与重写(override)区别
面向对象—多态
代码块
创建一个对象时,类 的调用顺序
继承关系创建对象,类的调用过程
单例模式
两种模式:饿汉式,懒汉式
饿汉式代码实现
懒汉式代码实现
final关键字
调用静态属性i时,静态代码块不会被调用
接口
接口Vs继承
1.实现接口是对Java单继承的一种补充,
2.当子类继承了父类,就自动的拥有了父类的功能
3.如果子类需要扩展功能,可以通过实现接口的方式扩展
4.继承的价值:解决代码的复用性和可维护性
5.接口的价值:设计,设计好各种规范(方法),让其他类去实现这些方法
6.接口比继承更加灵活
继承是is a的关系,而接口只需要满足like a的关系
7.接口在一定程度上实现代码的解耦
比喻:猴子继承爬树,可以实现鱼一样的游泳,可以实现小鸟一样飞翔
内部类
类的五大成员:属性,方法,构造器,代码块,内部类
内部类的分类:
定义在外部类局部位置上(比如方法内)
1)局部内部类(有类名)
2)匿名内部类(没有类名,重点!!!)
定义在外部类的成员位置上
1)成员内部类(没有static修饰)
2)静态内部类(有static修饰)
1.局部内部类
- 局部内部类是定义在外部类的局部位置,通常在方法,还可以在代码块中
- 可以直接访问外部类的所有成员,包含私有的
- 不能添加访问修饰符,但是可以添加final修饰
- 作用域:仅仅在定义它的方法或者代码块中
- 局部内部类可以直接访问外部类的成员
- 外部类在方法中,可以创建对象,调用内部类的方法即可
- 如果外部类和局部内部类的成员重名时,默认遵守就近原则,如果想访问外部类的成员,使用外部类名.this.成员去访问
- 外部类名.this.成员解读:哪个对象调用了这个方法,外部类名.this就是哪个对象
2.匿名内部类
遵守局部内部类的规则
特点:本质是类,是内部类,是没有名字的类,同时还是一个对象
基本语法
new 类或者接口(参数列表){
类体
}
new 接口代码实现
public class A {
public static void main(String[] args) {
IB ib = new IB();
ib.eat();
}
}
class IB {
/**
* 1.需求:使用IA接口,并创建对象
* 2.传统方法是写一个类,实现接口,创建对象
* 3.类只使用一次,后面不在使用,创建类太浪费
* 4.可以使用匿名内部类来简化开发
* 5.ia的编译类型? IA
* 6.ia的运行类型? 就是匿名内部类 XXXX =>IB$1 就是外部类@1
* 底层原理:创建一个类 会分配类名 IB$1
* class XXXX implements IA{
* @Override
* public void cry() {
* System.out.println("老虎叫唤");
* }
* }
* 7.jdk底层在创建匿名内部类IB$1,立即马上创建IB$1实例对象,并把地址值返回给变量ia
* 8.匿名内部类使用一次就不能使用了
*/
/**
* 底层 会创建一个类
*
*/
public void eat(){
IA ia = new IA() {
@Override
public void cry() {
System.out.println("老虎叫唤");
}
};
System.out.println(ia.getClass());
ia.cry();
}
}
interface IA{
void cry();
}
3.成员内部类
- 成员内部类,是定义在内部类的成员位置,不使用static修饰
- 可以直接访问外部类的所有成员,包含私有的
- 作用域:同其他成员,为整个类体
- 可以添加修饰符(public,protected,默认,private),因为它本身就是一个成员
- 外部类访问内部类:创建方法,new对象访问
- 外部其他类访问内部类的2种方式:
- 1)外部类的对象.内部类的对象
- 2)在外部类中编写一个方法,返回一个内部类的对象
4.静态内部类 - 静态内部类,是定义在外部类的成员位置,使用static修饰
- 可以直接访问外部类的static成员
- 可以添加修饰符(public,protected,默认,private),因为它本身就是一个成员
- 作用域:同其他成员,为整个类体
- 外部类访问内部类:创建方法,new对象访问
- 外部其他类访问内部类的2种方式:
- 1)因为静态内部类是可以直接通过类名直接访问(前提是满足修饰符权限)
- 2)在外部类中编写一个方法,返回一个内部类的对象
- 当静态内部类与外部类成员重名时,使用外部类.成员访问
枚举
默认继承Enum类,不允许在继承其他类,可是实现接口
注解
元注解:修饰注解的注解,成为元注解
- Retention 指定注解的作用范围,三种source,class,runtime保存范围源码,class,运行
- Target 指定注解可以在哪些地方使用
- Documented 指定注解是否会在javadoc体现
- Inherited 子类会继承父类注解
异常(ctrl+alt+t)
java语言中,将程序执行中发生的不正常情况成为***异常***
异常体系图:
Error(错误)
- StackOverflowError栈溢出
- OutOfMemoryError内存不足
Exception(异常) - 运行时异常(RuntimeException)
- NullPointerException 空指针异常
- ArithmeticException 算数异常
- ArrayIndexOutOfBoundsException 数组下标越界异常
- ClassCastException 类型转换异常
- NumFormatException 数字格式不正确异常
- 编译异常
- SQLException 操作数据库时可能发生的异常
- IOException 操作文件,反生的异常
- FileNotFoundException 一个不存在的文件,反生的异常
- ClassNotFoundException 类不存在异常
异常处理机制:
- try-catch-finally - throws
自定义异常
一般我们自定义异常都是继承RuntimeException,
即把自定义异常指定为运行时异常
好处:我们可以使用默认处理机制
Throw和Throws区别
包装类
Integer
只要有基本类型,判断的都是值
包装类与String相互转换