接口:
接口的语法:组成部分与抽象类相似,用interface关键字定义,里面只有公开静态常量(final修饰)和公开抽象方法,使用时用implements,没有构造方法,没有动态代码块和静态代码块
接口的微观概念:是一种能力和约定
接口的意义:当父类的方法种类无法满足子类需求的时候,可以通过实现接口来扩充子类的能力
接口引用仅可以调用接口中所声明的方法,不可以调用实现类中独有的方法(可强转回实现类本身类型,再调用独有的方法)
接口与接口之间可以多继承,类与接口之间也可以多实现,调用接口之后实现方法要记得加public(与接口方法属性类型一致)
接口回调:现有接口的使用者,再有接口的实现者
接口的好处:1)程序的耦合度降低 2)更自然的使用多态 3)设计与实现完全分离 4)更容易搭建程序框架 5)更容易更换具体实现
ps:MyInterface mi = new MyClass(); 同父类引用只能调用父类的属性方法,或者是子类覆盖的方法 ,不可调用子类独有的属性和方法
三个修饰符:
final:不可被继承,不可更改,不能被覆盖,所有被final修饰的变量只能赋值一次,可以先声明再赋值(注意如果使用的时候,不要出现在有默认值的情况,比如作为实例变量的时候)
abstract:只有方法声明,没有方法实现(需要包含在抽象类中),即抽象方法不能有主题,能修饰类和方法,但是不能修饰属性,抽象父类可以作为子类引用,此类不能被new对象,但可以声明引用
abstract的两个作用: 1)可以被子类继承,提供共性属性和方法 2)可声明为引用,强制使子类用多态
static:静态属性是整个类共同持有的共享空间(一份),任何对象修改,都会影响其他对象;静态方法可以通过“类名.静态方法”进行访问,直接访问,无需创建对象;
实例属性属于对象,静态属于类,静态方法允许直接访问静态成员,静态方法中不能使用this,super关键字,静态方法可以继承但没有多态
静态属性会在首次类加载的时候执行一次(仅一次)
static的五种可以修饰的元素分别为:属性,方法,代码块,类,导包
几种常量的赋值机会
实例常量:显示初始化,动态代码块,构造方法
静态常量:显示初始化,静态代码块
局部常量:显示初始化
类加载:
Jvm(java虚拟机)首次使用某个类时,需要通过CLASSPATH查找该类的.class文件,将.class文件中对类的描述信息加载到内存中进行保存
类加载时的执行顺序为:静态属性,静态代码块,动态代码块,构造函数
当创建子类对象时,子父类的类加载的执行顺序是:
父类--静态变量——父类--静态初始化块——子类--静态变量——子类--静态初始化块
父类--变量——父类--初始化块——父类--构造器——子类--变量——子类--初始化块——子类--构造器
多态:
多态的语法/定义:父类引用指向子类对象
两种应用场景: 1)使用父类作为方法形参 2)使用子类作为返回值
多态的好处: 1)屏蔽子类间的差异 2)灵活,耦合性低
父类引用仅可调用父类所声明的属性和方法,不可调用子类的属性和方法,当构成多态后,可以通过子类的方法重写/覆盖而调用子类的方法
向上转型:子类对象转为父类对象
向下转型:父类对象转为子类对象(使用instanceOf进行判断是属于某类对象)
继承:
程序中的继承是类与类之间的赠与或获得;继承可以提高代码的复用性和可扩展性,java为单继承,但是可以多级继承;
父类的抽象:在一组相同或类似的对象中,抽取其共性部分,定义在父类中,实现重用
构造方法只负责创建本类对象,不能被继承;super()在子类的每个构造方法内都隐式存在
在实际开发中,如果要争强某个类中的一个方法的功能,可以继承这个类,然后覆盖这个类的方法,在覆盖时,可以利用super关键字调用父类中的实现,然后在父类实现的基础上,增加子类特有的新功能
封装:
尽可能隐藏对象的内部实现细节,控制对象的修改及访问权限,访问修饰符:private
this用法: 1)调用实例属性,实例方法 2)调用本类中的其他构造方法
对象的创建流程: 1)开辟空间 2)为各个属性赋初始值 3)执行构造方法中的代码 4)[将对象的地址赋值给变量]
面向对象:
一切客观存在的事物都是对象,万物皆对象;任何对象都有自己的特征和行为
对象: 1)特征,称为属性,代表对象有什么 2)行为,称为方法,代表对象能做什么
类的抽取:在一组相同或类似的对象中,抽取其共性的行为特征,保留我们所关注的部分
类:定义了对象应具有的属性和行为,类是对象的模板
对象:拥有多个特征和行为的实体,对象是类的实例
实例变量是有默认值的;系统默认提供无参构造方法,也就是说如果有有参构造方法,那么系统便不会再提供无参构造方法
重载:一个类中定义多种重名的方法;好处之一是:屏蔽使用差异
引用:
引用相当于一个指针,指向了内存中的对象
构造方法是比较特殊的方法:
1)构造方法没有返回值类型(void也不行)
2)构造方法的方法名和类名相同
3)构造方法不能手动调用,只能在对象创建时自动调用(但是在我们后来学完关键字的时候,可以调用)
实例变量的各种类型的默认值: 字符:\u0000 引用类型:null boolean:false
打印引用类型或者对象数据类型的变量的时候,输出的是地址
引用数据类型和对象数据类型用“==”的时候,比较的是地址,所以字符串内容比较的时候用equals函数
函数:
定义:实现特定功能的一段代码块,可重复使用,在需要执行函数代码的位置通过函数名称进行调用
形参相当于一个局部变量,实现是为局部变量的赋值,无法通过函数调用转换参数的类型
其他:
在switch里,default如果不是写在最结尾的话,也要写break,要不然也会按顺序执行以下default下边的一个操作
JDK1.7之后,才可以在switch里使用字符等其他类型
递归:从大到小,从宏观到微观,每一次函数的调用,解决的是相同的问题,因参数的不同,导致每次调用细节发生变化
数组与循环:
循环分为四个部分:初始部分,循环条件,循环操作,迭代部分
多层循环里面要记得给i,j,k每次循环的时候重新赋值为0一下(看情况)
数组定义:一组连续的存储空间,存储多个相同类型的值
数组复制的方式暂时有4种:
1)循环将原数组中的所有元素逐一赋值给新数组
2)System.arraycopy(原数组,原数组起始,新数组,新数组起始,长度)
3)java.util.Arrays.copyOf(原数组,新长度)//返回值是带有原值的新数组
4)数组是一个引用类型,所以可以使用地址的替换的方式进行赋值
所有能用循环解决的问题,递归都能解决,能用递归解决的问题,循环也都能解决
outer:for(...){…… coutinue outer;//会从outer处开始下次循环}
数据类型:
i= i+1与i+=1的区别是,第一个会转型,往上升到int类型,第二种方式会固定类型,超出范围的时候会循环
字符遇见“+”是先转化为ASCII码再进行相加,字符串遇见“+”的时候为拼接,但是注意的是,加号两端必须有一段为字符串类型的时候才能出发toString方法
小数的默认类型是double,在计算过程中没int,均为type或short,计算结果仍提升为int
数据类型分为基本数据类型和引用数据类型
变量:变量是计算机内存中的一块存储空间,是存储数据的基本单元
JVM使用solt槽来临时存储数据,solt最大不超过32位也就是说不超过int类型(4字节,32位)
0的ASCII码是48,A的是65,a的是97
由于float与double类型都是属于不精确类型所以在计算的时候会得到一些不精确的答案
比如:System.out.println(1.0-0.9);输出的答案却是0.09999999999999998
这个时候,我们可以使用一种新的方法去精确答案 BigDecimal System.out.println(new BigDecimal(1.0-0.9).floatValue()); 这样得到的答案是0.1
命名规范:
cn.com.company.department.group.project.module.Xxxclass