从实践认识修饰符
1 修饰符分类
说到修饰符,大家都知道有 private deafult protect public,说到它们的区别,相信大家脑海会出现一张图。
同一个类 | 同包非子类 | 子类 | 不同包非子类 | |
---|---|---|---|---|
private | 是 | 否 | 否 | 否 |
default | 是 | 是 | 否 | 否 |
protected | 是 | 是 | 是 | 否 |
public | 是 | 是 | 是 | 是 |
那么怎么从代码层面解释呢,学东西不能停留在理论层面,毕竟只是一份实践的工作。所以请看下面讲解,毕竟实践才是检验真理的唯一标准,说白了就是写一些 demo,验证一下,工作中我们不了解某个方法或者某个类的时候,本人推荐写一些 demo,做一些 test,本人觉得这是技巧之一。
2 代码展示
本实例访问方法只有两种
- 创建对象访问,形成组合关系
- 继承类,形成继承关系
2.1 引入必要的 maven
写 demo 验证自己想法时候,推荐使用 test 框架,不同每次都写一个 main 方法,只要一个注解 @test 就能解决问题
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
也可以使用 slf4j 框架来打印信息
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
</dependency>
也可以使用 lombok 框架,实现注解 @getter 和 @setter 代替 getter 方法和 setter 方法
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>
2.2 private
需要创建对象 调用类中属性
2.2.1 实例
package classtest;
import lombok.Getter;
import lombok.Setter;
import org.junit.Test;
/**
* @Author buer
* @create 2019/4/28 10:06
* @description 父类
*/
@Getter@Setter
public class Animal {
public int id = 1;
private String name="chen";
protected String parent = "parent";
@Test
public void eat(){Animal animal = new Animal();
System.out.println(animal.name);
}
}
2.2.2 结果
chen
ps:贴图很麻烦 就贴字了
2.2.3 结论
在本类创建对象可以直接访问 private 属性字段
2.3 default
创建对象,访问属性
2.3.1 实例
package classtest;
@Getter
@Setter
public class Classtest {
@Test
public void defaultTest(){Animal animal = new Animal();
System.out.println(animal.name);
}
}
另一个类 name 属性改变 –》protected
package classtest;
@Getter
@Setter
public class Animal {
private int id;
String name="chen";
protected String parent;
}
2.3.2 结果
chen
2.3.3 结论
在同一个包中创建对象可以直接访问,不同包下创建对象不能访问 default 默认属性字段,例子省略
2.4 protected
继承父类,不需要创建父类对象,直接访问 protected 属性字段
2.4.1 实例
package butong;
import classtest.Animal;
import org.junit.Test;
/**
* @Author buer
* @create 2019/5/4 14:37
* @description
*/
public class Animalbutong extends Animal{
@Test
public void defaultTest(){System.out.println(parent);
}
}
2.4.2 结果
chen
2.4.3 结论
在子类中可以直接进访问父类字段,不需要创建对象
2.5 public
在不同包以及非子类关系下,创建对象可以访问 public 属性字段
2.5.1 实例
test 属性是 public
package butong;
import classtest.Animal;
import org.junit.Test;
/**
* @Author buer
* @create 2019/5/4 14:37
* @description
*/
public class Animalbutong {
@Test
public void defaultTest(){Animal animal = new Animal();
System.out.println(animal.test);
}
}
2.5.2 结果
chen
2.5.3 结论
在不同包以及非子类关系下,创建对象可以访问 public 属性字段
公众号