一、面向对象的三大特征
封装(Private)
把一个对象的属性私有化,同时提供一些外界访问的属性的方法。
继承(Extends)
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。
关于继承需要注意以下几点:
1.子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。
2.子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
3.子类可以用自己的方式实现父类方法。
4.在Java中类的继承是单一继承。this:调用自己的方法。super:调用父类的方法。final:把类定义为不能继承的最终类。
5.使用implements关键字可以变相的使java具有多继承的特性,使用范围为类集成接口的情况,可以同时继承多个接口。
6.子类不继承父类的构造器,只是调用(显式或隐式)。
多态(Polymorphism)
多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。
在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。
二、抽象类和接口的区别
1.接口的方法默认是public,所有方法在接口中不能有实现,而抽象类可以有非抽象的方法。
2.接口中除了static、final变量,不能有其他变量,而抽象类中则不一定。
3.一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过extends关键字扩展多个接口。
4.接口方法默认修饰符是public,抽象方法可以有public、protected和default这些修饰符(抽象方法就是为了被重写所以不能使用private关键字修饰)。
5.从设计层面,抽象是对类的抽象,接口是对行为的抽象。
6.抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
三、String为什么是不可变的?
String是由final修饰的类 private final char value[ ];
StringBuilder和StringBuffer都继承自AbstractStringBuilder类,使用的字符数组保存字符串,所以可变。 char[ ] value;
四、String|StringBuffer|StringBuilder区别
1.运行速度:StringBuilder>StringBuffer>String
String最慢的原因:String为字符串常量。(String创建的对象不可更改) Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
StringBuilder和StringBuffer快的原因:StringBuilder和StringBuffer均为字符串变量。(StringBuilder和StringBuffer的对象是变量,可以更改)对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以要比String快很多。StringBuilder仅比StringBuffer提升10%-15%的性能。
如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
2.线程安全:String和StringBuffer线程安全 StringBuilder非线程安全
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
StringBuilder没有对方法进行加同步锁,所以是非线程安全的。
3.总结
1.操作少量的数据用String。
2.单线程在字符串缓冲区下操作大量数据用StringBuilder。
3.多线程在字符串缓冲区下操作大量数据用StringBuffer。
五、成员变量和局部变量的区别
1.成员变量是属于类的,局部变量实在方法中定义的变量或是方法的参数。
2.成员变量可以被public,private,static等修饰符修饰,局部变量不能被访问控制修饰符及static修饰。
3.成员变量和局部变量都能被final所修饰。
4.成员变量是对象的一部分,随着对象的创建而存在,局部变量随着方法的调用而自动消失。
5.成员变量存在于堆内存,局部变量则存在于栈内存。
6.成员变量会自动以类型的默认值而赋值,局部变量不会自动赋值。
六、==与equals
1.==判断两个对象的地址是否相等。(基本数据类型比较的是值;引用数据类型比较的是内存地址)
2.equals( )判断两个对象的内容是否相等。(object 的 equals 方法是比较的对象的内存地址;String 的 equals 方法比较的是对象的值。)
七、静态代码块|构造代码块|构造函数|普通代码块|执行顺序
1.静态代码块
在Java类中使用static关键字和{}生命的代码块。
2.构造代码块
在Java类中使用{}声明的代码块。
3.构造函数
构造函数的命名必须和类名相同。
功能主要用于在类的对象创建时定义初始化的状态。
构造函数必须通过new对象时才会自动调用,一般的方法是在程序执行到它的时候被调用。
4.普通代码块
在方法体中定义。
5.执行顺序
静态代码块>构造代码块>构造函数>普通代码块
八、static|final|this|super关键字
1.static
static关键字修饰的都是静态的
2.final
final关键字可以用于修饰类、变量和方法。final修饰变量时,表示该变量一旦获得了初始值就不可被改变。
3.this
this关键字总是指向调用该方法的对象。this关键字最大的作用时让类中一个方法访问该类里的另一个方法或者field。this可以代表任何对象
用途:1.引用成员变量 2.在自身构造器方法中调用重载的构造方法 3.引用成员方法。this(参数):调用本类中另一种形式的构造函数。
注意:static修饰的方法不能使用this引用
4.super
super关键字用来引用离子类最近的一个父类。
用法:1.普通的直接引用2.子类中的成员变量或方法与父类中的成员变量或方法同名时需要使用super来显示调用父类的成员。3.引用构造函数。super(参数):调用父类中的某一个构造函数