文章目录

  • 一、java基础
  • 二、面向对象基础
  • 1.封装
  • 2.继承
  • 细节分析
  • super关键字
  • 重写和重载的比较:
  • 3.多态
  • 对象的多态:
  • instanceOf :
  • 动态绑定机制
  • 多态数组
  • 多态参数
  • Object类
  • equals方法
  • hashCode方法
  • toString方法
  • finalize方法
  • 总结



一、java基础

Java写辅助 java fuzz_子类

1.自动类型转化:(精度小的可以自动转到精度高的)
char->int->long->float->double
byte->short->int->long->float->double
2.基本类型转String:直接+
String转基本类型:通过基本类型的包装类调用:int num1 =Integer.parseInt(s);
3.运算符:短路与&&,一个为FALSE,不判断另外的。逻辑与则相反。其他类推。
4.数组:动态初始化int [] arr=new int[5]
5.JVM内存分配机制:
栈: 一般存放基本数据类型(局部变量)
堆: 存放对象(Cat cat , 数组等)
方法区:常量池(常量,比如字符串), 类加载信息

6.对象创建流程分析:
(1)加载Person类信息,只会加载一次
(2)在堆中分配空间(地址)
(3)完成对象初始化(默认初始化,显示初始化,构造器的初始化)
(4)对象在堆中的地址返回给p

7.访问修饰符:

Java写辅助 java fuzz_开发语言_02

二、面向对象基础

1.封装

(1)将属性私有化(2)提供公有化set和get方法
//我们可以将 set 方法写在构造器中,这样仍然可以验证

public Person(String name, int age, double salary) {
setName(name);
setAge(age);
setSalary(salary);
}

2.继承

语法:class 子类 extends 父类{}

细节分析

(1)子类必须调用父类的构造器, 完成父类的初始化
(2)当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作
(3)super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)
(4)super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
(5)子类最多只能继承一个父类(单继承机制)
(6)查找属性的时候先从子类开始。如果子类没有,迭代向上找父类

super关键字

用于访问父类的属性、方法(private不行)、构造器

不限于父类,遵循就近原则。

super和this的比较:

Java写辅助 java fuzz_Java写辅助_03

重写和重载的比较:

Java写辅助 java fuzz_Java写辅助_04

3.多态

对象的多态:

编译类型看定义时=左边,运行类型看=右边。编译类型在定义对象时确定了,运行类型可以变化

Animal animal = new Dog()
animal = new Cat()

(此类型是向上转型)
向上转型:可以调用父类的所有成员,不能调用子类的特有成员,最终运行效果看子类的具体实现。

Cat cat = (Cat) animal

向下转型:子类类型 引用名 = (子类类型)父类引用。
可以调用子类中的所有成员

注:属性没有重写之说。属性的值看编译类型
方法看运行类型

instanceOf :

比较操作符,用于判断对象的运行类型是否为 XX 类型或 XX 类型的子类型

a instanceof B

动态绑定机制

1.当调用对象方法时,该方法会和该对象的运行类型绑定
2.当调用对象属性时,没有动态绑定机制。哪里声明,哪里使用。
P332

多态数组

示例代码

public class Polyarray {
    public static void main(String[] args) {
        Person[] persons = new Person[3];
        persons[0] = new Person("jack",20);
        persons[1] = new Student("bob",18,100);
        persons[2] = new Teacher("zhang",45,2000);

        for (int i = 0; i < persons.length; i++) {
            System.out.println(persons[i].say());
            if (persons[i] instanceof Student){
                ((Student) persons[i]).study();
            }
            if (persons[i] instanceof Teacher){
                ((Teacher) persons[i]).teach();
            }
        }
    }
}

多态参数

方法定义的形参类型为父类类型,实参类型允许为子类类型

Object类

equals方法

==:既可以判断基本类型,也可以判断引用类型相等(地址)
equals:只能判断引用类型。默认判断的是地址,但是子类往往重写,比如Integer,String(判断的是值,可以看源码)

hashCode方法

两个引用,如果指向的是同一个对象,则哈希值肯定是一样的。
哈希值根据地址号来,但不等价于地址。

toString方法

全类名+@+哈希值的十六进制
直接输出一个对象时,自动调用它的toString方法

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

finalize方法

当某个对象没有任何引用时,JVM会认为这个对象为垃圾对象,会用垃圾回收机制来销毁该对象,先调用finalize方法。


总结

由于是复习,因此此前忘了的或者不会的会详细写,已经理解了的会忽略或简写。此章主要针对于java基础和面向对象的初级阶段的复习。