当前位置: 移动技术网 > IT编程>开发语言>Java > 封装和构造器

封装和构造器

2018年04月23日  | 移动技术网IT编程  | 我要评论

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

 


 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网