面向对象三大特征:封装、继承、多态
今后成员变量都用private修饰,get()、set()都用public修饰(若get()、set()也都用private修饰,整个类都访问不到了;成员变量被private修饰后,只能通过public修饰的get()、set()方法访问)
private:
应用范围:可以用来修饰成员变量和成员方法
特点:只能在本类中访问
类型:是一个权限修饰符
public class Student{------Student类
private int age ;
public void setAge(int a){
if(a>0 && a<100){
age = a ;
}else{
sout(输入有误)}}}
public int getAge(){
return age;}
public void study(){
sout(age);
}}
public class TestStudent{-----------学生测试类
Student s = new Student();
s.age = -16 ;------------------age被private私有化后,访问不到
s.setAge( -16 ) ; -----------调用方法,会进行判断后再赋值(有利于安全性)(需要自己加判断语句)
s.setAge( 16 )--------运行通过
s.study()------------运行输出 16
int b = s.getAge();
sout(b) = 16
}
局部变量和成员变量的名称一样
java会使用就近原则
private int age;
public void setAge( int age ){----------黄色的标识符,都是最近的,因为在setAge的语句体内;
age = age; ---------------age自己给自己赋值,并没赋值给上面的成员变量age
}
xxx.setAge(30);
最终结果是0(int 的默认值),不是30
改进:age = age; → this.age = age ;
this关键字:
含义:代表所在类对象“引用”(地址值)
作用:可调用本类的成员(变量、方法),解决局部变量和成员变量重名的问题
记住:方法被哪个对象调用,this就代表哪个对象
public class Student{------Student类
private String name ;
private int age ;
public void setName(String name){ ---------当setName方法没有被调用时,this不存在任何值(
符合方法是一个独立代码块,无调用就不执行),反之若被调用,则存在地址值,具体下面会讲解
sout(this);
this.name = name ;}
public String getName(){
return name;}
public void setAge(int a){
if(a>0 && a<100){
this.age = a ;
}else{
sout(输入有误)}}}
public int getAge(){
return age;}
public void study(){
sout(age);
}}
public class TestStudent{-----------学生测试类
Student s = new Student();
sout( s ) = 001;
s.setName("张三");-----解剖:↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
相当于 001 . setName("张三");
setName()的方法内容:{
sout(this)= 001;
this.name = name; ---------this为地址值 即001,等式左边的name为堆内存001的成员变量,等式右边的name为传入的参数“张三”。流程即顺着001地址,找到成员变量name,然后将默认值null替换成“张三”。}}
堆内存:(地址值:001)
String name |
null ------ 被“张三”替换 |
int age |
0 |
成员方法地址(指向 “方法区:Student.class文件的study()” 的成员方法的地址值) |
为什么说方法被哪个对象调用,this就代表哪个对象?
首先确定一点,每new一个对象都会产生一个新的地址值。
this.name = name; ---------this为地址值 即001,等式左边的name为堆内存001的成员变量,等式右边的name为传入的参数“张三”。流程即顺着001地址,找到成员变量name,然后将默认值null替换成“张三”。
001.成员变量name = “张三”
疑问:
public int getAge(){
return age ;----------------这里为什么系统会默认加return this . age;???
}