java封装和构造器_封装和构造器

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

如图:

7de285ebebcb0ab23ce2360d5832d55d.png

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

}

}

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值