1. Java的访问控制修饰符有哪些?各有什么访问权限?并分别写程序验证。
Java的访问控制修饰符包括:public,protected,private
如图所示:
例如:protected属性具有包访问权限,可以被同一包中的所有类访问
例如:不能通过对象引用来访问不在同一包的类的protected属性和方法
例如:子类的类定义中可以访问父类的protected属性和方法,不论是否在同一包
总结:
>>访问权限首先看类前的修饰符,当类的修饰符为public时, 则类可以被所有的类所访问(可以import),当为默认时, 则只能为包中的类所访问。在此前提下,再看属性和方法前的修饰符。
>>类前修饰符为public时,当属性和方法前的修饰符为public时,则该属性可以被所有类访问;
>>当属性和方法前为protected修饰时,对于类定义而言,可以被同包中的类和所有子类访问(子类和父类可以不在同一个包中),也就是B+C范围,但对于对象而言,只能被同一个包的类对象所访问,也就是B的范围;
>>当为默认时,只能被同包中的类所访问(比protected访问权限小);当为private时,只能被本类内部所访问 。
2. 子类对于从父类继承的哪些属性与方法是可见的?请分别写程序进行验证。
子类继承了父类的所有属性和方法, 但只有public、protected的属性和方法在子类是可见的。
详细一点说:子类在继承父类的时候,首先应该满足父类可被访问,例如当子类和父类不在同一个包当中时,父类修饰符必为public;在父类能被访问的前提下,凡是修饰符为public或是protected的父类属性成员或是方法能被子类所访问; private的属性成员或是方法则不能被访问。
例如:
输出:s35 p35
3. 什么是组合?有什么作用?请举例说明。
组合:把一个类当成另一个类的组合成分,从而允许新类直接复用该类的public方法。
作用:不破坏封装,整体类与局部类之间松耦合,彼此相对独立且具有更好的可扩展性。
例如:
class A{…}
class B{A a
…
}
4. 什么是重载?有什么作用?请构造各种重载示例。
重载:方法名称相同,参数类型或个数不同
注意:同名同参数但不同类型返回值的方法不是重载,编译不能通过
作用:完成同一功能时可能会遇见不同的情况,提高可读性。
编译器视角: 方法签名=方法名称+参数类型+参数个数 组成唯一键
class Parent{
public int getScore(){
return 3;
}
public int getScore(int i){
return i;
}
}
public static void main(String[] args) {
System.out.println(add(31,36465,41,654,1,32,165,465,4,3213,246,54,65,465454654));
System.out.println(add(1,2));
System.out.println(add(1,2,3));
}
static int add(int... nums) {
int result = 0;
for(int i = 0;i < nums.length;i ++) {
result += nums[i];
}
return result;
}
static int add(int num1,int num2) {
return num1 + num2;
}
static int add(int num1,int num2,int num3) {
return num1 +num2 + num3;
}
5. 什么是覆写?有什么作用?覆写父类方法的条件有哪些?请举例说明。
覆写:子类对父类参数相同,返回类型相同的同名方法重新进行定义
注意:如果子类定义的方法与父类名称相同,但参数名称不同,则不是覆写,而是重载。
如果名称相同,参数名称相同,但返回类型不同,则编译不能通过。
作用:对功能进行复用和扩充
覆写父类方法的条件:
>>子类的访问修饰符权限应等于或大于父类,不能变小
>>子类的返回类型能够向上转型成为父类的返回类型
>>异常也要能向上转型为父类的异常
>>方法名、参数类型及个数必须严格一致
>>只能针对非静态、非final、非构造方法
例如:
输出:4