封装和构造器
Lesson Eight 2018-04-23 02:07:01
封装与隐藏:
问题:当创建了类的对像以后,如果直接通过“对象.属性”的方式对相应的对像属性赋值的话,可能会出来不满足实际情况的意外。
引出:通过“对像 .方法”的形式,来控制对像对属性的访问。对属性的要求术可以通过方法来体现。
解决:1.将类的属性私有化,2.提供公共的方法(setter & getter)来实现调用。 即封装。
class Person { // 将成员属性私有化 private String name; private int age; // 1.将类的属性私有化,2.提供公共的方法(setter & getter)来实现调用。 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } // 条件判断控制数据写入 public void setAge(int age) { if (age > 0 && age < 130) { this.age = age; } else { // System.out.println("输入有误"); throw new RuntimeException("输入有误"); } } }
权限修饰符:
private(类的内部)
缺省(类的内部、同一个包)
prtected(类的内部、同一个包、子类)
public(类的内部、同一个包、子类、任何地方)
1.以上权限从小到大排列,可以修饰属性和方法
2.对于class 的权限修饰只能有 public 和default
如图:
构造器 (constructor、构造方法)
一、构造器的作用: 1.创建对象 2.给创建的对象的属性赋值
1.设计类时,若不显式声明类的构造器的话,程序会默认提供一个空参构造器
2.一旦显式的定义了类的构造器,那默认的构造器就不再提供
3.如何声明类的构造器。 格式: 权限修饰符 类名(形参){}
4.类的多个构造器之间构成重载
二、类对象的属性赋值的先后顺序:
1.属性的默认初始化 (JDK自动完成)
2.属性的显式初始化 (人为手动完成)
3.通过构造器给属性初始化 (人为手动完成)
4.通过“对像.方法”的方式给属性赋值 (人为手动完成)
三、注意:
1.创建对像的时候会自行调用构造器(构造方法)
2.可以有多个,根据参数类型的不同和参数列表的不同进行区分
3.构造器就像一个特别的方法,跟方法有以下的区别:
3.1构造器名称必须和类型相同,方法则不需要
3.2构造器不是允许有返回值,方法则必须有返回值 如果有返回值就等同于普通方法
3.2构造器不可以通过方法来调用,方法由需要通过对像来调用
public static void main(String[] args) { // TODO Auto-generated method stub Person p1 = new Person(); Person p2 = new Person("fkuennhvo"); Person p3 = new Person("fkuennhvo",24); System.out.println(p1.getName()); System.out.println(p2.getName()+p2.getAge()); System.out.println(p3.getName()+p3.getAge()); } } class Person{ //属性 private String name; private int age; //构造器 public Person(){ } public Person(String n){ name = n; } public Person(String name , int age){ this.name = name; this.age = age; } //方法 public void setName(String n){ name = n; } public void setAge(int a){ age = a ; } public String getName(){ return name; } public int getAge(){ return age; } }
有个没解决的问题:!
public static void main(String[] args) { // TODO Auto-generated method stub // Scanner scanner = new Scanner(System.in); TestTriAngle t = new TestTriAngle(); int S = t.S; // 为什么最后结果还是为0!!! System.out.println(S); } } // 获取三角形的宽(K)和高(C) class TriAngle { private int C, K; public int getC() { return C; } public void setC(int c) { C = c; } public int getK() { return K; } public void setK(int k) { K = k; } // 带参构造,接收宽和高 public TriAngle(int C, int K) { this.C = C; this.K = K; } } // 用于计算三角形的面积 // S = C*K/2 class TestTriAngle { int S; public void Tri() { // 创建带参构造器并传入宽,高进去。 TriAngle T = new TriAngle(3, 4); this.S = T.getC() * T.getK() / 2; // 问题,这个 this.S 难道不是指向那个成员变量的吗? } }