今日内容:匿名对象,封装,对象实例化
匿名对象
没有名字的对象,没有任何引用所指向的对象。
匿名对象访问属性是没有意义的,因为匿名对象访问完之后会立刻成为垃圾,如果访问对象相当于没有进行任何操作,访问方法有一点意义,但是只能调用一次方法,一把用来测试某个方法是否正确,常用来作为参数进行传递。
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.编写一个用于返回对象信息的方法
构造方法也是方法,因此可以在大括号里编写逻辑代码,或者是调用其他普通方法,但普通方法不能调用构造方法。