Java 类和对象(2)

面试题1

动多态和静多态

多态:同一个方法名,根据被调对象的不同,实现了不同的行为。
主要分成静多态【编译过程】(方法的重载)
动多态【运行过程】(继承,重写,向上造型)
静态多态性指的是程序在编译时,系统就能决定调用哪个函数。
动态多态性指在运行中才能动态确定操作指针所指的对象。

面试题2

编译和运行的区别

编译就是指,编译器帮你把源码翻译成机器能识别的字节码,编译时主要做的事情时检查语法以及优化代码
运行就是指,代码被加载到内存中

1.继承

1.1定义:
允许重用现有类称为基类(或超类,父类),由基类派生出来的类称为派生类(子类)
1.2 java 类的继承主要通过 extends 关键字来完成的。一旦继承后,子类将获得父类的成员属性跟成员方法。
基本语法:
class 类名 extends 父类名
{
}
如果没有指定的父类,那么 java 编译器默认 Object 就是该类的父类。
1.3 继承和组合的关系
继承主要是 is a 的关系 什么是什么的一种
组合主要是 has a 的关系 什么由什么组成
1.4 super 关键字的使用
1 用于从派生类访问基类的成员
2 派生类要调用基类的构造方法 super(),super()只能在派生类的构造方法中调用,位于方法首行。
3 调用基类已被其他方法重写的方法
4 访问基类的数据成员:super.成员变量、super.成员方法。
1.5. 成员变量的隐藏和方法的覆盖


class Animal{
protected String name;
protected int age;
protected String sex;
Animal(){}
public Animal(String name){
this.name=name;
}
public void eat(){
System.out.println("Animal eat");
}
}
class Cat extends Animal{
protected String name;//将父类 Animal 中的变量 name 进行隐藏
public void eat(){//进行方法的覆盖
System.out.println("Cat eat");
}
public void catchMice(){
System.out.println(super.name);;//访问父类的成员变量
super.eat();//访问父类的成员方法
System.out.println(name+"catchmice");
}
}

1.6方法重写与方法重载的区别

在Java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。
1.6.1、方法重写(0veriding)
在Java中覆盖继承父类的方法就是通过方法的重写来实现的。所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。
通过使用super关键字实现实现对父类方法的覆盖,super关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.方法名(参数列表)”的形式调用。
1.6.1.1重写规则
在重写方法时,需要遵循以下的规则:
(一) 父类方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。

(二) 父类的返回类型必须与被子类重写的方法返回类型相同,否则不能称其为重写而是重载。

(三) Java中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限。如果定义父类的方法为public,在子类定义为private,程序运行时就会报错。父类中的方法并不是在任何情况下都可以重写的,当父类中方法的访问权限修饰符为private时,该方法只能被自己的类访问,不能被外部的类访问,在子类是不能被重写的。

(四) 由于父类的访问权限修饰符的限制一定要大于被子类重写方法的访问权限修饰符,而private权限最小。所以如果某一个方法在父类中的访问权限是private,那么就不能在子类中对其进行重写。如果重新定义,也只是定义了一个新的方法,不会达到重写的效果。

(五) 在继承过程中如果父类当中的方法抛出异常,那么在子类中重写父类的该方法时,也要抛出异常,而且抛出的异常不能多于父类中抛出的异常(可以等于父类中抛出的异常)。换句话说,重写方法一定不能抛出新的检查异常,
或者比被重写方法声明更加宽泛的检查型异常。

(六)基类的 abstract 方法必须被派生类重写,否则派生类也必须是 abstract的,无法构造对象。

(七)基类的 final 方法不能被派生类重写。

例如,父类的一个方法申明了一个检查异常IOException,在重写这个方法时就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。

1.6.2、方法重载(Overloading)

方法重载是让类以统一的方式处理不同类型数据的一种手段。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态 性。所谓方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。当Java调用一个重载方法是,参数与调用参数匹配的方法被执行。

1.6.2.1重载注意
重载要注意以下的几点:
1.在使用重载时只能通过不同的参数列表。
2.不能通过访问权限、返回类型、抛出的异常进行重载。
3.方法的异常类型和数目不会对重载造成影响。
4.可以有不同的返回类型,只要参数列表不同就可以了。
5.可以有不同的访问修饰符。
6.可以抛出不同的异常。

1.6.3方法重写与方法重载的区别
在这里插入图片描述

2 抽象:

2.1 抽象类和抽象方法
在 Java 面向对象当中,所有的对象都是用过类进行描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,我们把这种类定义为抽象类
抽象类的特征:
1 不能用来实例化对象(new),所以抽象类必须被继承才能够被使用,其他的功能和普通类相同。
2 一个类只能继承一个抽象类。
3 抽象类的修饰符不能是 private。
抽象方法:
如果想要设计一个类,该类包含一个特别的成员方法,==该方法是根据子类的行为来确定的,那么在父类中将这个方法声明为抽象方法。==继而含有抽象方法的类称为抽象类。
抽象方法的注意点:
1 抽象类中不一定含有抽象方法,但是有抽象方法的类一定是抽象类。
2 构造方法,类方法(static 修饰的方法)不能声明为抽象方法。
3 抽象类的子类必须给出抽象类中抽象方法的实现,除非该子类也是一个抽象类。
4 抽象方法的修饰符不能是 private。

总结
抽象类是指不允许被实例化的类;抽象方法是没有方法体的方法。
  1、抽象类可以不包括抽象方法,它反正不会去实例化,抽象类不能被实例化,也就是不能用new关键字去产生对象,抽象方法只需声明,而不需实现,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类,里面的方法是不是抽象的没有本质影响。
  2、但是含有抽象方法的类绝不能被实例化,否则执行这个方法的时候,怎么办?
  3、如果子类是非抽象的,那么它就必须实现父类中的抽象方法,实现父类中的抽象方法即重写,会使抽象方法变成有函数体的非抽象方法;否则,它继承来的抽象方法仍然没有方法体,也是个抽象方法,此时就与“含有抽象方法的类必须是抽象类”相矛盾了。
面试题:为什么抽象类不能实例化对象?
对象执行没有方法体的方法,会出现error。

abstract class Employee{//抽象类
private String name;
private String address;
private int number;
public Employee(String name, String address, int number) {
super();
this.name = name;
this.address = address;
this.number = number;
}
public void mailCheck(){
System.out.println("mailing a check to" + this.name+" "+this.address);
}
public void setAddress(String newaddress){
address=newaddress;
}
public abstract void fun();//定义抽象方法
}
class ExtendsEmployee extends Employee{//继承抽象类必须实现抽象方法
public ExtendsEmployee(String name, String address, int number) {
super(name, address, number);
// TODO Auto-generated constructor stub
}
@Override
public void fun() {//抽象方法的实现
// TODO Auto-generated method stub
}
}
public class TestDemo
{
public static void main(String[] args){

Employee e=new Employee();//error 不能用抽象类实例化对象
}
}
`
``


 

 

                       

猜你喜欢

转载自blog.csdn.net/wangzijunn/article/details/83929903