0.写在前面

  1. 本笔记用作复习查看用,基础完整总结部分,基础不牢,地动山摇! | 🔥Java帝国之行🔥 | 地址 | | —- | —- | | Java核心编程总结(一、继承) 🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209463 | | Java核心编程总结(二、抽象类与接口)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209487 | | Java核心编程总结(三、多态与内部类)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209507 | | Java核心编程总结(四、异常与线程) 🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209529 | | Java核心编程总结(五、线程池与死锁)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209580 | | Java核心编程总结(六、常用API与集合)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209607 | | Java核心编程总结(七、Stream流)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209624 | | Java核心编程总结(八、IO输入输出流)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209648 | | Java核心编程总结(九、File文件类)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209674 | | Java核心编程总结(十、反射) 🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/117744497 |

1. 基础回顾+面试

1.0 多态

概念:同一个类型的对象,执行同一个行为,在不同状态下会表现出不同的行为特征
理解:都是动物类型的对象,执行run方法,在不同状态下表现出不同行为特征

1.1 多态形式

  • 父类类型 对象名称 = new 子类构造器
  • Anilam c = new Cat()
  • 接口 对象名称 = new 实现类构造器
  • 父类类型范围 > 子类类型范围 ```java public class PolymorphicDemo { public static void main(String[] args) {

    1. //父类类型 对象名称 = new 子类构造器;
    2. Animal dlam = new Cat();
    3. dlam.run(); //对于方法的调用: 编译(写代码)看左边Animal,运行看右边 Cat
    4. //看左边指的是看等号的左边,等号左边是Animal,会找Animal里面的run方法,不报错
    5. //运行的时候看等号的右边,等号右边是Cat,执行Cat里面的run方法
    6. // 🐱跑的飞快~~~
    7. System.out.println(dlam.name); //对于变量的调用: 编译看左边,运行看左边
    8. //动物名称Animal
  1. Animal taiDi = new Dog();
  2. taiDi.run(); //对于方法的调用: 编译(写代码)看左边,运行看右边
  3. //🐕跑的飞快~~~
  4. System.out.println(taiDi.name); //对于变量的调用: 编译看左边,运行看左边
  5. //动物名称Animal
  6. }

}

class Dog extends Animal{ public String name = “狗的名称Dog”; @Override public void run(){ System.out.println(“🐕跑的飞快~~~”); } }

class Cat extends Animal{ public String name = “猫的名称Cat”; @Override public void run(){ System.out.println(“🐱跑的飞快~~~”); } }

class Animal{ public String name = “动物名称Animal”; public void run(){ System.out.println(“动物跑的飞快~~~”); } }

  1. <a name="efILT"></a>
  2. ## 1.2 多态的识别技巧
  3. - 对于方法的调用:**编译(写代码)看左边,运行看右边**
  4. - 对于变量的调用:**编译看左边,运行看左边**
  5. <a name="rdHlD"></a>
  6. ## 1.3 多态的使用前提
  7. 1. **必须存在继承或者实现关系**
  8. 1. **必须存在父类类型的变量引用(指向)子类类型的对象**
  9. 1. **需要存在方法重写**
  10. <a name="ry32T"></a>
  11. ## 1.4 多态的优劣势
  12. 1. 优势
  13. - 在多态形式下,右边对象可以实现组件化切换,业务功能也随之改变,便于扩展和维护。可以实现类与类之间的解耦
  14. - 实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,可以传入一切子类对象进行方法的调用,更能体现出多态的扩展性与便利
  15. 2. 劣势
  16. - 多态形式下,不能直接调用子类特有的功能。(编译看左边!!)
  17. - 因为父类中没有子类独有的功能,所以代码在编译阶段就直接报错了
  18. <a name="pxoAX"></a>
  19. ## 1.5 引用类型自动类型转换
  20. **我们先来看基本数据类型的转换**:
  21. 1. 小范围类型的变量或者值可以直接赋值给大范围类型的变量
  22. 1. 大范围类型的变量或者值必须强制类型转换给小范围类型的变量
  23. **引用数据类型转换的思想是一样的**:
  24. 1. 父类类型的范围 > 子类类型的范围
  25. 1. Animal > Cat
  26. 1. 子类类型的对象或者变量可以自动类型转换赋值给父类类型的变量
  27. ```java
  28. Animal a = new Cat();

