三种排序算法
冒泡排序 - 选择排序 - 插入排序
二维数组
一个数组中的元素还是数组方法的值传递机制
可变参数方法
可以是[0-n]个参数要放在末尾传进方法后 可以当做数组处理方法的重载
在同一个类中,方法名相同、参数不同(数量、类型、顺序)的方法为重载类和对象
封装
将属性的修饰符改为private提供属性的get/set方法构造器(重载的运用)
类中默认有一个无参构造器 当自己编写构造器后 这个构造器自动失效DeBug调试
继承
子类会继承父类private以外的方法和属性this关键字和super关键字可以结合记忆 但是其本质是不同的 this关键字代表的是当前对象 super关键字代表的是父类 是一个关键字
syso中直接写引用数据类型时,调用的是它的toString方法
子父类知识点
父类引用子类对象 父类引用调用子类重写过的方法时 编译上还指向父类的方法 但实际上执行时执行的是子类重写过的方法
父类构造器中调用子类构造器重写后的方法(子类构造器调用父类构造器) 创建子类对象时 调用的是子类重写后的方法
和子类调用getClass() 方法原理相同 返回的是子类的东西 就算是Parent parent = new Child() parent.getClass() 结果也是Child多态的运用 在编译时认为是父类类型的变量 但是在实际运行时认为是子类的对象
等号左侧是编译时数据类型 右侧是运行时数据类型向上转型hashCode( )是将实际的地址只经过hash转换为一个虚拟的地址值 可以重写
重写后的hashCode( )方法可以将两个对象展现出来的值(toString)相同 但是实际上它们任然存放在不同的地址上
重写hashCode( ) 方法实际上是为了equals( )方法服务的 因为规定equals的两个对象hashCode必须相同(尽管他们实际存放的地址可能不同) String的equals和hashCode方法都进行了重写
若不重写equals方法 直接调用对象的equals方法的话,调用的是从Object类继承下来的equals方法 用的是"" 而""比较的是两个对象的地址值 用来比较基本数据类型可以 但是我们将两个类型相同、属性也相同的两个对象称作相等的对象,这个时候,Object中的equals方法() 就不能满足我们的需求,所以需要重写equals方法
重写equals方法的步骤
重写hashCode
判断是否==
判断obj是否为null
不为空的话 判断类型是否可转
类型可转的话 判断属性是否相同
重写的equals方法只需要判断传进对象是否为null而不需要判断this,因为this对象能.equals必不是null
判断类型是否可转要用instanceof(向下转型前的判断)(向上转型不需要判断)他可以判断某变量在实际存储是否有要查询类的数值(多态)(因为传进来的都转成了Object 但实际上存储空间还是之前的)
自动装箱和自动拆箱
除int --> Integer char --> Charcter 外 其余均为基本数据类型的首字母大写代码块
构造器 属性(静态) 属性的隐/显式初始化、代码块(静态) 方法 执行的顺序: 所有静态变量隐式初始化 --> 父类静态变量显式初始化/父类静态代码块 -->子类静态变量显式初始化/子类静态代码块 -->所有非静态变量的隐式初始化 --> 父类(显式初始化/代码块、构造器) --> 子类(显式初始化/代码块、构造器) --> 方法其中:静态指只会加载一次 非静态的每new一次对象执行一次 方法可以执行多次显式初始化和代码块(多个) 按从上到下的顺序执行开辟空间(隐式初始化) 最先包
包的命名规则 以个人或者组织命名:org.域名.[项目简称].模块一公司域名命名:com.域名.[项目简称].模块 工程中的分包 entity包中放实体类(只有属性、及对应的get/set方法、toString、equals、hashCode等方法(均是为属性服务的))manage包中放业务类操作、管理实体类的一些方法view包中放视图 包的使用:导包(只能指定某个类导入) 要想导入一个包下面的多个类可以使用*Java.lang包为自动导入的不填包名的包为默认包,default 它能调用别的包的类 但是别的包不能调用默认包中的类修饰符
访问修饰符
publicprotecteddefaultprivate非访问修饰符
staticfinalabstractsynchronized(同步)native(本地 放的是c/c++代码 不在编译器中展现)private和protected不能用来修饰类
局部变量不能添加访问修饰符
子类重写父类方法要遵循两同一大两小原则
两同:方法名、参数列表同一大:子类权限修饰符大于等于父类两小:子类返回值类型和抛出的异常要小于父类特别注意的是:覆盖的方法和被覆盖的方法 要么都是类方法(静态) 要么都是实例方法(非静态) 不能一个是类方法一个是实例方法 编译会报错 从上到下为public protected default private类和类之间的关系
泛化 父类引用子类对象依赖 数据类型作为一个类中方法的一个参数类型关联 一个数据类型是一个类的属性类型聚合 与关联无代码上的区别 是理解上的区别抽象类
有抽象方法的类必为抽象类抽象类有构造器但是不能实例化抽象类被继承后 子类只能为抽象类或者实现父类中所有抽象方法一个抽象类中可以没有抽象方法抽象方法没有方法体抽象方法 private、final、static 都是因为不能继承/不能重写从而不能和abstract一起用内部类
在编译后的class文件中 外部类和内部类分为两个字节码文件 内部列名为:外部类$内部类.class
匿名内部类也可以叫匿名子类
匿名内部类用完以后要加分号
内部类也可以声明在方法中
创建内部类的实例对象
在外部类的内部 直接new在外部类的外面 内部类对象.new 内部类名([参数列表])静态:new 外部类名.内部类名单例设计模式
将构造器私有化创建一个静态私有属性 类型为本类对外提供一个get方法 返回同一个当前类的对象懒汉式vs饿汉式 懒汉式是使用时在创建对象(有线程危机)饿汉式是在声明静态属性是就新建了对象单一职责
只干自己负责的事Java中的分层结构:上级可以调用下级 下级不能调用上级 上级传值并调用下级后 下级职能将处理结果返还给上级
final可以修饰 类 属性 方法 局部变量
final修饰方法时 方法不能被重写 修饰类时 类不能被继承
修饰属性时,必须显性赋值一次(声明属性,构造代码块,构造器中:如果有多个构造器时,每个构造器中都要进行赋值),后期不能进行改变(栈值不能改变)。
final修饰的变量的栈值不能改变,若final修饰的是数组,则数组中的内容是可变的
静态常量 static final