DAY07-匿名对象,封装,对象实例化

今日内容:匿名对象,封装,对象实例化

匿名对象

没有名字的对象,没有任何引用所指向的对象。
匿名对象访问属性是没有意义的,因为匿名对象访问完之后会立刻成为垃圾,如果访问对象相当于没有进行任何操作,访问方法有一点意义,但是只能调用一次方法,一把用来测试某个方法是否正确,常用来作为参数进行传递。

class  Test {
	public static void main(String[] args){
		//创建对象
//		Person  p = new Person(); //p引用变量--类 类型的变量
//		//访问类中的成员
//		String n = p.name;  //获取
//		p.name = "张三";  //赋值
//
//		p.eat();
//
//		Person p1 = p;
//		System.out.println(p1.name);


//		new Person();  //匿名对象,左边没有“=”部分
//		new Person().name = "小明";
//		System.out.println(new Person().name);

//		new Person().eat();
//		new Person().sleep();

//		Person p = new Person();	//此处的p指向了堆内存,
//		changeName(p);	//此处的p指向了changeName的Person p中的p,然后随着上面的p指向了堆内存

		changeName(new Person());	//相当于上面的简写形式,区别是
	}
	
	//给每一个人该名字
	public static void changeName(Person p){  // p = new Person();	//给人改名,所以括号里的变量是 人,Person p相当于定义了一个 人 的变量
		p.name = "小明";
	}
}

//描述人这类事物
class Person{
	//属性
	String name; //姓名
	int age; //年龄

	//行为
	public  void  eat(){
		System.out.println("吃饭");
	}

	public void sleep(){
		System.out.println("睡");
	}
}

封装

class  Demo2 {
	public static void main(String[] args){
		Student s = new Student(); //创建一个学生对象
//		s.age = 1800;
//		s.name = "@#$@#$@$";		//不能随便赋值,要加一个限定,所以要封装,用private


//		s.set(-18);

//		s.say();

		s.method();

	}
}

class Student{
	private String name;	//限制修饰符
	private int age;


	//由于对属性的操作有两种方式:获取和赋值。因此,创建两个方法

	//赋值
	public  void   setAge(int a){ //a = -18
		if(a > 0 && a < 120)
			age = a;
		else
			System.out.println("年龄不合法");
	}
	//获取
	public  int  getAge(){
		return age;
	}

	public  void  setName(String s){
		name = s;
	}

	public  String getName(){
		return name;
	}


	public void study(){
		System.out.println("学Java");
	}

	public void say(){
		System.out.println(name+"....."+age);
	}


	private void show(){
		System.out.println("show");
	}

	public void method(){
		show();
	}
}

this关键字

代表的是对象的引用,可以解决成员变量和局部变量的重名问题,this.name=name;谁调用了这个方法,this就代表谁的变量。

构造方法:

修饰符 方法名(即类名)(参数列表){
语句;
}

class Demo4  {
	public static void main(String[] args){
		Person p = new Person();
//		p.setName("张三");
//		p.setAge(6);
//		p.setName("张四");
		System.out.println(p.getInfo());
	}
}

class Person{
	private String name;
	private int age;

	//构造器方法
	public Person(){		//构造方法一般写两个,第一个不写形参,第二个写形参,这样定义的时候就可以直接写Person p=new Person();如果构造方法带形参,则定义的时候要写出来,否则会报错:Demo3.java:11: 错误: 无法将类 Student中的构造器 Student应用到给定类型;
//		for(int i = 0; i < 5; i++)
//			System.out.println("i= "+i);
		setName("aa");
	}

	public Person(String name){
//		this();
		this.name = name;
	}

//	public Person(int age){
//		this.age = age;
//	}

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


	//添加set方法
	public void setName(String name){
		this.name = name;
		System.out.println("....");
	}

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


	//用于返回对象属性信息
	public  String  getInfo(){
		return name+"...."+age;
	}
}

对象实例化过程

Person p=new Person();
1.讲Person.class文件加载到内存中的方法区
2.在堆中开辟空间,并分配内存地址值
3.存储对象属性的默认值
4.如果有显示值,会将显示值赋值给对象的属性
5.执行构造器方法
6.将地址值赋值给p引用

调用重载的构造器方法,要使用this(参数列表);且该语句必须放在构造器方法的第一行。(即第一个构造器调用第二个构造器,非构造器方法不受限制)
注意:使用了this(参数列表);调用类中的重载构造方法时,主义出现死循环,所以不能每个构造器方法都有this。

实体类

1.私有化属性(即用private修饰)
2.给属性提供对应的set和get方法
3.至少两个构造方法,无参数列表的和有参数列表的
4.编写一个用于返回对象信息的方法

构造方法也是方法,因此可以在大括号里编写逻辑代码,或者是调用其他普通方法,但普通方法不能调用构造方法。

猜你喜欢

转载自blog.csdn.net/qq_42837554/article/details/87951364