一、类和对象
1、什么是对象
万物皆对象
2、什么是面向对象
人关注对象 (计算机而言):人关注事物信息
3、类和对象
1)类:类就是模型,确定对象将会拥有的特征(属性)和行为(方法)
2)对象:对象是类的实例表现;
3)关系:类是对象的类型;对象是特定类型的数据
4、属性和方法
1)属性:对象具有的各种静态特征 -“对象有什么”
2)方法:对象具有的各种动态行为 -“对象能做什么” "类"—实例化—>"对象"
二、创建类
1、包名的推荐命名规范
1)英文字母小写
2)域名的倒序:com.imooc.animal(最后是功能模块名称)
2、创建类举例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//宠物猫类 public class Cat { //成员属性(属性指有什么)、昵称、年龄、体重; String name;//昵称,String类型的为:null int month;//年龄,int 类型的为: 0 double weight;//体重,double 类型的为:0.0 String species;//品种 //方法(方法指能做什么):跑步、吃东西 //跑步的方法 public void run(){ //无参构造方法 System.out.println("我会跑步"); } public void run(String name){//带参构造方法 System.out.println(name+"快跑"); } //吃东西的方法 public void eat() { System.out.println("我会吃鱼");} }
三、实例化对象
新建一个类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class CatTest { public static void main(String[] args) { //对象实例化 Cat one=new Cat(); //调用跑动吃东西的方法 one.eat(); one.run();//对象.方法,调用方法 one.name="花花";//对象.属性,给属性赋值 one.month=2; one.weight=1000; one.species="英短"; System.out.println("昵称:"+one.name); System.out.println("年龄:"+one.month); System.out.println("体重:"+one.weight); System.out.println("品种:"+one.species); one.run(one.name);//花花快跑 } }
四、单一职责原则
1)单一职责原则,又叫单一功能原则,它是面向对象设计重要原则。意思是一个类最好只有一个功能。
2)如果在一个类当中,承担的功能越多,它的交融和耦合性就会越高,它的复用性越低,同时由于耦合性比较高,当类当中其中一个职责发生变化时,就有可能会发生同类中其他职责的变化,进而影响整个程序的运行。
3)在程序设计中,尽量把不同的职责,放在不同的类中。(也就是说把不同的可能引发变化的原因封装到不同的类里面,这样当一方发生变化时,对其他参与者的影响会少很多,并提升复用性)
五、new关键字
Cat one=new Cat();
1、实例化对象的过程可以分为两部分:
1)声明对象 Cat one ;
只是在内存的"栈"空间里开辟了一块区域,名字叫one,此时里面为空(null)
2)实例化对象 new Cat();
是在内存的"堆"空间里开辟了一块空间,完成对象的初始化操作
2、在栈当中存储的实际上是堆当中地址的引用,new 关键字的作用:开辟新的对象空间
1)
Cat one=new Cat();
Cat two=new Cat();
修改two中的信息,不会对one造成影响
![](https://img2020.cnblogs.com/blog/1352084/202004/1352084-20200413170312292-858493386.png)
2)Cat two = one
指向同一块内存区域,修改two会覆盖one的信息
![](https://img2020.cnblogs.com/blog/1352084/202004/1352084-20200413170059405-1599667105.png)
练习
![](https://img2020.cnblogs.com/blog/1352084/202004/1352084-20200413175234159-194764349.png)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Person { //属性:name、age、grade String name; int age; String grade; //创建无参无返回值的student方法,描述为:我是一名学生! public void student(){ System.out.println("我是一名学生!"); } //创建带参(性别sex)的sex方法,描述为:我是一个**孩! public void sex(String sex){ System.out.println("我是一个"+sex+"孩!"); } //创建无参无返回值的mySelf方法,分别介绍姓名(name),年龄(age),年级(grade) public void mySelf(){ System.out.println("我叫"+name+",今年"+age+"岁了,读小学"+grade+"年级"); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class PersonTest { public static void main(String[] args) { //使用new关键字实例化对象 Person one =new Person(); //传入name、age、grade的参数值 one.name="李明"; one.age=10; one.grade="五"; //分别调用student、sex、mySelf方法 one.student(); one.sex("男"); one.mySelf(); } }
六、构造方法(构造函数,构造器)
它是new 关键字的好搭档 构造方法(不能单独调用)只能配合new关键字调用
1、构造方法"与类同名"且"没有返回值";
public Cat(){}//无参构造方法
2、构造方法的语法格式 public(访问修饰符)(没有返回值类型)构造方法名(与类名相同)((可以指定参数)){ //初始化代码 }
3、只能在对象实例化的时候调用
4、当没有指定构造方法时,系统会自动添加无参的构造方法
5、当有指定构造方法、无论是有参、无参的构造方法,都不会自动添加无参的构造方法
6、一个类中可以有多个构造方法
七、就近原则&this关键字
1、变量被调用时会优先去找同一个范围内定义的变量,只有当找不到时才会扩大寻找范围,到其所在的类当中去找
2、处理方法:修改成不同的变量名,构造方法的参数名与类的成员数据名不相同。避免歧义;用this
3、this关键字
1)this关键字表示的是当前对象(什么是当前对象?谁调用了它谁就是当前对象)
2)this既可以调用属性又可以调用方法
举例:
public Cat(String name,int month,double weight,String species){//有参构造方法 this.name=name; this.month=month; this.weight=weight; this.species=species; }
4、注意
1)相同类里面的普通方法之间是可以相互调用的,不用加this
2)构造方法不能被普通成员方法调用。
3)构造方法只能在同类带参构造方法通过this()调用
4)构造方法调用时,只能放在方法体内第一行
练习
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Monkey { //属性:姓名(name)、特征(feature) String name,feature; //无参的构造方法(默认初始化name和feature的属性值,属性值参考效果图) public Monkey(){ System.out.println("我是使用无参构造产生的猴子:"); name="长尾猴"; feature="尾巴长"; } //带参的构造方法(接收外部传入的参数,分别向 name 和 feature 赋值) public Monkey(String name,String feature){ System.out.println("我是使用带参构造产生的猴子:"); this.name=name; this.feature=feature; } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class MonkeyTest { public static void main(String[] args) { //调用无参构造方法实例对象 Monkey one=new Monkey(); //调用无参构造方法实例对象 System.out.println("名称:"+one.name); System.out.println("特征:"+one.feature); System.out.println("========================="); //调用带参构造方法实例对象 Monkey two=new Monkey("白头叶猴","头上有白毛,喜欢吃树叶"); //打印输出对象属性 System.out.println("名称:"+two.name); System.out.println("特征:"+two.feature); } }
八、总结
1、构造方法的类中不可以直接调用成员方法,而普通方法可以在同一个类中相互调用。
2、在带参构造方法中可以直接用this();直接调用同一个类中的无参构造方法。
3、this相当于对象实例化中的方法名
4、Java中的this关键字的应用,可以在构造方法中通过this()的方式调用同类的其他构造方法,但必须放在第一句;
因此“不能在构造方法中调用同一个类的其他构造方法”和“在构造方法在中如果使用this调用其他构造方法,语句可以放在任意位置”的说法是错误的。
5、构造方法没有返回值。
6、this 当前对象的默认引用;调用同一个类的方法,也可以不加this。
7、this();只能放在方法中的第一条,且用于调用同一个类中的无参构造方法。