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 难道不是指向那个成员变量的吗?
}
}