欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

封装和构造器

程序员文章站 2022-09-24 18:16:58
Lesson Eight 2018-04-23 02:07:01 封装与隐藏:问题:当创建了类的对像以后,如果直接通过“对象.属性”的方式对相应的对像属性赋值的话,可能会出来不满足实际情况的意外。 引出:通过“对像 .方法”的形式,来控制对像对属性的访问。对属性的要求术可以通过方法来体现。 解决:1 ......

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