目录
类:
用来描述一个类型事物的特征,里面有属性和方法
属性:类的特性,定义变量,比如String name,int age
方法:类的行为,定义方法,比如public void sleep(){ }
一般定义属性时不赋值,只定义就行
构造方法:
对于类的属性的初始化,可以给属性赋值,没有返回值类型
即 public people(){} 而不是public void people(){}或者public int people(){}
name = "陈独秀";age=10086;
构造方法本质是一个方法,可以传参也可以不传参,可以重载
对于私有的方法,外界想要调用,就生成个新的公开的方法,调用这个方法
比如 private 的方法eat,想在main里调用,正常调用不出来,报错
但是可以写一个 eat2 ,方法里{ eat();}
这样调用eat2的时候就会去执行一下eat,单独调用eat又调用不出来
eat2就是个第三方,接口,工具人,保护了eat
对于私有的属性,外界想要调用,就要用到get set方法
get方法是帮助获取这个私有的属性,set方法是为了设置这个私有属性
比如:初始定义String name,调用输出name是 默认值null
在构造方法中赋值"陈独秀",调用输出name是 陈独秀
经历get set重新赋值"李大钊",调用输出name是 李大钊
一般set方法是void,那么调用时,对外输出的是这个方法
一般get方法是对应的数据类型,调用时,对外输出的是返回值
链式的set方法是对应数据类型,调用时,对外输出的是返回值
浅显理解:如果对外输出的是方法,那就是执行方法的代码块
不能放在输出语句,不能.出东西来
如果对外输出的是返回值,执行完方法代码后返回值
可以放在输出语句里,能.出东西来
this关键字
代表的就是对象名,代表这个对象专有的
比如对象名是cat,调用cat的name属性
在cat类里是this.name,对应main方法cat.name
每次创建对象调用这个方法,this就代表当前这个对象
this()或this(参数)可以在构造方法中使用,必须放在第一行,且两个构造方法之间不能相互调用
局部变量和成员变量:
比如在类里定义了私有的String name,为了让外界能调用私有name,得用get set
利用get方法获取信息,利用set方法设置信息,得到this.name=name
这时name是成员变量,所用域是整个class,this.name就是当前对象的name
但在方法中又String name,这时的name是局部变量,只在方法中有效
想要用对象属性,就得用this.name
浅显理解:定义一个类,String name,在构造方法中设置名字是"张三"
在类中定义方法kill,也有个String name,设置名字是"李四"
想要表达张三杀李四,需要在kill方法输出语句中同时用上两个人的名字
表达为:System.out.println(this.name+"杀死了"+name);
this.name是类的主人张三,name是方法的主人李四
如果只写:System.out.println(name+"杀死了"+name);
这时两个name都是李四,是不能指代两个不同的人的
在kill方法中 name是指李四,this.name是指张三
在kill方法外class内,name和this.name都是张三
因为超过李四的管辖范围了
构造代码块 局部代码块:
构造代码块是写在类里面的,比如一个类写了三个构造方法
第一个构造方法输出:冯老师 睡觉
第二个构造方法输出:冯老师 吃饭
第三个构造方法输出:冯老师 上课
这样冯老师这句就是重复的,可以写进构造代码块
{ System.out.println("冯老师"); }
每次调用这个类,都会执行构造方法,再执行普通方法
如果有构造代码块,就是:构造代码块,构造方法,普通方法
局部代码块是写在普通方法里的,构造方法没有返回值类型,普通方法有
也是{ }里写东西,在调用普通方法时,就按照顺序执行,从上到下
总共的执行顺序:
创建对象: Car c1;
指向地址:c1=new Car();
其实也就是 Car c1=new Car();
然后:构造代码块-->构造代码,相当于给他初始化
最后:按照从上到下顺序,调用啥执行啥,不调用的不执行
浅层复制:
生成对象: Car c1=new Car(); 这个c1就生成了自己的地址
但是如果是:Car c2; 就只创建了对象,没有开辟地址
如果把:c2 = c1; 就是把c2指向了c1的地址,住进他家占他地址
c1 ---> 地址 <-----c2 如果c2里有东西改变了,就改变了地址里东西,c1也会变
垃圾处理器:
再生成对象 Car c3=new Car(); 生成了c3,有自己的地址
重新赋值:c3=null 给c3赋值为null,地址没了,地址就被放进垃圾处理器了
首先明确:
如果这个方法没有返回值,那么调用方法就只是方法体本身,执行完就完事
如果这个方法有返回值,那么调用方法执行完方法体本身后,还能返回一个东西,就看return后边写啥
无论是否有返回值,无论调用还是赋值,只要出现这个方法,就一定把方法中所有东西执行一遍
比如一个计算加和的方法 sum
第一个有void,{ 输出语句:输出a+b}
第二个是int类型,{ 输出语句:输出a+b ,return a+b }
第一个方法,就是执行输出语句,调用sum(),就执行输出语句,输出结果是:输出a+b
第二个方法调用,也是执行输出语句,但因为返回了一个值,所以只能放在输出语句里
System.out.println( sum() );先执行本身方法,在输出返回值,输出结果是:输出a+b a+b
链式编程:
和正常写代码是一样的,只不过改变了一点点东西让代码好看点
正常写get和set代码是:
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
就是:get的有返回值,set的没有返回值
get是获取,获取到变量值并且返回,这样调用get方法就能得到一个数,放进输出语句里
set是设置,设置传递参数并且把这个参数赋值给this.name,执行方法没有返回值,就运行一遍
设置参数就是
dog.setName("雪球 ");
dog.setColor("white ");
总之就是一句一换行写,不咋好看
但是!链式编程:
public String getName() {
return name;
}
public Dog setName(String name) {
this.name = name;
return this;
}
get的不变,set的变成了有返回值,void ->数据类型返回的是对象,也就是类名Dog
这样调用set方法,执行完代码之后返回了 this,this又可以.出东西来,就可以写一串
dog.setName("雪球 ").setColor("white ").setAge(2);
相当于 this . this . this