Day09-面向对象(2)

文章目录


一、构造方法

含义:与类名形同,且没有返回项的方法

作用:

  1. 创建对象(new 构造方法() 创建对象)

  2. 初始化数据

注意:没有参数的构造方法叫做无参构造,当没有其他有参构造时,系统会默认实现

构造方法 vs 普通方法(成员方法和静态方法)

构造方法:必须和类名相同且没有返回项

普通方法:必须有返回项(不管是返回具体的值还是void)

人类

package com.dream.test01;

public class Person {
	
	String name;
	char sex;
	int age;
	
	public Person(){
		
	}
	
	public Person(String name,char sex,int age){
		this.name = name;
		this.sex = sex;
		this.age = age;
	}
	
	public void eat(){
		System.out.println(this.name + "吃饭饭");
	}
	
	public void sleep(){
		System.out.println(this.name + "睡觉觉");
	}

}

测试类

package com.dream.test01;

public class Test01 {
	
	public static void main(String[] args) {
		/**
		 * 构造方法的知识点
		 * 
		 * 创建对象的语法:
		 * 		数据类型 引用/变量 = new 构造方法();
		 * 
		 * 含义:与类名相同且没有返回项的方法叫做构造方法
		 * 
		 * 注意:该类没有有参构造时,会自动生成无参构造
		 * 
		 * 作用:
		 * 	1.和new 一起创建对象
		 *  2.初始化数据
		 */
		
		Person p1 = new Person("杨晨", '男', 18);
		System.out.println(p1.name);
		p1.eat();
		p1.sleep();
		
		Person p2 = new Person("麻生希", '女', 23);
		System.out.println(p2.name);
		p2.eat();
		p2.sleep();
		
	}

}

二、private

含义:私有化

作用:

  1. 修饰属性:私有化属性,外界不能被调用

  2. 修饰方法:私有化方法,外界不能被调用

    外界:类的外面

应用场景:

​ 如果当前类的属性不想让外界调用,就用private修饰

​ 如果当前类的方法不想让外界调用,就用private修饰

A类

package com.dream.test02;

public class A {
	
	private String str;
	
	private void method(){
		System.out.println("aaaa");
	}

}

测试类

package com.dream.test02;

public class Test01 {
	
	public static void main(String[] args) {
		/**
		 * private私有化
		 */
		
		A a = new A();
		
		//私有化属性后,不能被外界调用
//		a.str = "xxx";
//		System.out.println(a.str);
		
		//私有化方法后,不能被外界调用
//		a.method();
		
	}

}

三、封装

好处:避免直接操作属性,可以在set/get方法中做额外的功能

步骤:

  1. 私有化属性

  2. 添加get/set方法

人类

package com.dream.test03;

public class Person {
	
	private String name;
	private char sex;
	private int age;
	
	public Person(){
		
	}
	
	public Person(String name,char sex,int age){
		this.name = name;
		this.sex = sex;
		this.age = age;
	}
	
	public String getName(){
		return name;
	}
	
	public void setName(String name){
		this.name = name;
	}
	
	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public void eat(){
		System.out.println(this.name + "吃饭饭");
	}
	
	public void sleep(){
		System.out.println(this.name + "睡觉觉");
	}

}

测试类

package com.dream.test03;

public class Test01 {
	
	public static void main(String[] args) {
		/**
		 * 封装
		 * 
		 * 步骤:
		 * 	1.私有化属性
		 *  2.添加get/set方法
		 */
		
		Person p1 = new Person("杨晨", '男', 18);
		
		p1.setName("陈希");
		
		System.out.println(p1.getName());
	}

}

四、小结

编写一个类的步骤:

  1. 编写属性,并用private私有化

  2. 创建无参构造和有参构造

  3. 添加get/set方法

  4. 添加其他方法

为什么私有化属性?

不想让外界随便调用,考虑到数据的安全性

为什么添加无参构造和有参构造?

添加有参构造的目的方便在创建对象时就初始化数据,但是编写了有参构造,系统就不会默认实现无参构造,所以自己还要去写一个无参构造

