你必须知道的261个Java语言问题笔记- Java与面向对象

来源:互联网 发布:软件项目监理合同 编辑:程序博客网 时间:2024/05/14 18:15
什么是类、对象、属性和方法
类是对一类相同事物的抽象描述。对象是类的一个具体实现。
定义类的时候,类中可以包含属性和方法。属性是对一类相同特征的抽象,方法是对一类相同行为
的抽象。

什么是包?有什么好处?
包是存放Java程序的单元,可以将相关的Java程序放在同一个包中,便于程序的维护和管理。

什么是抽象类?有什么好处?
有abstract关键字修饰,允许包含未实现方法的类被称为抽象类。
注意:在抽象类中可以包含抽象方法,也可以不包含抽象方法。
抽象类不能实例化,即不能创建对象,只能作为父类用于被继承。
子类继承一个抽象类后,必须要实现父类中所有的抽象方法,否则子类也要定义为抽象类。
抽象类中可以包含抽象方法,也可以不包含抽象方法。
如果类中包含抽象方法,那么类必须定义成抽象类。
在设计模式中,有很多模式都是基于抽象类实现的,例如模块模式等。

什么是接口?有什么好处?
接口是方法声明和常量值定义的集合。
注意:由于接口中的属性属于常量定义,因此在定义属性时必须显示指定初始值,不能使用默认初始
化的形式。
接口在使用时,需要注意以下几点特性:
接口只包含方法声明和常量定义,即使定义普通属性,该属性在编译后也将变为常量。
当其他类实现该接口时,接口中定义的所有方法都要求全部实现,否则需要定义成抽象类。
一个类可以实现多个接口。
定义接口时可以使用继承,接口之间允许多继承。
注意:接口是方法声明和常量值定义的集合,不允许包含变量,接口之间允许多继承,类之间
只允许单继承。

什么是多态?有什么好处?
多态主要是指对象变量的多态。
注意:除了上述多态形式之外,一个接口类型变量也可以指向其实现类的实例,这也是多态的一种
表现。

什么是内部类?有什么好处?
定义在一个类内部的类被称为内部类。
内部类的概念是JDK1.1版本开始引入的,有优点主要有以下几点:
内部类对象能访问其所处类的私有属性和方法。
内部类能够隐藏起来,不被同一个包中的其他类访问。如果一个类只对某个类提供使用,那么可以
将其定义为内部类。
匿名内部类可以方便地用在回调方法中,典型应用是图形编程中的事件处理。内部类的特征主要有
以下几点:
内部类可以声明为抽象类,因此可以被其他的内部类继承,也可以声明为final的。
和外部类不同,内部类可以声明为private或protected,外部类只能用public和default.
内部类可以声明为static的,但此时就不能再使用外层封装类的非static的成员变量。
非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可以声明
static成员。
注意:类除了可以定义在类中与方法并列之外,还可以定义在方法的内部或者一个自由块中,
此时被称为局部内部类,只能在方法体或者自由块中使用。

什么是匿名内部类?如何使用
内部类可以在类中或方法中定义,匿名内部类是指在定义时没有名称的内部类,一般常见于方法中。
注意:匿名内部类的声明是在编译时进行的,实例化在运行时进行,这意思着在for循环中使用匿名
类时,new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。

什么是封装类?有什么作用?
封装类可以理解成8中简单类型的封装。

什么是继承?有什么好处?
继承是实现类重复利用的重要手段。
定义类时只能使用单继承,如果定义接口,则允许在extends后面跟多个接口名。
注意:在使用继承时,父类中private关键字修饰的属性和方法,子类是无法继承的,如果子类和
父类在不同的包下,default状态的属性和方法也无法继承。

使用new关键字创建对象时,为什么有时候提示找不到无参的构造方法
如果程序显示定义了构造方法后,编译器在编译时就不会自动添加无参构造方法。

