温故而知新!
private,public,protect在继承中限制父类元素的继承权限。
private
私有的,对象不能在外部直接调用,类内可直接使用,无法被子类调用。但是既然继承了,却不可以调用,就很尴尬,所以get/set方法就可以大显神通了。
感觉好难啊!我就这么记忆:继承就好比是在父类外面裹一层叫一个新名字而已,private修饰的元素是父类私有的不会传递给子类,故而子类无法直接访问,只能通过get/set访问
/*父类*/
package P;
public class Pr {
private Integer count4 = 4;
}
/*子类*/
package P;
public class PrChild extends Pr{
//编译会报错,可以看出this和super都无法访问
public void show(){
System.out.println(super.count4);
System.out.println(this.count4);
}
}
public
顾名思义,公开的!啥叫公开,就是无论对象,子类,无论类内外都可以调用。
protected
受保护的,类似Linux的用户和组的概念,被修饰的元素可在子类中,同包下的类内外调用。但是无法被外包的类调用。
package P;
public class Pr {
protected Integer count4 = 4;//子类无法通过super,this进行访问
}
//不同包下的子类可访问
package S;
import P.Pr;
public class SrChild extends Pr {
public void show(){
System.out.println(super.count4);
}
}
//不同包下的非子类不可访问
package S;
import P.Pr;
public class Sr {
public static void main(String[] args) {
Pr pr = new Pr();
System.out.println(pr.count4);//这里是要报错的!
}
}
package S;
public class Sr {
public static void main(String[] args) {
SrChild srChild = new SrChild();
System.out.println(srChild.count4);//仍然报错!即便不同包下的SrChild继承了Pr
}
}
static
static修饰的元素,此类的对象共享,也就是说,同类的不同对象访问的是同一内存位置。既然是公有的元素,不但对象可以调用而且类也可以调用。
package P;
public class Pr {
public static Integer count2 = 2 ;
}
/*测试类*/
import P.Pr;
import org.junit.jupiter.api.Test;
public class PrTest {
@Test
public void test(){
Pr pr = new Pr();
System.out.println(Pr.count2);//类调用
System.out.println(pr.count2);//对象调用-原理可行,但是工作中不推荐这样搞
}
}
final
final修饰“不变”值,啥意思呢?就是被修饰的元素永永远远就是初始值了,不会更改了(也更改不了),既然都不会更改了,那没必要在每次new对象时重复创建了吧?对!使用同一内存中的数据,不过类无法调用,如果希望类调用,就加上static。
package P;
public class Pr {
public final Integer count = 10;
}
/*测试类*/
import P.Pr;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
public class PrTest {
@Test
public void test2(){
Pr pr1 = new Pr();
Pr pr2 = new Pr();
System.out.println(pr1.count);
System.out.println(pr2.count);
System.out.println(pr1.hashCode() == pr2.hashCode()); //结果FALSE,证明pr1与pr2所指向的内存空间不同
System.out.println(pr2.count.hashCode() == pr1.count.hashCode()); // 结果是TRUE,证明两者的count属性所指内存空间相同
}
}