1.6 引用类型的强制类型转换

  • 父类类型的变量或者对象必须强制类型转换成子类类型的变量,否则报错!
  • 强制类型转换的格式:

    • 类型 变量名称 = (类型)(对象或者变量)
      1. Animal a = new Wolf();
      2. // 把动物类型的变量a转换为真实的狼类型
      3. Wolf w = (Wolf) a;

      1.7 多态下类型转换异常问题研究

  • 有继承/实现关系的两个类型就可以进行强制类型转换,编译阶段一定不报错

  • 但是在运行阶段可能出现:类型转换异常 ClassCastException
  • 建议在进行强制类型转换之前先判断变量的真实类型,再强制类型转换(instanceof)
    1. Animal a1 = new Cat();
    2. // Wolf w1 = (Wolf) a1; //编译阶段没有报错 在运行阶段可能出现类型转换异常
    3. if(a1 instanceof Cat){
    4. // 如果a1 属于猫类型,执行抓老鼠
    5. Cat c1 = (Cat) a1;
    6. c1.catchMouse();
    7. }else if(a1 instanceof Wolf){
    8. // 如果a1 属于狼类型,执行抓羊
    9. Wolf w1 =(Wolf) a1;
    10. w1.catchSheep();
    11. }

    1.8 内部类

  1. 什么是内部类?
    答:定义在一个类里面的类就是内部类
  2. 内部类有什么用?
    答:可以提供更好的封装性,内部类有更多的权限修饰符,封装性有了更多的控制
  3. 内部类的分类

    • 静态内部类
    • 实例内部类(成员内部类)
    • 局部内部类
    • 匿名内部类(重点)

      1.8.1静态内部类(了解)

  4. 什么是静态内部类?
    答:有static修饰,属于外部类本身,会加载一次

  5. 静态内部类的成分答:
    • 类中有的成分它都有,静态内部类属于外部类本身,只会加载一次
    • 所以它的特点与外部类是完全一样的,只是位置在别人里面而已
  6. 静态内部类的访问格式
    答:外部类名称.内部类名称
  7. 静态内部类创建对象的格式
    答:外部类名称.内部类名称 对象名称 = new 外部类名称.内部类构造器
  8. 静态内部类中是否可以直接访问外部类的静态成员?
    答:可以的,外部类的静态成员只有一份,可以被共享
  9. 静态内部类中是否可以直接访问外部类的实例成员?
    答:不可以,外部类的实例成员必须用外部类对象访问

请仔细理解下方代码,理解语法即可,静态内部类几乎不用!!!

  1. public class InnerClass {
  2. public static void main(String[] args) {
  3. //外部类名称.内部类名称 对象名称 = new 外部类名称.内部类构造器
  4. Outter.Inner in = new Outter.Inner();
  5. in.setName("张三");
  6. in.setAge(12);
  7. in.show();
  8. }
  9. }
  10. class Outter{
  11. private double salary;
  12. public static int age1 = 15;
  13. // 静态内部类: 有static修饰,属于外部类本身,只会加载一次
  14. public static class Inner{
  15. private String name;
  16. private int age;
  17. public Inner() {
  18. }
  19. public Inner(String name, int age) {
  20. this.name = name;
  21. this.age = age;
  22. }
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public int getAge() {
  30. return age;
  31. }
  32. public void setAge(int age) {
  33. this.age = age;
  34. }
  35. public void show() {
  36. System.out.println(name +"是" + age + "岁");
  37. System.out.println(age1);
  38. // 15
  39. // System.out.println(salary); 报错
  40. }
  41. }
  42. }

