Java面向对象

1、类和对象

1.1 面向对象和面向过程

性能:过程>对象
因为类调用需要实例化,开销、资源消耗比较大,当性能重要考量时,如单片机、嵌入式开发、Linux/Unix等采用面向过程。面向过程没有面向对象易维护、易复用、易扩展
易维护、易复用、易扩展:因为面向对象有封装、继承、多态性,可以设计出低耦合的系统,系统更灵活、易维护。

1.2 构造器Constructor是否可被override(重写)?

不能,但可以overload(重载),所以一个类可以有多个构造函数。

1.3 在Java中定义一个不做事且没有参数的构造方法的作用

执行子类的构造方法之前,若没有用super()调用父类特定的构造方法,则会调用父类没有参数的构造方法。因此,若父类中只定义了有参构造方法,而子类的构造方法中没有super()来调用父类中特定的构造方法,则编译错误。因为Java程序在父类中找不到没有参数的构造方法可供执行。

1.4 成员变量和局部变量

1、语法形式:成员变量属于类,局部变量是在方法中定义的变量或方法的参数;
成员变量可被public、private、static等修饰,局部变量不能被访问控制修饰符及static修饰;
都能被final修饰;
2、在内存中的存储方式:若成员变量是static修饰,则属于类,若没有用static修饰,则属于实例;
成员变量存在于堆内存,局部变量存在于栈内存;
3、在内存中的生存时间:成员变量是对象一部分,随对象创建而存在,局部变量随方法调用而消失;
4、成员变量若没被赋初值:则自动以类型的默认值赋值(例外:被final修饰的成员变量也必须显式地赋值),局部变量不会自动赋值。

1.5 创建一个对象用什么运算符?对象实体与对象引用的不同?

new运算符,对象实例在堆内存,对象引用指向对象实例,对象引用存在栈内存。
一个对象引用可指向0/1个对象;一个对象可有n个引用指向它。

1.6 一个类的构造方法的作用?若一个类没有构造方法,程序能正确执行吗?为什么?

作用:完成对类对象的初始化。
可以执行。
因为没有声明构造方法也会有默认的不带参数的构造方法。若自己添加类的构造方法,Java就不会再添加默认的无参构造方法了,就不能直接new一个对象而不传递参数了。也就是为什么在创建对象时后面要加一个括号。若重载了有参构造方法,记得都要把无参构造方法也写出来,无论是否用到。

1.7 构造方法的特性

1、名字与类名相同;
2、没有返回值,但不能用void声明构造函数;
3、生成类的对象时自动执行,无需调用。

1.8 在调用子类构造方法前会先调用父类无参构造方法的目的?

帮助子类做初始化工作。

1.9 对象的相等与指向它们的引用相等,两者的不同?

对象相等:比较内存中存放的内容是否相等;
引用相等:比较它们指向的内存地址是否相等。

2、面向对象三大特征

2.1 封装

把属性隐藏在对象内部,不允许外部对象直接访问内部信息,但可以提供一些可以被外界访问的方法来操作属性。如,看不到空调的内部零件,但可以通过遥控器来控制空调。

2.2 继承

使用已存在的类的定义作为计出建立新类,新类的定义可以添加新数据/新功能,也可用父类功能,但不能选择性继承父类。继承快速创建新类,提高代码重用、程序可维护性。
1、子类拥有父类对象所有属性和方法(包括私有),但父类的私有属性和方法子类无法访问,只是拥有;
2、子类可拥有自己的属性和方法,即对父类扩展;
3、子类可以用自己的方法实现父类的方法。

2.3 多态

一个对象有多种状态。具体表现:父类引用指向子类的实例。
特点:1、对象类型和引用类型之间具有继承(类)/实现(接口)的关系;
2、对象类型不可变,引用类型可变;
3、方法具有多态性,属性不具有;
4、引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
5、多态不能调用“只在子类存在但在父类不存在”的方法;
6、若子类重写父类方法,真正执行的是子类覆盖的方法;若子类没有覆盖父类方法,执行的是父类方法。

3、修饰符

3.1 在一个静态方法内调用一个非静态成员为什么是非法的?

因为静态方法可以不通过对象进行调用,所以静态方法内不能调用其他非静态变量,也不可以访问。

3.2 静态方法和实例方法的不同

1、外部调用静态方法时,可用“类名.方法名”或“对象名.方法名”;实例方法只有“对象名.方法名”。即调用静态方法可以无需创建对象;
2、静态方法在访问本类成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员和实例方法;实例方法则无限制。

3.3 关键字static、final、this、super

https://www.cnblogs.com/zhufeng123/p/12347753.html

4、接口和抽象类

4.1 接口和抽象类的区别

1、接口的方法默认是public,所有方法在接口不能有实现(Java 8开始可以有默认实现),抽象类可有非抽象方法;
2、接口中除了static、final变量,不能有其他变量,抽象类不一定;
3、一个类可以实现多个接口,但只能实现一个抽象类,接口本身可以通过extends扩展多个接口;
4、接口方法默认是public,抽象方法可有public、protected和default,但为了被重写不能使用private;
5、设计层上,抽象是对类的抽象,是一种模板设计,接口是对行为的抽象,是一种行为规范。
备注:jdk8中接口也可定义静态方法,可直接用接口名调用。实现类和实现不可以调用。若同时实现两个接口,接口中定义了一样的默认方法,则必须重写,不然报错;jdk9的接口允许定义私有方法。

5、其他知识点

5.1 String为什么不可变?

String类中使用final修饰字符数组来保存字符串,private final char value[],所以不可变。
Java9之后String的实现改用byte数组存储:private final byte[] value。

5.2 String、StringBuffer和StringBuilder的区别?

StringBuilder和StringBuffer继承自AbstractStringBuilder类,在AbstractStringBuilder中也使用字符数组保存字符串char[] value但没有用final修饰,所以可变。
StringBuilder和StringBuffer的构造方法均调用父类构造即AbstractStringBuilder实现。
线程安全性:
String不可变,可理解为常量,线程安全。StringBuffer对方法加了同步锁,线程安全。StringBuilder没有对方法加同步锁,非线程安全。
性能:
每次对String类型改变会生成一个新的String对象,然后将指针指向新的。StringBuffer对对象本身操作,而不是生成新的对象改变引用。相同情况下使用StringBuilder相比使用StringBuffer仅能性能提升一点,却要冒多线程不安全的风险。
总结:
1、操作少量的数据,String;
2、单线程操作字符串缓冲区下操作大量数据:StringBuilder;
3、多线程操作字符串缓冲区下操作大量数据:StringBuffer。

5.3 Object类的常见方法总结

P32

5.4 ==与equals(重要)

==:地址相等否,即是不是同一个对象(基本数据类型比较值,引用数据类型比较内存地址)
equals():两个对象是否相等。两种情况:
1、类没有覆盖equals():等价于= =;
2、类覆盖equals():对象内容相等否。
P33
说明:String中的equals()被重写过,比较的是对象值;创建String对象时,虚拟机会在常量池中查找有无已存在的值和要创建的值相同的对象,若有就赋给当前引用,若没有就创建。

5.5 hashCode与equals(重要)

P33

5.6 Java序列化中若有些字段不想进行序列化,怎么办?

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

5.7 获取用键盘输入常用的方法

1、Scanner
2、BufferedReader

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值