《java面向对象编程》(Java面向对象(详细讲解))java教程 / Java面向对象编程实战...

wufei123 发布于 2024-02-17 阅读(68)

2.1. 类和对象2.1.1. 面向对象和面向过程的区别面向过程 :面向过程性能比面向对象高 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发。

但是,面向过程没有面向对象易维护、易复用、易扩展面向对象 :面向对象易维护、易复用、易扩展 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护但是,面向对象性能比面向过程低。

2.1.1. 构造器 Constructor 是否可被 override?Constructor 不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况。

2.1.2. 在 Java 中定义一个不做事且没有参数的构造方法的作用Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。

解决办法是在父类里加上一个不做事且没有参数的构造方法2.1.3. 成员变量与局部变量的区别有哪些?1. 从语法形式上看:成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员 变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 nal 所修饰。

2. 从变量在内存中的存储方式来看:如果成员变量是使用static 修饰的,那么这个成员变量是属于类的,如果没有使用static 修饰,这个成员变量是属于实例的而对象存在于堆内存,局部变量则存在于栈内存。

3. 从变量在内存中的生存时间上看:成员变量是对象的一部分,它随着对象的创建而存在,而局部变 量随着方法的调用而自动消失4. 成员变量如果没有被赋初值:则会自动以类型的默认值而赋值(一种情况例外:被 nal 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。

2.1.4. 创建一个对象用什么运算符?对象实体与对象引用有何不同?new 运算符,new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球); 一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)。

2.1.5. 一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?主要作用是完成对类对象的初始化工作可以执行因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。

如果我们自己添加了类的构造方法(无论是否有参),Java 就不会再添加默认的无参数的构造方法了,这时候,就不能直接 new 一个对象而不传递参数了,所以我们一直在不知不觉地使用构造方法,这也是为什么我们在创建对象的时候后面要加一个括号(因为要调用无参的构造方法)。

如果我们重载了有参的构造方法,记得都要把无参的构造方法也写出来(无论是否用到),因为 这可以帮助我们在创建对象的时候少踩坑2.1.6. 构造方法有哪些特性?1. 名字与类名相同2. 没有返回值,但不能用 void 声明构造函数。

3. 生成类的对象时自动执行,无需调用2.1.7. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?帮助子类做初始化工作2.1.8. 对象的相等与指向他们的引用相等,两者有什么不同?对象的相等,比的是内存中存放的内容是否相等。

而引用相等,比较的是他们指向的内存地址是否相等2.2. 面向对象三大特征2.2.1. 封装封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部 信息但是可以提供一些可以被外界访问的方法来操作属性。

就好像我们看不到挂在墙上的空调的内部的零件信息(也就是属性),但是可以通过遥控器(方法)来控制空调如果属性不想被外界访问,我们大可不必提供方法给外界访问但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。

就好像如果没有空调遥控器,那么我们就无法操控空调制冷,空调本身就没有意义了(当然现在还有很多其他方法 ,这里只是为了举例子)

2.2.2. 继承不同类型的对象,相互之间经常有一定数量的共同点例如,小明同学、小红同学、小李同学,都共享学生的特性(班级、学号等)同时,每一个对象还定义了额外的特性使得他们与众不同例如小明的 数学比较好,小红的性格惹人喜爱;小李的力气比较大。

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新 类的时间 ,提高我们的开发效率。

关于继承如下 3 点请记住:

2.2.3. 多态多态,顾名思义,表示一个对象具有多种的状态具体表现为父类的引用指向子类的实例多态的特点:对象类型和引用类型之间具有继承(类)/实现(接口)的关系;对象类型不可变,引用类型可变;方法具有多态性,属性不具有多态性;。

引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定; 多态不能调用“只在子类存在但在父类不存在”的方法;如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。

2.3. 修饰符2.3.1. 在一个静态方法内调用一个非静态成员为什么是非法的?由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员2.3.2. 静态方法和实例方法有何不同。

1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式而 实例方法只有后面这种方式也就是说,调用静态方法可以无需创建对象2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

2.4. 接口和抽象类2.4.1. 接口和抽象类的区别是什么?1. 接口的方法默认是 public,所有方法在接口中不能有实现( Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法2. 接口中除了 static、nal 变量,不能有其他变量,而抽象类中则不一定。

3. 一个类可以实现多个接口,但只能实现一个抽象类接口自己本身可以通过 extends 关键字扩展多个接口4. 接口方法默认修饰符是 public,抽象方法可以有 public、protected 和 default 这些修饰符(抽象方法就是为了被重写所以不能使用 private 关键字修饰!)。

5. 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。备注:

1. 在 jdk 7 或更早版本中,接口里面只能有常量变量和抽象方法这些接口方法必须由选择实现接口的类实现2. jdk8 的时候接口可以有默认方法和静态方法功能3. Jdk 9 在接口中引入了私有方法和私有静态方法。

2.5. 其它重要知识点2.5.1. String StringBuer 和 StringBuilder 的区别是什么? String 为什么是不可变的?

线程安全性

性能

对于三者使用的总结:1. 操作少量的数据: 适用String2. 单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder3. 多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer

2.5.1. Object 类的常见方法总结Object 类是一个特殊的类,是所有类的父类。它主要提供了以下 11 个方法:

2.5.2. == 与 equals(重要)== : 它的作用是判断两个对象的地址是不是相等即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)equals() : 它的作用也是判断两个对象是否相等。

但它一般有两种使用情况:

举个例子:

说明:

2.5.3. hashCode 与 equals (重要)面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写 equals 时必须重写 hashCode 方法?”2.5.4. hashCode()介绍

2.5.4.1. 为什么要有 hashCode我们先以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode: 当你把对象加入 HashSet时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与该位置其他已经加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。

但是如果发现有相同 hashcode 值的对象,这时会调用 equals() 方法来检查 hashcode 相等的对象是否真的相同如果两者相同,HashSet 就不会让其加入操作成功如果不同的话,就会重新散列到其他位置。

(摘自我的 Java 启蒙书《Head rst java》第二版)这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度通过我们可以看出: hashCode() 的作用就是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。

这个哈希码的作用是确定该对象在哈希表中的索引位置 hashCode() 在散列表中才有用,在其它情况下没用在散列表中 hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置2.5.4.2. hashCode()与 equals()的相关规定

1. 如果两个对象相等,则 hashcode 一定也是相同的2. 两个对象相等,对两个对象分别调用 equals 方法都返回 true3. 两个对象有相同的 hashcode 值,它们也不一定是相等的4. 因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖

5. hashCode() 的默认行为是对堆上的对象产生独特值如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)2.5.4. Java 序列化中如果有些字段不想进行序列化,怎么办?。

对于不想进行序列化的变量,使用 transient 关键字修饰transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时, 被 transient 修饰的变量值不会被持久化和恢复。

transient 只能修饰变量,不能修饰类和方法2.5.5. 获取用键盘输入常用的两种方法方法 1:通过 Scanner

方法 2:通过 BueredReader

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻4086