接口和抽象类的区别:
- 接口和抽象类都不能被实例化
- 实现接口或者继承抽象类的普通子类都必须实现抽象方法,抽象类不用
- 抽象类可以包含普通方法和代码块,接口只能包含公开静态的抽象方法,
- 抽象类可以有构造方法,接口没有
- 抽象类中的成员变量可以是各种类型,抽象类中的成员变量只能是 公开静态常量
- 接口可以多继承,普通抽象类不可以
面向对象三大特征:
- 封装 作用:提高代码的安全性
1、将属性私有化,并提供对外界的接口(get/set方法)。
2、用private修饰的属性和方法,只能在本类中使用。 - 继承作用:提高代码的复用性,减少重复代码
1、子类可以继承父类非私有的属性和方法,不能继承构造方法和私有的属性和方法。
2、可以综合子类的共同特征来去提炼父亲的类。
3、子类在继承父类的各种属性和方法时,也可以有自己的属性和方法。
4、一个子类只能有一个父类,java只能单继承,不能多继承,因为多个类中的方法名相同,方法体不同,不知使用哪个。
5、一个类继承最顶端叫做基类或者超类,所有的超类叫做object 。
6、在继承关系中,如果父类没有无参数的构造方法,如何解决?
1.子类中添加一个和父类构造方法参数列表相同的构造方法,通过super参数传递给父类的构造方法
2.如果父类允许修改的时候,可以在父类中创建一个无参的构造方法
7、在继承关系中,代码块的执行顺序:父静>子静>父构造代码块>父构造方法>子构造代码块>子构造方法 - 多态1.分类
编译时多态:在编译过程中察觉的多态,重载,向上转型。
运行时多态:在运行过程中察觉的多态,向下转型。
2.向上转型、向下转型是在继承关系中,向下转型必须在向上转型的基之上。
3.在继承关系中,父类的对象可以指向子类的实例,父类引用实体方法的时候,是调用子类重写以后的方法。
4.向上转型
父类的引用指向子类的实体
父类类名 对象名=new 子类类();
优点:减少重复代码,提高代码的复用性
缺点:父类的引用无法调用子类特有的属性和方法
解决方案:向下转型
5.向下转型:
子类对象的父类引用赋给子类
子类类名 对象名=(子类类名)父类对象;
6. instanceof 判断左边的对象是否属于右边的类 对象名 instanceof 类名(子类类名)
7.匿名对象
new 类名()只有堆空间,没有栈空间,只能属于一次,为了节省代码。
重载和重写区别:
- 重载发生子啊一个类中, 是一个类中多个方法,方法名相同,形参列表必须不同,返回值类型和修饰符可以不同也可以相同
- 重写发生在继承关系中,子类重写的父类方法要求和父类 方法名、形参列表、返回值类型都相同,方法体不同,权限修饰符要大于父类方法。
== 和 equals 的区别:
== 比较基本数据类型时,比较的是实际的值。 比较引用数据类型时 比较的是在内存中的地址
equals 是Object 类中的方法,本质上和 == 一样,但是在重写后可以用于比较值,常见 String 类中就重写了 Equals 方法,可以直接比较值。重写 equals 也必须重写 hashCode()
异常处理机制:
- 使用 try cat
- ch finally 捕获异常,finally 中的代码一定会执行,捕获异常后程序会继续执行
- 使用 throws 声明方法中可能会抛出的异常,但是在方法被调用时依旧会面对捕获 / 声明问题。
反射:
- 定义:通过获取类的class对象,然后动态获取类的内部结构,动态的操作类得到属性和方法
- 获取class对象的方式: class.forName(), ;类名.class,对象的getClass()
- getFiled() 获取蓓蕾和父类中可以被访问的属性对象
- getDeclaredField() 获取本类中所有属性的属性对象
- getMethods 获取本类和父类中可以被访问的方法对象
- newInstence方法创建对象 , getConstructor().newInstance()创建对象
- 使用 set 或者 get 方法为指定属性进行赋值
- 通过反射获取到的
- 通过inoke()方法执行
String和StringBuffuer、StringBuilder的区别:
- String:字符串数值不可变,拼接字符串时候会产生很多无用的中间对象,频繁拼接操作会对性能有所影响。
- StringBuffer 就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类。底层数组可边长,它提供了 append 和 add 方法,可以将字符串添加到已有序列的末尾或指定位置。此外,StringBuffur通过使用synchronized 来保证线程安全,可以确保在同一时刻只有一个线程可以访问 StringBuffer 的方法它的本质是一个线程安全的可修改的字符序列。
- StringBuilder: JDK1.5 发布的,它和 StringBuffer 本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。
- 三者在执行速度方面的比较:StringBuilder > StringBuffer > String
对于三者使用的总结:
1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区下操作大量数据 = StringBuffer
break 和 continue的区别?
- break跳出某个循环
- continue跳过某个循环
关键字:this、super、final
this 和 super 区别
- this 指的是本类创建的对象, super是代指父类的对象
- this 和 super 都可以本类中的属性、方法、构造方法
- this,在执行调用时会优先在本类中寻找,本类中没有 去父类中寻找
- this 和 super 在调用构造方法时都必须放在方法第一行
- this 和 super 不能同时使用
final 关键字:
- final 可以用于修饰全局变量,声明时赋值,只能赋值一次
- final 修饰局部变量,声明时可以不赋值,到那时后续只能赋值一次
- final 修饰的方法 不能被重写
- final 修饰的类 不能被继承
- static final 修饰的全局变量 需要全部大写
装箱和拆箱:
装箱:把基本数据类型装成包装类型
拆箱:把包装类型转成基本数据类型
八种基本数据类型:int、short、long、byte、float、double、boolean、char;
对应的封装类:Integer、Short、Long、Byte、Float、Double、Boolean、Character。
Integer 中的常见方法:
campareTo 比较大小,大于返回整数,小于返回负数,相等返回0
toString():将int 类型数据 转成String 字符串
Integer.valueOf() :将int 转换成 integer 类型数据
parseInt():将Integer转成int
String类 在new String时会创建几个对象:
- 在程序运行时,根据已经加载的系统类String 会在堆内存中实例化一个字符串对象,
- 然后jvm会拿着值取字符串常量吃中获取对应的 String对象引用,如果拿不到,就会在堆内存中重新创建一个对应值的String 类型对象,并将引用放在字符串常量池中。
字符串常量池是在运行时常量池中: 在jvm方法区。
String 类常用方法:
.equals() 比较内容
.equalsIgnoreCase() 忽略大小写比较是否相同
.charAt(); 字符串截取出指定的下标开始
.compareTo() 比较大小
.compareToIgnore() 忽略大小比较
.concat() 将参数字符串连接到指定字符串后面
.contains() 是否包含参数字符串
.startsWith() 以指定前缀开头
.endsWith() 以指定后缀结尾
.indexOf("/") 第一次出现
.indexOf("/", 3) 指定位置开始索引
.lastIndexOf("/") 最后一次出现
.substring(string11.lastIndexOf("/")+1);截取指定位置
.substring(string11.lastIndexOf("/")+1, string11.lastIndexOf("."));//截取字符串,指定开始位置和结束位置
.replace('a', 'b') 替换指定字符串,替换所有的
.toUpperCase() 全部转为大写
.toLowerCase() 全部转成小写