黑马程序员-Java面向对象III(面向对象相关问题及案例分析)

来源:互联网 发布:绘图软件上色教学 编辑:程序博客网 时间:2024/06/05 09:41
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、常见问题

1、类是什么?类的组成是哪些?

答案: 

类:可以理解为构造对象的一个蓝图或者模板,是抽象的概念。

类由成员变量和成员方法组成

 

2、对象是什么?什么时候需要使用对象?

答案:

对象:是以类为模型创建的具体实例,是对类的一种具体化。

当需要访问成员变量或成员方法的时候,需要使用对象

 

3、封装是什么?

答案:指隐藏对象的属性和实现细节,仅对外提供公共访问方式

 

4、继承是什么?继承的好处是什么?Java中的继承特点是什么?

答案:

Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

Java继承是使用已存在的类的定义作为基础建立新类的技术。新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。提高了代码的复用性与维护性。

特点:1:继承关系是传递的。若类C继承类B,类B继承类A(多继承),则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性与方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。

2:继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。

3:继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。

4:继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。

5:提供多重继承机制。从理论上说,一个类可以使多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这便是多重继承。Java出于安全性和可靠性的考虑,仅支持单重继承,而通过使用接口机制来实现多重继承。

 

5、方法重写和重载有什么区别?

答案:

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)

重写Override表示子类中的方法可以与父类的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更少。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

6、子父类中构造方法的执行有什么特点?为什么要这样?

答案:

1、子类有所有的构造方法默认都会访问父类中空参数的构造方法。

                因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。

   每一个构造方法的第一条语句默认都是:super()

2、如果父类中没有空参数的构造方法,通过下列方式解决

a) 子类通过super去显示调用父类其他的带参的构造方法

b) 子类通过this去调用本类的其他构造方法(本类其他构造也必须首先可以访问了父类构造)

注意:super(...)或者this(...)必须出现在第一条语句上,否则,就会有父类数据的多次初始化

 

7、多态是什么?

答案:

多态按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。

多态性是允许你将父对象设置成为何一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

简单的说,就是一句话:允许将子类类型对象的引用赋值给父类类型的引用

 

8、抽象类是什么?

答案:使用了关键字abstract声明的类叫做“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。

 

9、接口是什么?

答案:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

 

10、抽象类和接口的区别?

答案:

抽象类:含有abstract修饰的类即为抽象类,抽象类不能创建实例对象。含有abstract方法的类必须定义为抽象类,抽象类中的方法不必是抽象的。抽象类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

接口:可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为publicstatic final

下面比较一下两者的语法区别

1. 抽象类可以有构造方法,接口中不能有构造方法。

2. 抽象类中可以有普通成员变量,接口中没有普通成员变量

3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4. 抽象类中的抽象方法的访问类型可以使publicprotected和默认类型,但接口中的抽象方法只能是public类型的,并且默认修饰即为public abstract类型。

5. 抽象类中可以包含静态方法,接口中不能包含静态方法

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public staticfinal类型。

7. 一个类可以实现多个接口,但只能继承一个抽象类。

 

11、匿名对象是什么?怎么用?

答案:匿名对象,就是没有名字的对象。是对象的一种简化表示形式。

匿名对象的两种使用情况

1. 对象调用方法仅仅一次的时候

2. 作为实际参数传递

 

12、成员变量和局部变量的区别?

答案:

在类中的位置不同

成员变量类中方法外

局部变量方法内或者方法声明上

在内存中的位置不同

成员变量堆内存

局部变量栈内存

生命周期不同

成员变量随着对象的存在而存在,随着对象的消失而消失

局部变量随着方法的调用而存在,随着方法的调用完毕而消失

初始化值不同

成员变量有默认的初始化值

局部变量没有默认的初始化值,必须先定义,赋值,才能使用。

 

13、构造方法的特点?构造方法的注意事项?

答案:

构造方法的特点:

方法名与类名相同

没有返回值类型,连void都没有

没有具体的返回值

构造方法注意事项:

如果我们没有给出构造方法,系统将自动提供一个无参构造方法

       如果我们给出了构造方法,系统将不再提供默认的无参构造方法。

注意:这个时候,如果我们还想使用无参数构造方法,就必须自己给出。建议永远自己给出无参数构造方法。

 

14、方法重写是什么?注意事项是什么?

答案:

方法重写:指子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写

使用特点:

