基础知识和问题
- 1.继承性的好处?
- 2.继承的格式
- 3.子类继承父类中的属性和方法,包括private声明的属性和方法吗?
- 4.Java中关于继承性的规定
- 5.所有的java类都直接或者间接的继承于java.lang.Object类
- 6.子类继承父类,如果构造器中没有指定继承哪个父类构造器,则默认继承父类的无参构造器。
- 7.什么是方法的重写?要求是什么?
- 8. 重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名参数的方法时,实际执行的是子类重写父类的方法。
- 9.区分方法的重载和重写?
- 10.具体重写规定是什么?
- 11.权限修饰符说明
- 12.super关键字的使用
- 13.子类对象的实例化全过程
- 14.对象的多态性
- 15.多态性的前提
- 16.多态的好处是什么?
- 17.为了避免向下转型失败时出现ClassCastException的异常?
- 18.关于object类了解多少?
- 19.==和equals的区别是什么?
- 20.重写equals方法的基本原则是什么?
- 21.toString()方法
- 22.包装类有哪些?
- 23.基本类型、包装类与String类间额相互转换
- 24.查看如下代码的运行结果
1.继承性的好处?
1.减少代码的冗余,提高了代码的复用性
2.便于功能的扩展
3.为之后多态性的使用提供了前提
2.继承的格式
class A extends B{
}
3.子类继承父类中的属性和方法,包括private声明的属性和方法吗?
包含,只是因为封装性的影响,使得子类不能直接调用父类的结构而已。
4.Java中关于继承性的规定
1.一个类可以被多个子类继承
2.Java中类的单继承性:一个类只能有一个父类
3.子父类是相对的概念
4.子类直接继承的父类称为:直接父类,间接继承的父类称为:间接父类
5.子类继承父类之后,就获取了直接父类以及所有父类中声明的属性和方法
5.所有的java类都直接或者间接的继承于java.lang.Object类
6.子类继承父类,如果构造器中没有指定继承哪个父类构造器,则默认继承父类的无参构造器。
7.什么是方法的重写?要求是什么?
1.在子类中可以根据需要对父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
2.子类和父类中的方法名和形参列表必须一致
8. 重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名参数的方法时,实际执行的是子类重写父类的方法。
9.区分方法的重载和重写?
方法的重载指的是在同一个类中的同名方法之间所构成的重载,要求参数列表类型或者个数不同。
重写指的是子父类之间发生的重写,子类重写了父类的方法,要求子类方法和父类方法方法名和形参列表必须一致。
10.具体重写规定是什么?
1.子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
2.子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
3.特殊情况,子类不能重写父类中声明为private权限的方法
4.当子类重写了父类的方法之后,父类中调用的方法也是调用子类中重写的方法
5.返回值类型:
1)父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
2)父类被重写的方法返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类
3)父类被重写的方法返回值类型是基本数据类型,则子类重写的方法的返回值类型必须是相同的基本数据类型
6.子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
7.子类和父类中的同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写)。
11.权限修饰符说明
1.同一个包中的其他类,不可以调用某个实例、类中私有的属性、方法
2.在不同包的子类中,不能调用类中声明的private和缺省权限的属性、方法;非子类的类中不能调用privete、缺省、protected中的属性、方法。
12.super关键字的使用
1.super理解为:父类的
2.super可以用来调用:属性、方法、构造器
3.spuer调用属性和方法使用
3.1显式调用父类的属性或者构造器:“super.属性"或"super.方法”
3.2如果不显示的写,会先查看本类中是否有对应的属性或者方法,如果没有将到直接父类、间接父类中查找。
4.super调用构造器
4.1可以在子类的构造器中显式的调用super(形参列表),且必须声明在首行,若没有显式的声明this或者super,则默认调用的是父类中空参的构造器
4.2在类的多个构造器中,至少有一个类的构造器中使用了"super(形参列表)"调用父类中的构造器
13.子类对象的实例化全过程
1.从结果上看:子类继承父类之后,就获取了父类中声明的属性或者方法
创建子类的对象,在堆空间中,就会加载所有父类中声明的属性
2.从过程上看:
子类会间接或者直接的调用其父类的构造器,进而调用父类的父类的构造器,直到调用了java.lang.Object类中的空参构造器为之。正因为加载过所有的父类的结构,所以才可以看到内存中有父类中的结构,子类对象才可以考虑进行调用。
虽然创建子类对象时,调用了父类的构造器,但是至始至终就创建过一个对象,即为new的子类对象。
14.对象的多态性
父类的引用指向子类的对象(或子类的对象赋给父类的引用)。
虚拟方法调用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法,但是不能调用子类中有但是父类中没有的方法。多态是运行时行为。
对象的多态性只适用于方法,不适用于属性。
例子:
Person p2=new Man();
p2.eat();
15.多态性的前提
1)类的继承关系
2)方法的重写
16.多态的好处是什么?
1.可以通过调用父接口,在运行的时候确定具体的操作,简化代码
17.为了避免向下转型失败时出现ClassCastException的异常?
在向下转型之前进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
例子:if(p2 instanceof Person){
}
18.关于object类了解多少?
1.Object类是所有Java类的父类
2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
3.Object中的方法:
1)clone()
2)public boolean equals(Object obj)
3)protected void finalize()//垃圾回收之前调用
4)getClass()
5)hashCode()
6)notify()
7)notifyAll()
8)toString()
10)wait()
11)wait(long timeout)
12)wait(long timeout,int nanos)
4.Object只声明了一个空参的构造器
19.==和equals的区别是什么?
==的使用:
1.可以使用在基本数据类型变量和引用数据类型变量中
1)基本数据类型中比较的是保存的数据是否相等(boolean不能参与比较)
2)在引用数据类型变量中比较两个对象的地址值是否相同,即比较两个引用在堆空间中的地址是否相同
equals方法的使用:
1)是一个方法,而非运算符
2)只适用于引用数据类型
3)Object类中equals方法的定义,比较的是地址是否相同
4)像String、Date、File、包装类等都重写了Object类中的equals()方法。
5)通常情况下,自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同
例子:
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(obj==null) return false;
if(getClass()!=obj.getClass()){
return false;
}
if(obj instanceof Customer){
Customer cust=(Customer)obj;
return this.age==cust.age&& this.name.equals(cust.name);
}else{
return false;
}
}
20.重写equals方法的基本原则是什么?
对称性
自反性
传递性
一致性
x.equals(null):false
x.equals(和x不同类型的对象):false
21.toString()方法
1.当我们输出一个对象的引用时,实际上就是调用当前对象的toString()
2.Object类中toString()的定义:
public String toString(){
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
3.像String、Date、File、包装类等都重写了Object类中的toString()方法
4.自定义类可以重写toString()方法。
22.包装类有哪些?
23.基本类型、包装类与String类间额相互转换
Float f1=new Float(12.3);
int f2=f1.intValue();
System.out.println(f2);
String str="123a";
int num2=Integer.parseInt(str);//NumberFormatException
24.查看如下代码的运行结果
Object o1=true? new Integer(1):new Double(2.0);
System.out.println(o1);
结果:1.0
2.
Integer i=new Integer(1);
Integer j=new Integer(1);
System.out.println(i==j);
Integer m=1;
Integer n=1;
System.out.println(m==n);
Integer x=128;
Integer y=128;
System.out.println(x==y);
结果:
false
true
false
//静态初始化-128-127的缓存空间