通过前面的学习我们对于java的语法结构有了一定的认识,掌握了分支结构,循环结构等常用的程序逻辑,也能运用这些知识解决一些简单问题。
以前我们面向过程,现在我们面向对象。这是从盖小房子走向盖摩天大楼的第一步。
面向对象 : 程序的稳定性 可扩展性 可重用性 都有非常大的优势。
本次学习我们将学习如何通过java语言实现面向对象的三大特征: 继承 封装 多态; 编写具有面向对象思想的java程序。
类和对象
学习内容:
什么是对象
什么是面向对象
什么是类
类和对象的关系
对象: 万物皆对象,现实中存在的事物都可以看成一个对象。
面向对象: 人关注对象; 人关注事物信息
遵循现实生活中的场景,比如想养一只猫: 小点的,可爱的,不容易掉毛的。店员提供的猫:
这就是一个面向对象的过程。
我的描述是一个抽象的虚拟的特征,而店员带我看的两只猫就是满足特征的实物。
类是模子,确定对象将会拥有的特征(属性)和行为(方法); 对象是类的实例表现;类是对象的类型;对象是特定类型的数据
属性和方法: 属性:对象具有的各种静态特征,对象有什么”; 方法:对象具有的各种动态行为,对象能做什么”
类: 类,抽象的概念; 是一个模板 & 对象:是一个看得到、摸得着的具体实体。
创建类
名的推荐命名规范: 英文字母小写;域名的倒序
猫的属性: 昵称、年龄、体重、品种; 方法:跑动、吃东西
package cn.mtianyan.animal;/** * 宠物猫类 * @author mtianyan */public class Cat { // 猫的成员属性: 昵称、年龄、体重、品种; String name; int age; float weight; String species; // 方法:跑动、吃东西 public void run(){ System.out.println("小猫在跑"); } public void eat(){ System.out.println("小猫吃鱼"); } }
实例化对象
package cn.mtianyan.animal;public class CatTest { public static void main(String[] args) { Cat oneCat = new Cat(); oneCat.run(); oneCat.eat(); } }
运行结果:
普通的变量如果没有初始化是不能被打印输出的。而对象的成员变量则可以之间打印,因为它们有默认值。
System.out.println(oneCat.age);
运行结果:
System.out.println("年龄: "+ oneCat.age); System.out.println("昵称: "+ oneCat.name); System.out.println("体重: " + oneCat.weight); System.out.println("品种: " + oneCat.species);
可以看到字符串类型的是null,int型是0,float型是0.0
oneCat.name = "花花"; oneCat.age = 2; oneCat.weight = 1000; oneCat.species = "中华田园猫"; System.out.println("年龄: "+ oneCat.age); System.out.println("昵称: "+ oneCat.name); System.out.println("体重: " + oneCat.weight); System.out.println("品种: " + oneCat.species);
类实例化对象,对象使用属性和方法。方法带参数,重载run方法。
public void run(String name){ System.out.println(name+"在跑"); }// CatTest中调用 oneCat.run(oneCat.name);
单一职责原则
问题来了,我们为什么要把Cat类和包含main方法的CatTest类进行分离呢?
单一职责原则(单一功能原则) 一个类应该有且只有一个引起功能变化的原因。
一个类应该只干一件事不能太累。
如果在一个类当中,承担的功能越多.交融,耦合性就越高,被复用的可能性就越低。特别是因为耦合度高,可能因为一个职责的变化,引起其他职责的变化,进而影响整个程序的运行。
在程序设计中我们建议将不同的职责放到不同的类当中来实现,把不同的引发变化的原因封装进不同的类。
面向对象的设计原则不止这一个,还有:里氏替换原则;依赖倒置原则;开闭原则;迪米特法则;组合/聚合复用原则;接口隔离原则。其他这些我们都会学习到。
new关键字
实例化对象的过程可以分为两部分: 声明对象 Cat one;实例化对象 new Cat();
声明对象时,是在栈中开辟了一块内存空间,此时还不是一个有效的对象,因为此时one的空间里是空的。如果此时用它进行属性的方法和调用是不被允许的。
Cat twoCat; twoCat.run();
实例化对象是在堆空间开辟一块空间,完成了具体对象相关信息的初始化操作。
也就是声明对象和实例化对象是在内存中的不同空间完成的,通过赋值操作,将两者关联。具体的关联就是将堆中具体对象的内存地址存放是在one中。
package cn.mtianyan.animal;public class CatTest { public static void main(String[] args) { Cat oneCat = new Cat(); oneCat.name = "花花"; oneCat.age = 2; oneCat.weight = 1000; oneCat.species = "中华田园猫"; System.out.println("年龄: "+ oneCat.age); System.out.println("昵称: "+ oneCat.name); System.out.println("体重: " + oneCat.weight); System.out.println("品种: " + oneCat.species); System.out.println("-----------------------"); Cat twoCat=new Cat(); twoCat.name = "花花"; twoCat.age = 2; twoCat.weight = 1000; twoCat.species = "中华田园猫"; System.out.println("年龄: "+ twoCat.age); System.out.println("昵称: "+ twoCat.name); System.out.println("体重: " + twoCat.weight); System.out.println("品种: " + twoCat.species); } }
两只猫的相关信息一模一样,但是实际它们指向的是堆中两块不同的内存。修改two的信息是不会对one产生影响的。
twoCat.name = "欢欢"; twoCat.species = "英国短毛猫";
作者:天涯明月笙
链接:https://www.jianshu.com/p/8da2f339654d
共同学习,写下你的评论
评论加载中...
作者其他优质文章