1.8.2实例内部类(了解)

  1. 什么是实例内部类?
    答:无static修饰的内部类,属于外部类的每个对象,跟着对象一起加载
  2. 实例内部类中的成分
    答:实例内部类中不能定义静态成员,其他的都可以定义,可以定义常量
  3. 实例内部类的访问格式
    答:外部类名称.内部类名称
  4. 实例内部类创建对象的格式
    答:外部类名称.内部类名称 对象名称 = new 外部类构造器.new 内部类构造器
  5. 实例内部类中是否可以直接访问外部类的静态成员?
    答:可以的,外部类的静态成员可以被共享访问
  6. 实例内部类中是否可以访问外部类的实例成员?
    答:可以的,实例内部类属于外部类对象,可以直接访问当前外部类的实例成员 ```java public class InnerClass { public static void main(String[] args) {
    1. // 实例内部类属于外部类对象。实例内部类的宿主是外部类对象!
    2. Outter.Inner in = new Outter().new Inner();
    3. in.show();
    } }

class Outter{ public static int age = 11; private String salary; // 实例内部类: 无static 修饰,属于外部类的对象 public class Inner{ private String name; // 不能在实例内部类中定义静态成员!! // public static String schoolName; 报错

  1. // 可以定义常量
  2. public static final String schoolName = "黑马";
  3. public String getName() {
  4. return name;
  5. }
  6. public void setName(String name) {
  7. this.name = name;
  8. }
  9. // 实例方法
  10. public void show(){
  11. System.out.println(age);
  12. System.out.println(salary);
  13. }
  14. }

}

  1. <a name="n2nOh"></a>
  2. ### 1.8.3局部内部类(了解)
  3. 1. **什么是局部内部类?**<br />答:在方法,构造器,代码块,for循环中定义的内部类,就是局部内部类
  4. 1. **局部内部类的成分**<br />答:只能定义实例成员,不能定义静态成员,可以定义常量
  5. 1. **局部内部类基本没啥用**
  6. ```java
  7. public class InnerClass {
  8. static {
  9. // 局部内部类
  10. abstract class A{
  11. }
  12. }
  13. public static void main(String[] args) {
  14. // 局部内部类
  15. class A{
  16. }
  17. }
  18. public static void test(){
  19. // 局部内部类
  20. class Animal{
  21. }
  22. // 局部内部类
  23. class A extends Animal{
  24. }
  25. }
  26. }

1.8.4匿名内部类(重点)

  1. 什么是匿名内部类?
    答:就是一个没有名字的局部内部类
  2. 匿名内部类的作用
    答:匿名内部类可以简化代码,是开发中常用的形式
  3. 匿名内部类的格式

    1. new 类名|抽象类|接口(形参){
    2. 方法重写
    3. }
  4. 匿名内部类的特点
    答:1.匿名内部类是一个没有名字的内部类
    2.匿名内部类一旦写出来,就会立即创建一个匿名内部类的对象返回
    3.匿名内部类的对象的类型相当于是当前 new 的那个类型的子类类型

    1. public class Anonymity {
    2. public static void main(String[] args) {
    3. Animal a = new Animal() {
    4. @Override
    5. public void run() {
    6. System.out.println("🐱跑的贼溜~~~");
    7. }
    8. };
    9. a.run();
    10. a.go();
    11. }
    12. }
    13. abstract class Animal{
    14. public abstract void run();
    15. public void go(){
    16. System.out.println("开始go~~~");
    17. }
    18. }

    1.9 包

  • 相同包下的类可以直接访问
  • 不同包下的类必须导包,才可以使用
  • 导包格式: import 包名.类名

    1.10 权限修饰符

    | | private | default | protected | public | | —- | —- | —- | —- | —- | | 本类中 | √ | √ | √ | √ | | 本包下的其他类中 | × | √ | √ | √ | | 其他包下的类中 | × | × | × | √ | | 其他包下的子类中 | × | × | √ | √ |