24H免费课程咨询  TEL:13401595960   QQ:1870218756  微信:13401595960(李老师)

东方博宜

网站首页 > 软件开发资讯 > Java开发

Java编程基础:面向对象(2)权限修饰符和this关键字

2017-06-15 15:23:29 东方博宜 阅读

5:权限修饰

 private:
  是一个权限修饰符
  可以修饰成员变量和成员方法
  被其修饰的成员只能在本类中被访问

class Demo {
 //int num = 10;
 //用private修饰
 private int num = 10;
 
 public void show() {
  System.out.println(num);
 }
 
 private void method() {
  System.out.println("method");
 }
 
 public void function() {
  method();
 }
}

class PrivateDemo {
 public static void main(String[] args) {
  Demo d = new Demo();
  //不能访问私有的成员变量
  //System.out.println(d.num);
  d.show();
  //不能访问私有的成员方法
  //d.method();  就是这个是不行的
  d.function();
 }
}

/*
 定义一个学生类:
  成员变量:name,age
  成员方法:show()方法
  
 我们在使用这个案例的过程中,发现了一个问题:
  通过对象去给成员变量赋值,可以赋值一些非法的数据。
  这是不合理的。
  应该是这个样子的:在赋值之前,先对数据进行判断。
  判断到底在哪里做比较合适呢?
  StudentDemo类是一个测试类,测试类一般只创建对象,调用方法。 
  所以,这个判断应该定义在Student类中。
  而我们在成员变量的位置可不可以进行数据判断呢?
  是不可以的,因为做数据校验,必须要依靠一些逻辑语句。
  逻辑语句是应该定义在方法中的,所以,我们最终决定在Student类中提供一个方法
  来对数据进行校验。
 
 按照我们前面的分析,我们给出了一个方法进行校验。
 但是呢,它偏偏不调用方法来赋值,还是直接赋值了,
 这样我们的方法就没有起到作用。
 我就应该要求你必须使用我的方法,而不能直接调用成员变量赋值。
 怎么去强制要求不能直接使用成员变量呢?
  针对这种情况,Java就提供了一个关键字 private
  
 private:私有的。可以修饰成员变量和成员方法。
  注意:被private修饰的成员只能在本类中访问。
  
 其实我讲到现在讲解的是一个封装的思想。
 封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
*/
class Student {
 //姓名
 String name;
 //年龄
 private int age;
 
 //写一个方法对数据进行校验
 /*
  返回值类型:void
  参数列表:int a
 */
 public void setAge(int a) {
  if(a < 0 || age > 120) {
   System.out.println("你给的年龄有问题");
  }else {
   age = a;
  }
 }
 
 
 //show()方法,显示所有成员变量值
 public void show() {
  System.out.println("姓名:"+name);
  System.out.println("年龄:"+age);
 }
}

class StudentDemo {
 public static void main(String[] args) {
  //创建学生对象
  Student s = new Student();
  s.show();
  System.out.println("--------------");
  
  //给成员变量赋值
  s.name = "林青霞";
  //s.age = 27;
  s.setAge(27);
  s.show();
  System.out.println("--------------");
  
  //给age赋值
  //s.age = -27; //这个数据是不合理的
  //通过方法给值
  s.setAge(-27);
  s.show();
  System.out.println("--------------");
 }
}

 

/*
 封装和private的应用:
  A:把成员变量用private修饰
  B:提供对应的getXxx()和setXxx()方法
*/
//定义学生类
class Student {
 //姓名
 private String name;
 //年龄
 private int age;
 
 //姓名获取值
 public String getName() {
  return name;
 }
 
 //姓名设置值
 public void setName(String n) {
  name = n;
 }
 
 //年龄获取值
 public int getAge() {
  return age;
 }
 
 //年龄赋值
 public void setAge(int a) {
  age = a;
 }
}