为什么添加get/set方法?

因为私有化属性后,使用get/set方法对外提供获取和设置的功能,还可以额外添加功能

五、this

含义:本对象

作用:

  1. this.属性:调用本对象属性

  2. this.方法:调用本对象方法

  3. this() : 调用本对象构造方法
    人类

package com.dream.test04;

public class Person {
	
	private String name;
	private char sex;
	private int age;
	
	public Person() {
		this("默认姓名",'男',18);
	}

	public Person(String name, char sex, int age) {
		this.name = name;
		this.sex = sex;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public void eat(){
		System.out.println(this.name + "吃饭饭");
		this.sleep();
	}
	
	public void sleep(){
		System.out.println(this.name + "睡觉觉");
	}
	
	

}

测试类

package com.dream.test04;

public class Test01 {
	
	public static void main(String[] args) {
		/**
		 * this:本对象
		 * 
		 * 作用:
		 * 	1.this.属性:调用本对象的成员属性
		 * 	2.this.方法:调用本类的成员方法
		 *  3.this():调用本类的构造方法(this()只能写在构造方法的第一句)
		 * 	
		 */
		
		Person p1 = new Person("杨晨", '男', 18);
		Person p2 = new Person("陈希", '男', 23);
		Person p3 = new Person();
		
		System.out.println(p3.getName());
		System.out.println(p3.getSex());
		System.out.println(p3.getAge());
		
	}

}

六、分包

基本的好处:防止了类的重名

项目中的好处:项目中有很多类,类的功能也不一样,可以把相似的类放在一个包里

七、static(上)

含义:静态的

作用:

  1. 修饰属性:类属性/静态变量,直接用类名调用,该类的每个对象共享一份

    静态变量的生命周期:

    1. 在类加载到方法区时,系统会扫描该类的静态变量并存放在静态区中
    2. 项目结束时,静态区中的数据才会被回收

    应用场景:static + final(下周去学习)
    A类

package com.dream.test05;

public class A {
	
	String str1;
	
	//准备阶段1:String str2;
	//准备阶段2:String str2 = null;
	//初始化阶段:String str2 = "静静";
	static String str2 = "静静";
	
	//准备阶段:String str3;
	//准备阶段:String str3 = "涵涵";
	static final String str3 = "涵涵";
}

测试类

package com.dream.test05;

public class Test01 {
	
	public static void main(String[] args) {
		/**
		 * static修饰属性
		 */
		
		A a1 = new A();
		A a2 = new A();
		
		a1.str1 = "xxx";
		a2.str1 = "yyy";
		System.out.println(a1.str1);//xxx
		System.out.println(a2.str1);//yyy
		
//		a1.str2 = "aaa";
//		a2.str2 = "bbb";
//		System.out.println(a1.str2);//bbb
//		System.out.println(a2.str2);//bbb
		
		A.str2 = "aaa";
		A.str2 = "bbb";
		System.out.println(A.str2);
	}
}

package com.dream.test06;

public class Test01 {
	
	public static void main(String[] args) {
		/**
		 * static修饰属性的面试题/类加载机制的面试题
		 */
		
		A a = A.getInstance();
        System.out.println("A value1:" + A.value1);//1
        System.out.println("A value2:" + A.value2);//0
        
        B b = B.getInstance();
        System.out.println("B value1:" + B.value1);//1
        System.out.println("B value2:" + B.value2);//1
	}
}

class A{
	
	
	//A a = new A();
	//int value1 = 1;
	//int value2 = 0;
	
    private static A a = new A();
    public static int value1;	
    public static int value2 = 0;

    private A(){
        value1++;
        value2++;
    }

    public static A getInstance(){
        return a;
    }
}

class B{
	//int value1 = 1;
	//int value2 = 1;
	//B b = new B();
	
    public static int value1;
    public static int value2 = 0;
    private static B b = new B();

    private B(){
        value1++;
        value2++;
    }
    public static B getInstance(){
        return b;
    }

}


上一篇:制作新闻列表--Day09


下一篇:Day09-阿里云视频点播文档-p140