Java的访问控制修饰符;子类对于从父类继承的哪些属性与方法是可见的;什么是组合?有什么作用;什么是重载?有什么作用;什么是覆盖?有什么作用

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;
	}
}

注:如果子类定义的方法与父类名称相同(大小写完全匹配),但参数名称不同,不是覆盖,而是重载。如果名称、参数相同,返回值不同,则编译不能通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值