1.概念
1.类对象
java用new来新建对象,它会存放在堆中
String
参考:https://www.cnblogs.com/yanggb/p/11613042.html
2.类和数组的区别
类是方法和变量的集合体
数组时相同类型的无序数据的集合
java 中数组属于一种原生类吗?不是,属于引用数据类型,因为声明数组需要分配堆栈空间
2.内部类
1.静态内部类
在定义的内部类前加static修饰符,此时的内部类就是静态内部类。
1.静态内部类中可以写哪些内容:
- 匿名代码块
- 静态代码块
- 静态变量和非静态变量
- 静态方法和非静态方法
注意:不能再静态内部类中写抽象方法
2、外部类如何调用静态内部类中的属性和方法
- 外部类可以通过创建静态内部类实例的方法来调用静态内部类的非静态属性和方法
- 外部类可以直接通过“外部类.内部类.属性(方法)”的方式直接调用静态内部类中的静态属性和方法
3.静态内部类如何调用外部类的属性和方法
- 静态内部类可以直接调用外部类的静态属性和方法
- 静态内部类可以通过创建外部类实例的方法调用外部类的非静态属性和方法
4.如何创建静态内部类实例
- 在非外部类中:外部类名.内部类名 name=new 外部类名.内部类名();
- 在外部类中,内部类名 name=new 外部类名();
参考:https://www.cnblogs.com/heavenplus/p/9451181.html
2.成员内部类
相当于类中的一个成员变量
总结:
1.成员内部类可以由public protected default private修饰
2.成员内部类是依赖于外部类的对象而存在的,在创建成员内部类的实例时,外部类的实例必须已经存在。
3.成员内部类可以包含哪些内容
- 匿名代码块
- 非静态属性
- 非静态方法
注意:成员内部类中不能有静态属性和方法,但可以有静态常量(即用static final修饰的属性),因为在类加载时会初始化static修饰的内容,而成员内部类必须依赖于内部类对象,即成员内部类要在外部类加载之后加载,所以不能包含静态的变量和方法。使用final修饰的静态变量类加载时会自动初始化其值,将其作为一个常量,所以可以出现在内部类中。
4.外部类访问内部类
外部类可以通过创建成员内部类实例来访问成员内部类中的属性和方法
5.成员内部类访问外部类
成员内部类可以直接访问外部类的所有属性和方法
注意:如果成员内部类B与外部类A包含同名的成员,那么在类B中,this.v表示类B的成员,A.this.v表示类A的成员
6.创建内部类实例的方法
- 在外部类中创建:外部类名 name =this.new 内部类名();
- 在非外部类中创建:外部类名.内部类名 name=new 外部类名().new 内部类名();
参考:https://www.cnblogs.com/heavenplus/p/9451511.html
3.局部内部类
- 概念
在方法和作用域内的内部类,成为局部内部类
匿名内部类就是一种局部内部类
- 匿名内部类
使用new生成的内部类
- 局部内部类 (包括匿名内部类)只能访问final修饰的外部变量
3.抽象类
1.概念
抽象类中可以没有抽象方法,但是抽象方法一定在抽象类中。因为抽象方法和抽象类一眼个,不能被实例化
接口不能实现接口
2.抽象类与接口的区别
都用于抽象,接口是对动作的抽象,抽象类是对根源的抽象
抽象类表示的是,这个对象是什么。多用于在同类事物中有无法具体描述的方法的场景,当父类与子类之间存在逻辑上的层次结构时使用
接口表示的是,这个对象能做什么,多于不同类之间,定义不同类之间的通信规则。
抽象类和接口不能被实例化,优先选用接口,尽量少用抽象类。
区别:
- 继承:接口可以多继承,抽象类不可。子类拥有父类所有的成员与方法,但private类型的子类无权调用。
- 实现:实现接口一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法。当子类为抽象类时,继承抽象类,可以实现抽象方法,也可以不实现。
- 定义:接口定义方法,不能实现(没有函数体),而抽象类可以实现部分方法。抽象类可以有构造方法,接口没有
- 数据类型:接口是公开的,里面不能有私有方法或变量是用于让别人使用的,而抽象类是可以有私有方法或私有变量的。接口中基本数据类型的成员,都默认为static和final(意味着在定义接口的时候,就要给这些变量赋值,且以后不能修改),抽象类则不是。
4.接口
1.概念
接口中只有常量定义,没有变量声明
如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
2.接口回调
1.概念
可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。
2.实现
最少也是需要三个类共同来完成这个回调机制。典型的例子是android按钮点击监听事件的接口回调。
a.创建一个接口A,规定执行的操作。
b.创建一个功能类B,比如这个类可以显示一个对话框、可以滑动菜单、可以下载数据等等。
c.在功能类B里面声明接口A的对象,创建要执行的方法,在这个方法里面为声明的接口对象赋值(传参获得值)。
d.在其他的类中使用这个功能类就可以了。
public interface OnClickListener {
//a.创建一个接口A
void onClick(View v);
}
//b.创建一个功能类B
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
//c.声明接口A的对象
protected OnClickListener mOnClickListener;
//c.创建要执行的方法,并为接口对象赋值
public void setOnClickListener(OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
mOnClickListener = l;
}
}
3.接口回调和向上转型的区别:
接口回调和向上转型是设计模式的解耦核心。两者实质相同,区别在于
如果a是类A的一个引用,那么,a可以指向类A的一个实例。或者说指向类A的一个子类,这是向上转型的情形。
如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。这是接口回调的情形。
5.类的加载
1.动态连接和静态解析
-
动态连接:在类运行期间才能确定某些目标方法的直接引用。
-
静态解析:在类加载阶段或第一次使用时转化为直接引用。
成立的前提是:方法在程序真正执行前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的。
被 invokestatic 和 invokespecial 指令调用的方法,都可以在解析阶段确定唯一的调用版本。
主要有:①静态方法;②私有方法;③实例构造器;④父类方法四类。这些方法可以称为非虚方法(还包括 final 方法),与之相反,其他方法就称为虚方法(final 方法除外)。
这里要特别说明下 final 方法,虽然调用 final 方法使用的是 invokevirtual 指令,但是由于它无法覆盖,没有其他版本,所以也无需对方发接收者进行多态选择。Java 语言规范中明确说明了 final 方法是一种非虚方法。
2.类加载器
java中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由java应用开发人员编写的。
6.Object类
1.概念
Object类是层次结构的根,所有类都继承这个类。
Object类是java语言中唯一没有父类的类
在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类。
对象的传输:使用ObjectOutputStream类完成对象存储,使用ObjectInputStream类完成对象读取
2.方法
- Object():默认构造方法
- clone():为对象A创建并返回一个副本对象B。
A与B是两个独立的对象,但B的初始值是由A对象确定的,B的创建只分配内存但不调用构造方法。
只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。 - equals(Object obj):指示某个其他对象是否与此对象“相等”。在Object中与==是一样的,子类一般需要重写该方法。
- finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
- getClass():final方法,返回一个对象的运行时类
- hashCode():返回该对象的哈希码值。
- toString():返回该对象的字符串表示。字符串格式固定:类名@hashcode,hashcode是一串数字,在java中叫句柄/(虚拟)地址,但是句柄不是内存地址。
7.对象的创建
1.new
2.clone()
步骤:
1.被克隆的类要实现Cloneable 接口。
2.被克隆的类要重写clone()方法。
浅负责:被复制对象所有变量都含有与原来对象相同的值,但不复制它引用的对象。
深复制:把复制的对象所引用的对象都复制了一遍。
3.反序列化java.io.ObjectInputStream对象的readObject()方法
8.Math类
- static double ceil(double a):返回>=a的min正数
- static double floor(double a):返回<=a的max正数,类型为double
- static double rint(double a):四舍五入,返回与a最相近的正数
- static long round(double a):四舍五入,返回与a最相近的长整型整数,将原来的数字加上0.5后再向下取整。
- static int round(float a):四舍五入,返回与a最相近的整形整数
参考:https://blog.youkuaiyun.com/SunshineTan/article/details/79626201
很大部分是从参考里面直接粘贴过来的