目录标题
1. Java的访问控制修饰符有哪些?各有什么访问权限?
(图片来自老师PPT)
(列标——行标)
● public-public:属性和方法可以被所有类访问。
package com.resource;
public class FighterPlane{
public String name;
public int missileNum;
public void fire() {
if(missileNum>0) {
System.out.println("now fire a missile !");
missileNum--;
}else {
System.out.println("No missile left !");
}
}
}
package com.run;
import com.resource.FighterPlane;
public class RunPlane{
public static void main(String[] args) {
FighterPlane fp=new FighterPlane();
fp.name="苏-35";
fp.missileNum=6;
fp.fire();
}
}
● public-protected:在类定义层面上,访问权限为B+C,而在对象层面上则为B。
被同一包内其他类的对象访问:
package chapter5;
public class FighterPlane {
protected String name;
protected int missileNum;
protected void fire() {
if(missileNum>0) {
if(missileNum>0) {
System.out.println("Now fire a missile!");
missileNum-=1;
}else {
System.out.println("No missile left!");
}
}
}
}
package chapter5;
public class RunPlane {
public static void main(String[] args) {
FighterPlane fp=new FighterPlane();
fp.name="su-35";
fp.missileNum=6;
fp.fire();
}
}
不能被其他包内的类的对象访问:
package com.resource;
public class FighterPlane{
protected String name;
protected int missileNum;
protected void fire() {
if(missileNum>0) {
System.out.println("now fire a missile !");
missileNum--;
}else {
System.out.println("No missile left !");
}
}
}
package com.run;
import com.resource.FighterPlane;
public class RunPlane{
public static void main(String[] args) {
FighterPlane fp=new FighterPlane();
fp.name="苏-35";
fp.missileNum=6;
fp.fire();
}
}
被子类对象访问:
package com.resource;
public class FighterPlane{
protected String name;
protected int missileNum;
protected void fire() {
if(missileNum>0) {
System.out.println("now fire a missile !");
missileNum--;
}else {
System.out.println("No missile left !");
}
}
}
package com.run;
import com.resource.FighterPlane;
public class RunPlane extends FighterPlane{
public static void main(String[] args) {
RunPlane fp=new RunPlane();
fp.name="苏-35";
fp.missileNum=6;
fp.fire();
}
}
● public-缺省:当属性和方法前的修饰符为默认时,访问权限只限于B。
package chapter5;
public class FighterPlane {
String name;
int missileNum;
void fire() {
if(missileNum>0) {
if(missileNum>0) {
System.out.println("Now fire a missile!");
missileNum-=1;
}else {
System.out.println("No missile left!");
}
}
}
}
package chapter5;
public class RunPlane {
public static void main(String[] args) {
FighterPlane fp=new FighterPlane();
fp.name="su-35";
fp.missileNum=6;
fp.fire();
}
}
● public/缺省-private:当属性和方法前的修饰符为private时,只能被本类内部的方法所访问。
package chapter5;
public class FighterPlane {
private String name;
private int missileNum;
public void setName(String _name) {
if(_name!=null) {
name=_name;
}
}
public void setNum(int _missileNum) {
if(_missileNum>0) {
missileNum=_missileNum;
}
}
public String getName() {
return name;
}
public int getNum() {
return missileNum;
}
void fire() {
if(missileNum>0) {
if(missileNum>0) {
System.out.println("Now fire a missile!");
missileNum-=1;
}else {
System.out.println("No missile left!");
}
}
}
}
package chapter5;
public class RunPlane {
public static void main(String[] args) {
FighterPlane fp=new FighterPlane();
fp.setName("苏-35");
fp.setNum(6);
fp.fire();
}
}
● 缺省-public/protected/缺省:属性和方法的访问权限为B。
package chapter5;
class FighterPlane {
public String name;
protected int missileNum;
void fire() {
if(missileNum>0) {
if(missileNum>0) {
System.out.println("Now fire a missile!");
missileNum-=1;
}else {
System.out.println("No missile left!");
}
}
}
}
package chapter5;
public class RunPlane {
public static void main(String[] args) {
FighterPlane fp=new FighterPlane();
fp.name="苏-35";
fp.missileNum=6;
fp.fire();
}
}
● 缺省-private:见public-private。
2. 子类对于从父类继承的哪些属性与方法是可见的?
子类继承了父类的所有属性和方法, 但只有public、protected的属性和方法在子类是可见的。
package runplane;
public class Plane {
protected String name;
public void setName(String _name) {//如果将name的访问控制修饰符
//改为private,则可以通过此函数来改变name的值
name=_name;
}
public String getName() {
return name;
}
}
package runplane;
public class FighterPlane extends Plane{
private int missileNum;
public void setNum(int _missileNum) {
missileNum=_missileNum;
}
public void fire() {
if(missileNum>0) {
if(missileNum>0) {
System.out.println("Now fire a missile!");
missileNum-=1;
}else {
System.out.println("No missile left!");
}
}
}
}
package runplane;
public class Run {
public static void main(String[] args) {
FighterPlane p=new FighterPlane();
p.name="su35";
System.out.println(p.getName());
p.setName("f35");
System.out.println(p.getName());
p.setNum(6);
p.fire();
}
}
3. 什么是组合?有什么作用?
组合:一个类的对象引用是另一个类的属性就是一个组合现象。
作用:实现代码的复用;使对象间的耦合性较为松散,比如: 假设有一个类A,另一个类的对象引用fp是它的属性,当外界的变化使fp所指向的对象损坏时,我们可以灵活地将fp指向另一个对象。
样例:
package chapter5;
class FighterPlane {
public String name;
protected int missileNum;
public FighterPlane(String _name,int _missileNum) {
name=_name;
missileNum=_missileNum;
}
public void fire() {
if(missileNum>0) {
if(missileNum>0) {
System.out.println("Now fire a missile!");
missileNum-=1;
}else {
System.out.println("No missile left!");
}
}
}
}
package chapter5;
public class A {
FighterPlane fp;
public A(FighterPlane fpp) {
this.fp=fpp;//A对象拥有了FighterPlane对象引用
}
public void invoke() {
//A对象发送消息给FighterPlane的对象
System.out.println(fp.name);
}
}
package chapter5;
public class Run {
public static void main(String[] args) {
FighterPlane ftp=new FighterPlane("su35",10);
FighterPlane ftp2=new FighterPlane("苏-35",10);
//产生A对象,并将ftp作为对象引用传入
A a=new A(ftp);
a.invoke();
a.fp=ftp2;
a.invoke();
}
}
4. 什么是重载?有什么作用?
重载:在类中定义了多个同名而不同内容参数的成员方法时,称这些方法是重载方法。
作用:可以实现程序的消息处理接口方法的扩充,同时保留旧的接口方法保障原先使用程序的稳定。
样例:
class Parent{
public int getScore(){
return 3;
}
public int getScore(){
return i;
}
}
注:在java中,同名同参数但不同类型返回值的方法不是重载,编译不能通过。
5. 什么是覆盖?有什么作用?
多态:子类对父类参数相同、返回值类型相同的同名方法重新定义,这种多态被称为覆盖。
作用:方法覆盖与引用替换相结合,可使抽象类的声明在保证消息发送统一的前提下,具有消息结果执行上的相异性特点。
样例:
class Parent {
public int getScore(){
return 3;
}
}
class Son {
public int getScore(){
return 4;
}
}
注:如果子类定义的方法与父类名称相同(大小写完全匹配),但参数名称不同,不是覆盖,而是重载。如果名称、参数相同,返回值不同,则编译不能通过。