如果方法名不同,就调用对应的方法

                   如果方法名相同,最终使用的是子类自己的

需要注意的问题:

父类中私有方法不能被重写

子类重写父类方法时,访问权限不能更低

父类静态方法,子类也必须通过静态方法进行重写。(其实这个算不上方法重写,但是现象确实如此)

 

15、请说说下面关键字分别是什么,有什么用?

private

this

super

static

final

abstract

interface

extends

implements

答案:

private:是一个权限修饰符,可以修饰成员(成员变量和成员方法),被private修饰的成员只能在本类中访问。

this:方法被哪个对象调用,this就代表那个对象。this用来解决成员变量与局部变量重名问题。

super:代表父类存储空间的标识(可以理解为父类引用)。

static:静态的意思,static修饰的成员,被类的所有对象共享,也可以通过类名调用。

final:最终的意思,可以修饰类,成员变量,成员方法。

abstract:抽象的意思,用来修饰抽象类与抽象方法

interface:接口的意思,用来定义接口。

extends:继承的意思,通过它可以类与类之间产生继承关系。

implement:实现的意思,通过它可以让类与接口之间产生实现关系。



二、案例分析:


/* 传智播客的老师有基础班的,也有就业班的。共性:       属性:姓名,年龄       功能:讲课。现在又要针对日语这种小语种单独开班,需要部分基础班老师和部分就业班老师会说日语。请用所学知识把上面的内容用代码体现。分析:提取共性:定义抽象类:老师类属性 :姓名,年龄功能:讲课。传智播客的老师有基础班的,也有就业班的。具体类:BaseTeacherJobTeacher针对日语这种小语种单独开班:定义接口Japanese需要部分基础班老师和部分就业班老师会说日语: 日语班老师继承自基础班和就业班老师,并实现日语接口SubBaseTeacher extendsSubJobTeacher  extends定义测试类:Test1*/public class Test1 {public static void main(String[] args) {Teacher bt = new BaseTeacher("冯佳",32);System.out.println("姓名是:"+bt.getName()+",年龄是:"+bt.getAge());bt.teach();System.out.println("-----------------------");Teacher jt = new JobTeacher("张三",35);System.out.println("姓名是:"+jt.getName()+",年龄是:"+jt.getAge());jt.teach();System.out.println("-----------------------");SubBaseTeacher sb = new SubBaseTeacher("李四",28);System.out.println("姓名是:"+sb.getName()+",年龄是:"+sb.getAge());sb.speakJapanese();System.out.println("-----------------------");SubJobTeacher st = new SubJobTeacher("王五",29);System.out.println("姓名是:"+st.getName()+",年龄是:"+st.getAge());st.speakJapanese(); }}

定义抽象类:

package com.csdn.test2;/*   属性:姓名,年龄             功能:讲课。 */public abstract class Teacher {private String name;private int age;public Teacher() {super();}public Teacher(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public abstract void teach();}

定义接口:

package com.csdn.test2;public interface Japanese {public abstract void speakJapanese();}

定义具体类:

package com.csdn.test2;public class BaseTeacher extends Teacher {public BaseTeacher() {super();}public BaseTeacher(String name, int age) {super(name, age);}@Overridepublic void teach() {System.out.println("基础班老师讲解JavaSE");}}

package com.csdn.test2;public class JobTeacher extends Teacher {public JobTeacher() {super();}public JobTeacher(String name, int age) {super(name, age);}@Overridepublic void teach() {System.out.println("就业班老师讲解JavaEE");}}

package com.csdn.test2;public class SubBaseTeacher extends BaseTeacher implements Japanese {public SubBaseTeacher() {super();}public SubBaseTeacher(String name, int age) {super(name, age);}@Overridepublic void speakJapanese() {System.out.println("用日语讲JavaSE");}}

package com.csdn.test2;public class SubJobTeacher extends JobTeacher implements Japanese {public SubJobTeacher() {super();}public SubJobTeacher(String name, int age) {super(name, age);}@Overridepublic void speakJapanese() {System.out.println("用日语讲JavaEE");}}

运行结果:

姓名是:冯佳,年龄是:32
基础班老师讲解JavaSE
-----------------------
姓名是:张三,年龄是:35
就业班老师讲解JavaEE
-----------------------
姓名是:李四,年龄是:28
用日语讲JavaSE
-----------------------
姓名是:王五,年龄是:29
用日语讲JavaEE

0 0
原创粉丝点击