继承与多态,附相关面试题

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一:继承(掌握)

(1)把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系, 这多个类就具备了这些内容。这个关系叫继承。(2)Java中如何表示继承呢?格式是什么呢?A:用关键字extends表示B:格式:class 子类名 extends 父类名 {}(3)继承的好处:A:提高了代码的复用性B:提高了代码的维护性C:让类与类产生了一个关系,是多态的前提(4)继承的弊端:A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。开发的原则:低耦合,高内聚。耦合:类与类的关系内聚:自己完成某件事情的能力B:打破了封装性(5)Java中继承的特点A:Java中类只支持单继承(一个类只能有一个父类,不可以有多个父类)B:Java中可以多层(重)继承(继承体系) 如:class A{} class B extends A{} class C extends B{}(6)继承的注意事项:A:子类不能继承父类的私有成员B:子类不能继承父类的构造方法,但是可以通过super去访问C:不要为了部分功能而去继承(7)什么时候使用继承呢?A:继承体现的是:is a的关系。B:采用假设法,如果有两个类,只要他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。(8)Java继承中的成员关系A:成员变量a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?(就近原则)子类的方法访问变量的查找顺序:在子类方法的局部范围找,有就使用。在子类的成员范围找,有就使用。在父类的成员范围找,有就使用。找不到,就报错。c.我们不仅仅要输出局部范围的num,还要输出本类成员范围的num,这是用this.num.这里的this就相当于子类类名。要输出父类成员范围的num,就用super关键字。super.numd.this和super的区别。1)this代表本类对应的引用。 super代表父类存储空间的标识(可以理解为父类的引用,可以操作父类的成员)2)用法:this.成员变量 调用本类的成员变量。 this(参数) 调用本类的构造方法 this.成员方法() 调用本类的成员方法super.成员变量 调用父类的成员变量。 super(参数) 调用父类的构造方法 super.成员方法() 调用父类的成员方法。B:构造方法a:子类的所有构造方法默认会去访问父类的无参构造方法

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

注意:子类每一个构造方法中第一条语句都会被系统默认为:super(),不论你写与不写,我都会占据子类构造方法第一句。

b:父类中如果没有无参构造方法,怎么办?子类通过super去明确调用带参构造子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造,否则父类数据没法初始化。让父类提供无参构造注意:this(参数)或者super(参数)必须出现在子类构造方法的第一条语句上,如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句。C:成员方法a:子类的成员方法和父类中的成员方法名称不一样,这个太简单b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢(就近原则)?通过子类对象访问一个方法的查找顺序:在子类中找,有就使用在父类中找,有就使用找不到,就报错(9)两个面试题:

A:Override和Overload的区别?

方法重写:子类中出现了和父类中一模一样的方法声明。又称方法覆盖,方法复写方法重载:本类中出现了方法名一样,参数列表不同的方法,与返回值无关。

B:this和super的区别和各自的作用?this:代表当前类的对象引用,super:代表父类存储空间的标识,(可以理解为父类的引用,通过这个东西可以访问父类的成员)(10)数据初始化的面试题A:一个类的初始化过程:成员变量的初始化:默认初始化,显示初始化,构造方法初始化。B:子父类的构造执行过程:父类静态代码块 1子类静态代码块 2父类构造代码块 3父类无参构造方法 4子类构造代码块 5子类无参构造方法 6C:分层初始化(子父类的初始化):先进行父类初始化,然后进行子类初始化。D:虽然子类中构造方法默认有一个super(),但是初始化的时候不是按照这个默认的super()来执行的,而是按照分层初始化进行的。所以要先初始化父类的所有数据,再初始化子类的数据。例:class X{Y b=new Y();//YX(){System.out.println("X");//X}}class Y{Y(){System.out.println("Y");}}public class Z extends X{Y y=new Y();//YZ(){System.out.println("Z");//Z}public static void main(String[]args){new Z();}}输出结果:先初始化父类:Y X,再初始化子类:Y Z. 结果是YXYZ补充:1:方法重写和方法重载的区别。方法重写:子类中出现了和父类中一模一样的方法声明。又称方法覆盖,方法复写方法重载:本类中出现了方法名一样,参数列表不同的方法,与返回值无关。2:方法重写的注意事项。1,父类中私有方法 不能被重写。因为父类私有方法没法继承。2,子类重写父类方法时,访问权限不能更低。3,子类重写父类方法时,最好声明一模一样,父类静态子类也静态。3:案例:A:学生案例继承前继承后class Person{private String name;private int age;public Person(){}public Person(String name,int age){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;}}class Student extends Person{public Student(){}public Student(String name,int age){super(name,age);}}class Test3{public static void main(String[]args){Student s=new Student();s.setName("小石头1");s.setAge(22);System.out.println(s.getName()+"—–"+s.getAge());Student s2=new Student("小石头2",22);System.out.println(s2.getName()+"—–"+s2.getAge());}}不能接受失败,也意味太想去成功了,从心理学上解释,

继承与多态,附相关面试题

相关文章:

你感兴趣的文章:

标签云: