/**
 * @author zhaocx1 private:私有权限修饰符,用于修饰类中的成员(成员变量,成员函数)。私有只在本类中有效。
 *         注意:私有仅仅是封装的一种表现形式 。 之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断等语句。
 *         对访问的数据进行操作,提高代码健壮性。<br />
 *         将age私有化以后,类以外即使建立了对象也不能直接访问。 但是人应该有年龄,就需要在person类中提供对应的访问方式。
 */

public class Person {
	public int age;//定义age属性

	public int getAge() {//定义getAge方法
		return age;//返回一个age
	}

	public void setAge(int a) {//定义setAge方法
		if (a > 0 && a < 130) {
			this.age = a;
		} else {
			System.out.println("false age");
		}
	}

	void speak() {//定义一个函数
		System.out.println("age=" + age);//输出age
	}

	public static void main(String[] args) {//主函数,整个函数的切入点
		Person p = new Person();//实例化Person
		p.setAge(20);//调用setAge方法,并传递一个数值
		p.speak();//调用speak方法
	}
}
/**
 * @author zhaocx1
 *
 */
/*
 * this:看上去,是用于区分局部变量和成员变量的情况。
 * this为什么可以解决这个问题呢?this到底代表的是什么呢?
 * this:就代表本类的对象,到底代表哪一个呢?
 * this代表所在函数所属对象的引用。
 * 简单说:哪个对象在调用 this所在的函数,this就代表哪个函数。
 * 
 * this的应用:当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。 
 * 但凡本类功能内部使用到了本类对象时,都用this表示。
 */

/*
 * 给人定义一个用于比较年龄是否相同的功能,也就是是否是同龄人。
 * 
 */

class PersonP {
	private String name;//定义name属性
	private int age;//定义age属性

	PersonP(int age) {//对age进行构造函数
		this.age = age;//调用本类对象
	}

	PersonP(String name) {//对name进行构造函数
		this.name = name;//调用本来对象
	}

	PersonP(String name, int age) {//对name和age进行共同构造函数
		this.name = name;
		this.age = age;
	}

	public void speak() {//定义方法
		System.out.println("name=" + this.name + "...age=" + this.age);//输出name和age
		this.show();//调用show函数
	}

	public void show() {//定义show函数
		System.out.println(this.name);//输出name
	}

	/*
	 * 需求:给人定义一个用于比较年龄是否相同的功能。也就是是否是同龄人。
	 */
	public boolean compare(PersonP p) {//定义功能,对年龄进行判断
		return this.age == p.age;

	}
}

class Person2 {
	public static void main(String[] args) {//主函数,整个程序的切入点

		PersonP p1 = new PersonP(20);//实例化对象
		PersonP p2 = new PersonP(25);//实例化对象
		boolean b = p1.compare(p2);//判断两个年龄是否相同
		System.out.println(b);//输出判断结果

		PersonP p = new PersonP("李四",26);//实例化对象,并传递名字和年龄
		p.speak();
		
	}
}
/**
 * 
 * @author zhaocx1
 *
 */
/*
 * this语句:用于构造函数之间进行调用。
 * this语句只能定义在构造函数的第一行。因为初始化要先执行。
 */
/*
 * Person p=new Person("李四",30)
 * 该句话都做了什么事情?
 * 1.因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中。
 * 2.执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
 * 3.在堆内存中开辟空间,分配内存地址。
 * 4.在堆内存中建立对象的特有属性,并进行默认初始化。
 * 6.对属性进行显示初始化。
 * 7.对对象进行对应的构造函数的初始化。
 * 8.将内存地址付给占内存中的p变量。
 * 
 */
class PersonA
{
	private String name;//定义name属性
	private int age;//定义age属性
	PersonA(String name)//构造name函数
	{
		this.name=name;//调用本类对象
	}
	PersonA(String name,int age)//构造name和age函数
	{
		this(name);//调用本类对象
		this.age=age;//调用本类对象
	}
	public static void printMesg(String name,int age)//定义一个函数,传递参数name和age
	{
		System.out.println("我的名字是"+name+", 今年"+age+"岁了。");//输出语句,内容为名字和年龄
	}
}
public class PersonDemo3 {
	public static void main(String[] args)//主函数,整个程序的切入点
	{
		PersonA p=new PersonA("李四",30);//实例化PersonP,并传递姓名和年龄
		p.printMesg("李四",30);
	}
}
/**
 * 
 * @author zhaocx1
 * 
 */
/*
 * final:最终。作为一个修饰符。 
 * 1.可以修饰类,函数,变量。
 * 2.被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。
 * 3.被final修饰的方法不可以被覆写。
 * 4.被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,也可以修饰局部变量。
 * 当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字,方便于阅读。
 * 而这个值不需要改变,所以加上final。作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。 单词间通过_连接。
 * 5.内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。
 * 
 * 目前类上两个修饰符:public final private修饰成员
 */
class Demo {
	final int x = 3;// 定义一个全局整型常量,x的值终身为3,不可以被继承
	final double MY_PI = 3.14;// 定义一个全局小数常量,不可以被继承

	final void show1() {// 定义父类中的方法,被final修饰不可以被子类继承,只能在本来中使用
	}

	void show2() {// 定义父类中的方法
		System.out.println("java");// 输出打印父类方法内容

	}
}

class SubDemo extends Demo {// 定义一个子类继承父类

	void show2() {// 覆写父类中的方法
		System.out.println("android");// 输出打印覆写方法在子类中的内容
	}
}

public class Final1Demo {
	public static void main(String[] args) {// 主函数,整个函数的切入点
		SubDemo su = new SubDemo();// new一个子类对象,进行初始化

		su.show2();// 调用父类中的方法
	}

}