//测试类
class StudentTest {
 public static void main(String[] args) {
  //创建学生对象
  Student s = new Student();
  
  //使用成员变量
  //错误:被私有修饰了,外界不能直接访问了
  //System.out.println(s.name+"---"+s.age);
  System.out.println(s.getName()+"---"+s.getAge());
  
  //给成员变量赋值
  //s.name = "林青霞";
  //s.age = 27;
  //通过方法给赋值
  s.setName("林青霞");
  s.setAge(27);
  System.out.println(s.getName()+"---"+s.getAge());
 }
}
/**
get 和set的使用方法
 1: 首先是定义了一个类 在这个类中有有一些私有变量 但是私有变量只能在本类中使用 在
  别的类中是不可以使用的 所以经过一些在本类中的一些共有的方法的设置 使他们去访问那些私有变量
  在外面我们就只调用这些方法就可以了 所以就有了get和set方法 get 方法是获取数据 set方法是设置数据
  通过这样的方法就可以实现这样的事情 就是将这些私有变量设置值

*\

 

6:this关键字

/*
 作业:请把手机类写成一个标准类,然后创建对象测试功能。
 
 手机类:
  成员变量:
   品牌:String brand;
   价格:int price;
   颜色:String color;
  成员方法:
   针对每一个成员变量给出对应的getXxx()/setXxx()方法。
  最后定义测试:
   创建一个对象,先通过getXxx()方法输出成员变量的值。这一次的结果是:null---0---null
   然后通过setXxx()方法给成员变量赋值。再次输出结果。这一次的结果是:三星---2999---土豪金
*/
class Phone {
 //品牌
 private String brand;
 //价格
 private int price;
 //颜色
 private String color;
 
 //getXxx()和setXxx()方法
 public String getBrand() {
  return brand;
 }
 
 public void setBrand(String brand) {
  this.brand = brand;
 }
 
 public int getPrice() {
  return price;
 }
 
 public void setPrice(int price) {
  this.price = price;
 }
 
 public String getColor() {
  return color;
 }
 
 public void setColor(String color) {
  this.color = color;
 }
}

class PhoneTest {
 public static void main(String[] args) {
  //创建手机对象
  Phone p = new Phone();
  
  //直接输出默认值
  System.out.println(p.getBrand()+"---"+p.getPrice()+"---"+p.getColor());
  
  //给成员变量赋值  记住这写都是些方法
  p.setBrand("三星");
  p.setPrice(2999);
  p.setColor("土豪金");
  //再次输出
  System.out.println(p.getBrand()+"---"+p.getPrice()+"---"+p.getColor());
  

)
 
}

 

/*
 我们曾经曰:起名字要做到见名知意。
 
 this:是当前类的对象引用。简单的记,它就代表当前类的一个对象。
 
  注意:谁调用这个方法,在该方法内部的this就代表谁。
  
 this的场景:
  解决局部变量隐藏成员变量
*/
//定义学生类
class Student {
 //姓名
 private String name;
 //年龄
 private int age;
 
 //姓名获取值
 public String getName() {
  return name;
 }
 
 //姓名设置值
 public void setName(String name) { //name = "林青霞";
  //name = name; //变量的使用规则:就近原则
  //这里是类名,目前还没有说过类似的用法,所以这个是有问题的
  //这里的调用只能通过对象名
  //这个对象如果存在,它应该代表的是Student的一个对象。
  //那么,谁能够代表当前类的对象呢? java就提供了一个关键字 this
  //Student.name = name;
  this.name = name;
 }
 
 //年龄获取值
 public int getAge() {
  return age;
 }
 
 //年龄赋值
 public void setAge(int age) {
  this.age = age;
 }
}

//测试类
class StudentTest {
 public static void main(String[] args) {
  //创建学生对象
  Student s = new Student();
  
  //给成员变量赋值
  s.setName("林青霞");
  s.setAge(27);
  //获取数据
  System.out.println(s.getName()+"---"+s.getAge());
 }
}

                                图四 this关键字的内存图解

 图片.png

 

/*
 标准的代码改进版
 
 this:哪个对象调用那个方法,this就代表那个对象
*/
class Student {
 private String name;
 private int age;
 
 public String getName() {
  return name; //这里其实是隐含了this
 }
 
 public void setName(String name) {
  this.name = name;
 }
 
 public int getAge() {
  return age;
 }
 
 public void setAge(int age) {
  this.age = age;
 }
}

class StudentTest2 {
 public static void main(String[] args) {
  //创建一个对象
  Student s1 = new Student();
  s1.setName("林青霞");
  s1.setAge(27);
  System.out.println(s1.getName()+"---"+s1.getAge());
  
  //创建第二个对象
  Student s2 = new Student();
  s2.setName("刘意");
  s2.setAge(30);
  System.out.println(s2.getName()+"---"+s2.getAge());
 }
}


Powered by 东方博宜教育咨询江苏有限公司  ©2008-2017 www.czos.cn