在说类与对象之前,我要先理解什么是面向过程,什么是面向对象,首先面向过程关注的是做事的步骤也就是过程,而面向对象关注的是每个对象(实例)交互完成事情。举两个例子,你觉得吃外卖已经吃到吐了打算自己做饭,那么你就要自己想好要做什么菜->买菜->洗菜->切菜->炒菜->吃饭,这是一个过程,你需要关注这其中的每一步该如何做,这个过程就是面向过程。当你觉得自己好久没吃外面的味道了,于是决定去餐馆,到了餐馆坐下,点完餐后,上餐就吃饭,吃完就付钱回家,你并不需要关注菜是怎么炒的,也不知道有没有放科技与狠活,你也不许关注吃完饭后要怎么收拾,这就是一个面向对象,通过人、手机、食材、厨具就完成了吃饭问题。接下来让我们在谈谈类与对象。
类,是什么呢?类是一类事物抽象出来的模版,是这一类事物都有的信息,当我们创建了这样一个含有这类事物属性行为模版,我们下次需要描述这一类里面的一个事物,只需要将这个类实例化如第7行代码:
class Stu{
String name;
int age;
}
public class Fix{
public static void main(String [] args){
Stu student1=new Stu();
student1.name="xixi";
}
}
这样就实例化了一个对象(学生),不用在次去构建她的属性,提高开发效率。类需要用class关键字进行定义,类名用大驼峰写法(每个单词首字母大写),实例化对象时,用类名 对象名=new 类名(),现在让我们先解释一下什么叫对象,再来阐述类与对象的内部。
对象,对象就是一个具体的实例,世间处处有对象,所以以后不能再说自己找不到对象了,对象多的是(嘿嘿嘿)。对象就是一个具体实际事物(不伙同类一起搞抽象),如上图我就实例化了一个叫xixi的学生,就是这样。
类内部包含属性与行为,属性又称为成员变量,如下图中name、age,行为也称方法,下图的eat方法就是其行为上课,实例化后初始化对象第1种初始化对象的方法,每个成员变量引用访问后赋值。
class Stu{
String name;
int age;
public void eat(){
System.out.print("上课");
}
}
public class Fix{
public static void main(String [] args){
Stu student1=new Stu();
student1.name="xixi";
student1.age=19;
student1.eat();
}
}
第二种赋初值方式是使用构造方法,实例化对象必须要有的两个步骤:1.给对象分配空间2.调用构造方法,(若不写用idea可以自动帮你生成一个默认无参的构造方法),写了很多个构造方法的话会发生重载,用this(有参写,无参不写)在一个构造方法里调用其它构造方法。用构造方法传参初始化直接在括号里传参。第三种通过代码块初始化。
第四种成员变量和方法会被访问限定符修饰,访问限定修饰符分为public(公有)【谁都可以访问】、private(私有)【同一类里才可以访问】、default(未写其它访问限定符时默认)【同一个类或同一个包的不同类都可以访问】、protected【同一包里的或不同包的子类才可访问】。当成员变量被private修饰后不可直接访问,(把细节隐藏只留下公共部分供访问----封装)可通过get与set方法进行赋值和访问,如图:
class Stu{
private String name;
private int age;
public void eat(){
System.out.print("上课");
}
//构造方法
public Stu(String name,int age){//构造方法无返回值类型且方法名必须和类名一致
this.name=name;//用this修饰告诉值赋给当前对象,防止出现name=name带来的不良影响
this.age=age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
public class Fix{
public static void main(String [] args){
Stu student1=new Stu("xixi",19);//实例化的同时传给构造方法
student1.eat();
student1.setName("lisa");
student1.setAge(19);//通过set与get方法初始化
}
}
接下来还有一种初始化,被static修饰的成员变量初始化,也叫静态成员变量存于方法区中,生命周期伴随类的一生,随类的加载而创建,访问可通过类名访问也可通过对象访问(不推荐),其初始化有四种:1.就地初始化;2.通过上面的get、set方法初始化;3.代码块初始化,切记不能用构造方法因为构造方法与对象绑定,而静态成员变量属于类不属于某一个对象,如图:
class Stu{
private String name;
private int age;
private static String num="123444";//第一种初始化
public void eat(){
System.out.print("上课");
}
//构造方法
public Stu(String name,int age){//构造方法无返回值类型且方法名必须和类名一致
this.name=name;//用this修饰告诉值赋给当前对象,防止出现name=name带来的不良影响
this.age=age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
//第二种代码块初始化静态成员变量
static{
num="345436";//第二种初始化,类加载的的时候执行
}
public static void setNum(String num){
Stu.num=num;
}
public static String getNum(){
return num;
}
public class Fix{
public static void main(String [] args){
Stu student1=new Stu("xixi",19);//实例化的同时传给构造方法
student1.eat();
student1.setName("lisa");
student1.setAge(19);//通过set与get方法初始化打印号码
Stu.setNum("231444");//第三种set与get方法初始化静态成员变量
System.out.print("Stu.getNum");//打印号码
}
}
最后我要说一下类和对象的打印,第一种直接传入参数,打印语句的括号里访问每个成员变量即可;第二种在类中写入toString方法,在主类打印语句里直接写上创建的对象名即可,如图:
class Stu{
private String name;
private int age;
private static String num="123444";//第一种初始化
public void eat(){
System.out.print("上课");
}
//构造方法
public Stu(String name,int age){//构造方法无返回值类型且方法名必须和类名一致
this.name=name;//用this修饰告诉值赋给当前对象,防止出现name=name带来的不良影响
this.age=age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
//第二种代码块初始化静态成员变量
static{
num="345436";//第二种初始化,类加载的时候执行
}
public static void setNum(String num){
Stu.num=num;
}
public static String getNum(){
return num;
}
public String toString(){
return "["+this.name+","+this.age+","+num"]";
}
public class Fix{
public static void main(String [] args){
Stu student1=new Stu("xixi",19);//实例化的同时传给构造方法
student1.eat();
student1.setName("lisa");
student1.setAge(19);//通过set与get方法初始化打印号码
Stu.setNum("231444");//第三种set与get方法初始化静态成员变量
System.out.print("Stu.getNum");//打印号码
System.out.print(student1);
}
}
实例化对象时先执行静态代码块的、实例代码块、构造方法与定义顺序无关,但每一个有平级时与定义顺序有关。(建议大家在实际写代码时一个文件最好只有一个类,方便管理,不同类共有属性为提高效率可放在一个类中,利用面向对象的语言的继承性,利用extends关键字,即在需要使用的类的类名后加上extends +共有属性所在类的类名),以上类和对象的内容就说到这里,小编刚学完类和对象,借平台梳理我理解的类和对象(若有误,望指出,谢谢!)。