优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点: 没有面向对象易维护、不易复用、不易扩展
优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点: 性能比面向过程低(性能: 执行程序所耗费时间)
实际的应用场景:
面向对象(三大特点: 封装,继承,多态);
平台无关性( 不同平台(操作系统),不同的操作系统,安装的虚拟机不一样(解释和执行class文件));
可靠性;
安全性;
支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
自定义线程的方式有几种?
自定义线程池的方式有几种?
支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便,
比如:Socket, JavaFX网络编程框架(面试的强点比如: 美团,滴滴等),这里我有个项目,学习资料);
编译与解释并存;
字符: 比如: char a = ‘a’; 在内存中占2个字节,char基本类型
字符串: 比如: String str=“abvvv”; 在内存中根据字符串的长度去判断占多少字节,String是引用类型
* 重写: 子类(子接口 )重写 父类(父接口)的方法
* 重载: 在类中,方法名称必须相同,方法的参数个数,参数类型不同, 与返回值无关
* 构造器 Constructor 不可以被重写
封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。
关于继承如下 3 点请记住:
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
比如: 父接口 f = new 子类(); 父类 f = new 子类();
在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。
原因: 静态的优先于非静态的加载. 在静态方法里面不能调用非静态的成员变量
1. 接口可以多实现, 抽象类只能单继承
2. 抽象类可以有非抽象方法, 接口里面(jdk8之前)都是抽象方法
3. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法
4. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定
5. 一个类可以实现多个接口,但最多只能实现一个抽象类
6. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定
7. 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰;
从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存
从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。
成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被 final 修饰但没有被 static 修饰的成员变量必须显示地赋值);而局部变量则不会自动赋值。
*特点: 对象在堆里面存储, 对象的地址引用在栈里面存储
对象的相等,比的是内存中存放的内容是否相等。而引用相等,比较的是他们指向的内存地址是否相等。
总结:
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型比较的是值,引用数据类型比较的是内存地址(对象的地址引用))
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
public class test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false,非同一对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");
}
}
}