抽象类和接口都可以包含抽象方法,那么它们有什么区别?使用时该如何选择
abstract用于定义抽象类,抽象类不能实例化,抽象类中既可以包含已实现的方法,也可以包含方法
定义,而不具体实现。
interface用于定义接口,接口只包含常量定义和方法定义。接口本身也是一种特殊的抽象类。
抽象类和接口的区别主要有以下几个方面:
1)定义格式不同
2)使用方式的不同
3)设计理念不同
抽象类用于继承,表示"is a"的关系,而接口用于实现,表示"like a"的关系。

什么是方法重写?为什么需要方法重写?
如果父类的方法不能满足子类的需求,则可以在子类中对父类的方法进行重写(或覆盖)。
在方法重写时,如果子类需要引用父类中原有的方法,可以使用super关键字。
当子类重写父类方法后,在子类对象使用该方法时,会执行子类中重写的方法。
在子类重写父类方法时,需要遵守以下几个重写规则:
重写方法名,参数和返回类型必须与父类方法定义一致;
重写方法的修饰符不能比父类方法严格;
重写方法如果有throws定义,那么重写方法throws的异常类型可以是父类方法throws的异常类型
及其子类类型。

什么是方法重载?为什么需要方法重载?
同一个类中不允许有两个相同定义的方法,因为编译器无法将方法调用和特定的方法联系起来。
但是允许在同一个类中具有多个方法名相同而参数列表不同的方法,这种形式被称为方法的重载。
方法重载的主要目的是为了简化API,降低使用复杂度,为使用者提供方便。
在进行方法重载时,需要遵守以下几个重载规则。
方法名相同;
参数列表必须不同;
返回值类型可以不同;
重载方法可以通过this关键字相互调用。
注意:参数列表不同指的是参数类型不一致,参数类型相同、参数名不同的情况被视为参数列表相同。

构造方法是否可以被重写?是否被重载?
方法重载是让类以统一的方式处理不同类型数据的一种手段。
方法的重载是指使方法具有相同的名字,但具有的参数和实现不同。
构造方法是允许被重载的,而且构造方法重载是一种很普遍的做法。重载的构造方法之间相互调用
可以使用this关键字。
但是在继承过程中,构造方法是不能被继承的,因此在子类中无法对父类的构造方法重新定义,
构造方法也就不能被重写。如果需要在子类中调用父类的方法,可以通过super关键字引用。

static修饰的方法能否在子类中重写?
具有static修饰的父类方法是无法在子类中进行重写的。因为static关键字修饰的方法或属性,表示
该属性或方法与类有关。当JVM运行static修饰的方法时,解释器不会检查当前变量指向哪个类型实例
,而是直接调用当前变量类型的方法。

在定义类时,何时需要重写Object类中toString()方法
如果需要指定转化字符串的格式,就需要重写toString()方法。

在定义类时,何时需要重写Object类中equals()方法
==用于比较两个对象的引用地址是否相等,而equals()方法主要用于比较两个对象的内容是否相等。
equals()方法主要用于比较两个对象是否相等。
注意:在重写equals()方法的同时,一般都相应地重写hashCode()方法。

为什么在重写equals()方法时,一般都会重写HashCode()方法?
重写equals()方法主要是为了方便比较两个对象内容是否相等。
hashCode()方法用于返回调用该方法的对象的散列码值,此方法将返回整数形式的散列码值。
一个类如果重写了equals()方法,通常也有必要重写hashCode()方法,目的是为了维护hashCode()
方法的常规规定,该协定声明相等对象必须具有相等的散列码。
hashCode的常规协定主要有以下几点:
在Java应用程序执行期间,在同一对象上多次调用hashCode()方法时,必须一致地返回相同的整数,
前提是对象上equals()方法比较中所有的信息没有被修改。从某一应用程序的一次执行到同一应用
程序的另一次执行,该整数无需保持一致。
如果根据equals(Object)方法,两个对象是相等的,那么在两个对象中的每个对象上调用hashCode()
方法都必须生成相同的整数结果。
以下情况不是必须的:如果根据equals()方法,两个对象不相等,那么在两个对象中的任一对象上
调用hashCode()方法必定会生成不同的整数结果。
注意:相等的对象必须有相同的散列码,反之散列码相同则不一定对象相等,而且不相等的对象
并不一定需要有不同的散列码。
阅读全文
0 0
原创粉丝点击