private实现封装处理 &构造方法(匿名对象)

1. private实现封装处理

封装是面向对象李最复杂的概念没使用private关键字实现的封装处理只是封装的第一步,若想完全掌握封装,需要后续将继承和多态学习结束。
举例:无封装程序

class Person{
    String name;
    int age;
    public void getPerson(){
        System.out.println("姓名:" + name + " 年龄:" + age);
    }
}
public class Test{
    public static void main(String[] args){
        Person per = new Person();
        per.name = "zhangsan";
        per.age = 10;
        per.getPerson();
    }
}

在这里插入图片描述
此时,要想回避此类问题,让内部操对外部不可见(对象不能直接操作属性),可使用private进行封装。
举例:使用private封装属性

    private String name;
    private int age;

将属性、方法用private封装后表示:被封装属性及方法只能在本类中使用类外都不可见。在这里插入图片描述
用于private对属性进行了封装,要访问私有属性,按照Java设计原则必须提供一下两种方法:

  1. setter方法:主要用于进行属性内容的设置与修改
  2. getter方法:主要用于属性内容的取得
    举例:扩展Person类的内容
class Person{
	private String name;
	private int age;
	
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		if(age > 0 && age < 150)
		{
			this.age = age;
		}
		else
		{
			this.age = 0;
		}
	}
	public int getAge() {
		return age;
	}
    public void getPerson(){
        System.out.println("姓名:" + name + " 年龄:" + age);
    }
}
public class Test {
	public static void main(String[] args) {
		Person per = new Person();
		per.setName("zhangsan");
		per.setAge(-10);
		per.getPerson();
	}
}

在这里插入图片描述
通过调试我们可以发现,当我们使用setAge()函数对age属性进行设置时,我们虽然传参为-10,但根据条件设置了一个基本值0。
通过以上代码我们可以发现,private实封装的最大特征在于:只允许本类访问,而不允许外部类访问。
类的设计原则:

  1. 类中的所有属性必须使用private封装。
  2. 属性若要被外部访问,必须定义setter、getter方法。

2. 构造方法与匿名对象

上一篇博客中,我们如何产生对象?

①类名称 ②对象名称 =new ④类名称();

针对以上定义我们做了如下分析:

  1. ① 任何对象都应该有其对应的类,类是产生对象的蓝图。
  2. ② 是一个为一的标记,引用一块堆内存
  3. ③ 表示开辟新的堆内存空间
  4. ④ 构造方法
    构造方法就是使用关键字new实例化新对象时来进行调用的操作方法。

2.1 构造方法(类中属性进行初始化)

2.1.1 类中的组成

在上一篇博客中,我们简单的说了类是由属性方法 组成的。现在我们再来看看类中的组成:属性构造方法普通方法

  1. 属性是在对象开辟堆内存是开辟的空间。
  2. 构造方法是在使用new后调用的。
  3. 普通方法是在空间开辟了构造方法执行之后可以多次调用的。

2.1.2 构造方法的三大特征

  1. 方法名称必须和类名称相同
  2. 构造方法没有返回值类型声明
  3. 每一个类中至少存在一个构造方法,如果没有明确定义,系统将会自动生成无参构造。若在类中定义了构造方法,则系统不会默认生成无参构造。
    问题一:构造方法无返回值,为什么没有void声明?
    public void Person(){}  // 命名不标准的普通方法(方法的命名规范:小驼峰)
    public Person(){}   // 无参构造方法

结合1&2来看,编译器是根据程序结构来区分普通方法和构造方法的,所以构造方法前没有返回值类型说明

若类中定义了构造方法,则默认的无参构造将不再生成。

在这里插入图片描述
在自定义了一个带有两个参数的构造方法时,如果我想要调用无参构造来实例化对象,就会报上面的错误,那应该怎么样既可以用同一类名调用带有两个参数的构造方法,也可以调用无参构造。
对于上述情况就有了构造方法重载的定义。

2.1.3 构造方法的重载

参数类型或个数不同

举例:

class Person{
    private String name;
    private int age;
    public Person(){
        System.out.println("0.这是无参构造");
    }
    public Person(String name){
        System.out.println("1.这是带有一个参数的构造方法");
        this.name = name;
    }
    public Person(String name, int age){
        System.out.println("2.这是带有两个参数的构造方法");
        this.name = name;
        this.age = age;    
    }
    public void print_Info()
    {
        System.out.println(this.name + "  " + this.age);
    }
}
public class Test{
    public static void main(String[] args){
        Person per1 = new Person("zhangsan", 18);
        Person per2 = new Person("lisi");
        Person per3 = new Person();
    }
}

运行结果如下:
在这里插入图片描述
建议:若干个构造方法,请按照参数个数升序或降序书写。

在进行类定义时,顺序应为:

  1. 定义属性
  2. 定义构造方法
  3. 定义普通方法

2.2 匿名对象

匿名对象是没有名字的实体,就是该实体没有对应的变量名引用

2.2.1 匿名对象的特征

  1. 创建匿名类的对象只能够调用一次。
  2. 匿名对象只在堆内存中开辟空间,而不存在栈内存的引用
  3. 每次创建匿名对象都是不同的对象
    举例:
public class Test{
    public static void main(String[] args){
        new Person("zhangsan", 18).print_Info();
    }
}

在这里插入图片描述
由于匿名对象不会有任何的栈空间所指向,所以使用一次就成为垃圾空间。

猜你喜欢

转载自blog.csdn.net/meng_lemon/article/details/83591287