Java的访问控制修饰符及权限
修饰符:public、protected、private、缺省;
同一包内,可以访问所有类的public,protected,缺省的所有属性和方法,不能访问private属性和方法。
不同包只能访问其他包的public属性和方法,其他都不可访问
小结
访问权限首先看类前的修饰符:
当类的修饰符为public时,则类可以被所有的类所访问(可以import)
当为默认时,则只能为包中的类所访问。
在此前提下,再看属性和方法前的修饰符:
类前修饰符为public时,当属性和方法前的修饰符为public时,则该属性可以被所有类访问;
当属性和方法前为protected修饰时,对于类定义而言,可以被同包中的类和所有子类访问(子类和父类可以不在同一个包中),也就是B+C范围,但对于对象而言,只能被同一个包的类对象所访问,也就是B的范围;
当为默认时,只能被同包中的类所访问(比protected访问权限小);当为private时,只能被本类内部所访问 。
子类对于从父类继承的哪些属性与方法的可见性
子类继承了父类的所有属性和方法, 但只有public、protected的属性和方法在子类是可见的。
子类在继承父类的时候,首先应该满足父类可被访问,例如当子类和父类不在同一个包当中时,父类修饰符必为public;在父类能被访问的前提下,凡是修饰符为public或是protected的父类属性成员或是方法能被子类所访问;
private的属性成员或是方法则不能被访问。
不同包中子类可以访问父类的public和protected属性和方法
灵活点,这样也可以哒
组合
组合:一个类的对象引用是另一个类的属性就是一个组合现象。
作用:java代码复用的一种方法。顾名思义,就是使用多个已有的对象组合为一个功能更加复杂强大的新对象。体现的是整体与部分、拥有的关系.
public class job {
String name;
int salary;
public int getsalary() {
return salary;
}
public void setsalary(int sa) {
this.salary=sa;
}
public String getname() {
return name;
}
public void setname(String na) {
this.name=na;
}
}
class person{
String name;
job j;
person(String na){
this.j=new job();
j.setname("baiche");
j.setsalary(100);
this.name=na;
}
public void cout() {
System.out.println("My name is "+name);
System.out.println("My job is "+j.getname());
System.out.println("My salary is "+j.getsalary());
}
}
public class run3 {
public static void main(String[] args) {
person p=new person("jiangshan");
p.cout();
}
}
重载
重载:在类中定义了多个同名而不同内容参数的成员方法时,称这些方法是重载方法。
作用:同一类型的方法,对不同的对象,具有不同的表现形式
class Parent {
public int getScore(){
return 3;
}
}
class Son extends Parent {
public int getScore(){
return 4;
}
}
注:如果子类定义的方法与父类名称相同(大小写完全匹配),但参数名称不同,不是覆盖,而是重载。如果名称、参数相同,返回值不同,则编译不能通过。
覆盖
如果在子类中定义一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法。
public class zilei {
int a,b;
int sum;
public void set(int a,int b) {
sum=a+b;
System.out.println(sum);
}
public int get() {
return sum;
}
}
class fugai extends zilei{
public void set(int a,int b) {
sum=a*b;
System.out.println(sum);
}
}
public class run4 {
public static void main(String[] args) {
zilei z=new zilei();
z.set(2, 3);
fugai f=new fugai();
f.set(2,3);
}
}
注意;子类的访问修饰符权限应等于或大于父类
同名的static方法和非static方法不能相互覆盖
方法前有final修饰符,此方法不能在子类方法中进行覆盖
在JDK中,很多父类的方法被子类重新覆盖,赋予了不同的含义,如Object类中的boolean equals(Object obj)方法
抽象类中如果存在抽象方法,则具体子类必须对抽象方法进行覆盖