Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。
Java 支持 4 种不同的访问权限。
- default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使* 用对象:类、接口、变量、方法。
- private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
- public : 对所有类可见。使用对象:类、接口、变量、方法
-
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
public class PersonTest {
public static void main(String[] args) {
// 创建一个人类对象 张三 Person person = new Person(); // 设置 该人的名字未 张三 person.name = "张三" ; // 设置年龄 为 10 岁 // person.age = 10 ; // 设置 手机号 person.tel = "13112345678" ; // 给张三设置 金额为 10000 //person.money = 10000 ; person.study("Java"); // 调用赚钱的方法 //person.earnMoney();
}
}
public class Person {
/**
* 属性 field 名字
*/
public String name ;
/**
* 人的年龄
*/
private Integer age ;
/**
* 性别
*/
String sex ;
/**
* 手机号
*/
protected String tel ;
/**
* 钞票
*/
private double money ;
public void study(String subject) {
System.out.println(name + "正在学习" + subject + ", 他今年已经" + age + "岁了");
}
private void earnMoney() {
System.out.println(name + "正在拼命的工作、养家、赚钱");
}
}
import com.qikux.day3.Person;
public class Student extends Person {
public void study() {
System.out.println(name + "正在学习,他的手机号是" + tel + ", 他的账户余额有" );
}
}
* 添加给 私有属性 money 设置值的方法
>public void setMoney(double money) {
this.money = money ;
}
* 添加 获取 私有属性 age 的方法
>public int getAge() {
return this.age ;
}
* 添加 获取 私有属性 money 的方法
>public double getMoney(){
return this.money ;
}
public void study(String subject) {
System.out.println(name + "正在学习" + subject + ", 他今年已经" + age + "岁了");
}
private void earnMoney() {
System.out.println(name + "正在拼命的工作、养家、赚钱");
}
}
#### 完整案例
* 给 Person类添加 构造方法,完成对私有属性的赋值
* 类中,如果没有特殊需求,推荐 添加一个 无参构造方法
* 添加给 私有属性 age 设置值的方法
* 添加给 私有属性 money 设置值的方法
public class Person {
/**
* 属性 field 名字
*/
public String name ;
/**
* 人的年龄
*/
private Integer age ;
/**
* 性别
*/
String sex ;
/**
* 手机号
*/
protected String tel ;
/**
* 钞票
*/
private double money ;
public Person() {}
public Person(int age, double money){
this.money = money;
this.age = age ;
}
public void setAge(int age) {
//if ( age < 0 || age > 150) throw new RuntimeException("年龄的范围应该在0-150之间") ;
this.age = age ;
}
/**
* 添加给 私有属性 money 设置值的方法
*/
public void setMoney(double money) {
this.money = money ;
}
/**
* 添加 获取 私有属性 age 的方法
*/
public int getAge() {
return this.age ;
}
/**
* 添加 获取 私有属性 money 的方法
*/
public double getMoney(){
return this.money ;
}
public void study(String subject) {
System.out.println(name + "正在学习" + subject + ", 他今年已经" + age + "岁了");
}
private void earnMoney() {
System.out.println(name + "正在拼命的工作、养家、赚钱");
}
}
class PersonTest {
public static void main(String[] args) {
// 创建一个人类对象 张三
Person person = new Person();
// 设置 该人的名字未 张三
person.name = "张三" ;
// 设置年龄 为 10 岁
//person.age = 10 ;
person.setAge(1000);
//person.sex = "男" ;
// 设置 手机号
//person.tel = "13112345678" ;
// 给张三设置 金额为 10000
//person.money = 10000 ;
person.study("Java");
// 调用赚钱的方法
//person.earnMoney();
}
}
#### 比较各属性是否一样(自己编译一段代码,用来比较两个对象是否内容相等)
如果传入的对象和this地址相同
>if (this==obj)return true;
如果两个地址不相同,判断obj是否为空
>if (obj ==null)return false;
比较两个对象的 类型是否 相等
获取 一个 对象的 类型,通过 对象的 getClass() 方法
>if (this.getClass()!=obj.getClass())return false;
如果两个对象是同种类型,继续进行下面的比较
>Person p = (Person) obj;
>Objects.equals(a, b) ;
比较两个对象的内容是否相同的工具类,解决了可能会产生空指针的问题
>if (!Objects.equals(this.name,p.name))return false;
如果名字相同, 继续比较 年龄
>if (this.age!=p.age)return false;
如果年龄 也相等, 继续比较 性别
>if (!Objects.equals(this.sex,p.sex))return false;
如果 性别 相等, 继续比较 手机号
>if (!Objects.equals(this.tel,p.tel))return false;
return true;
#### 一个类中最多只会发生一次类加载,类加载的产物是“类对象”,用Class类型来表示类加载的过程
1.分配空间
2.加载静态属性,如果有赋值语句,同时完成赋值操作。
3.加载静态代码块,并执行代码块中的语句。
4.如果有静态属性没有被赋值,此时完成对静态属性的赋值
5.将类中的静态方法,全部压入内存(此时方法不会被执行)
* static 修饰的属性(静态属性)
* 静态属性被类的所有对象共享,任何一个对象如果对静态属性修改,那么所有对象看到的都是修改后的数据
* static修饰方法(一般用于工具类的编写)
* static修饰代码块(做数据的一次性初始化工具)