Java第六章面向对象
一、面对对象
Java语言是一种面向对象的语言。要使用Java进行面向对象的编程,首先要建立面向对象的思想。面向对象是一种直观而且程序结构简单的程序设计方法,它比较符合人类认识现实世界的思维方式。其基本思想是把问题看成是由若干个对象组成,这些对象之间是独立的,但又可以相互配合、连接和协调,从而共同完成整个重新要实现的任务和功能。
面向对象的三大特性:封装、继续和多态。
二、开发方法
结构化开发:
①面向功能划分软件结构
②自顶向下
③最小的子系统是方法
④制约了软件的可维护性和可扩展性
面向对象开发 (面向对象程序设计 Object Oriented Programming OOP)
①吧软件系统看成各种对象的集合
②系统结构较稳定
③子系统相对独立
④软件可重用性、可维性和可扩展性强
三、对象的特征
1、属性
①属性——对象具有的各种特征
②每个对象的每个属性都拥有特定值
2、方法——对象执行的操作
对象是用来描述客观事物的一个实体
3、对象和类关系
①类是抽象的概率,仅仅是模板
②对象是一个你能够看得到、摸得着的具体实现
4、Java是面向对象的语言
①所有Java程序都以类class为组织单元
②关键字class定义自定义的数据类型
public class 类名{
//定义属性(变量)
//定义方法(操作)
}
四、如何创建和使用对象
1、创建对象
类名 对象名 = new 类名()
School center = new School;
2、引用对象成员:使用“.”进行以下操作
引用类的属性: 对象名.属性
引用类的方法:对象名。方法名()
center.name = "课工场";//给name属性赋值
center.showCenter();//调用showCenter()方法
五、方法的返回值
两种情况
①如果方法具有返回值,方法中必须使用关键字return返回值,返回值类型为该值的类型
②返回值只能一个
③如果方法没有返回值,返回值类型为void
六、方法调用
方法之间永许相互调用,不需要知道方法的具体实现,实现重用,提供效率。
情况 | 举例 |
---|---|
Student类的方法a()调用Student类的方法b()直接调用 | public void a( ){ b( );//调用b() } |
Student类的方法a()调用Teacher类的方法b(),先创建类对象,然后使用“.”调用 | public void a( ){ Teacher t = new Teacher(); t.b( );//调用Teacher类的b() } |
七、方法重载
1、定义带参数的方法
<访问修饰符>返回类型 <方法名>(<形式参数列表>){
//方法的主体
}
2、调用带参数的方法
对象名,方法名(参数1、参数2、......参数n)
3、构造方法
访问修饰符 构造方法名(){ 无返回值类型
//初始化代码 方法名与类名相同
} 可以指定参数
作用:对象初始化
4、方法传参
基本数据类型和引用数据类型在传参的区别
基本数据类型
引用数据类型
基本数据类型,操作传递的是变量的值,改变一个变量的值不会影响另一个变量的值
引用数据类型(类、数组和接口)赋值是把原对象的引用(可理解为内存地址)传递给另一个引用
5、重载
自定义构造方法
方法名相同
参数项不同
与返回值、访问修饰符无关
此时系统不再提供默认无参数构造方法
6、this的用法
调用属性
this.health=100;
this.name=“大黄”;
调用方法
this.print()
调用构造方法
this();
this(“小黑”,100,100,“雄”);
7、成员变量和局部变量
变量声明的位置决定变量作用域
变量声明域确定可在程序中按变量名访问该变量的区域
8、成员变量和局部变量区别
作用域不同
局部变量的作用域仅限于定义它的方法
成员变量的作用域在整个类内部都是可见的
初始值不同
Java会给成员变量一个初始值
Java不会给局部变量赋予初始值
在一个方法中,不允许有同名局部变量
在不同的方法中,可以有同名局部变量
在同一类中,成员变量和局部变量同名时,局部变量具有更高优先权
八、封装
1、什么是封装
面向对象三大特征之一——封装
封装的概率
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
把尽可能多的东西藏起来,对外提供便携的接口
封装的两大原则
把所有的属性隐藏起来2
2、封装的好处
①便于使用者正确使用系统,防止错误修改属性
②有助于系统之间的松耦合,提高系统独立性
③提高软件的可重用性
④降低了构建大型系统的风险
3、为什么需要包
windows树形文件系统:
①文档分门别类,易于查找和管理
②使用目录解决文件同名冲突问题
用MyEclipse创建包
JDK提供基本包:
java.lang:虚拟机自动引入
java.util: 提供一些实用类
java.io:输入、输出
使用MyEclipse创建包的两种方法
分别创建包和类
创建类的过程中创建类所在的包
如何导入包
为了使用不在同一包中的类,需要在Java程序中使用import关键字代入这 个类
import 包名.类名;
import java.util.*;//导入java.util包中所有类
import cn.jtes.class.School;//导入指定包中指定类
使用包中的注意事项
①一个类同时引用了两个来自不同包的同类名
必须通过完整类名来区分
②每个包都是独立的,顶层包不会包含子包的类
③package和import的顺序是固定的
package必须位于第一行(忽略注释行)
只允许有一个package语句
其次是import
接着是类的声明
4、访问权限控制
回顾
①属性隐藏
②包机制
访问权限控制
①类的访问控制
②类成员的访问控制
5、类的访问修饰
作用域|修饰符 | 同一个类中 | 同一个包中 | 子类中 | 任何地方 |
---|---|---|---|---|
Private | 可以 | 不可以 | 不可以 | 不可以 |
默认修饰符 | 可以 | 可以 | 不可以 | 不可以 |
Protected | 可以 | 可以 | 可以 | 不可以 |
Public | 可以 | 可以 | 可以 | 可以 |
6、static修饰符
static可以用来修饰
①成员变量
静态变量,可以之间通过类名访问
②成员方法
静态方法,可以之间通过类名访问
③代码块
静态代码块,当Java虚拟机价值类时,就好执行该代码块
7、static变量
类的成员变量
①被static修饰的变量
②在内存中只有一个拷贝
③类内部,可在任何方法内直接访问静态变量
④其他类中,可以直接通过类名访问
实体变量
①没有被static修饰的变量
②每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多 个拷贝,互不影响
作用:
①能被类所有实例共享,可作为实例之间进行交流的共享数据
②如果类的所有实例都包含一个相同的常量属性,可把这个属性定义为静态常量类型,从而节省内存空间
8、static方法
静态方法:可之间通过类名访问
①静态方法中不能使用this和super
②不能之间访问所属类的实例变量和实例方法
③可之间访问类的静态变量和静态方法
实例方法:通过实例访问
可之间访问所属类的静态变量、静态方法、实例变量和实例方法
静态方法必须被实现 : main()就是最常用的静态方法
九、继承
1、使用继承
编写父类
[访问修饰符]class Pat{
//公共的属性和方法
}
编写子类,继承父类
[访问修饰符]class Dog extends Pet{
//子类特有的属性和方法
}
继承是Java中实现代码重用的重要手段之一。Java中只支持单根继承,即一个类只能有一个直接父类
2、子类访问父类成员
访问父类构造方法、
super();
super(name);
访问父类属性
super.name;
访问父类方法
super.print();
①使用super关键字,super代表父类对象
②在子类构造方法中调用且必须是第一句
③不可以访问父类中定义为private的属性和方法
3、super关键字来访问父类的成员
①super只能出现在子类的方法和构造方法中
②super调用构造方法时,只能是第一句
③super不能访问父类的private成员
4、继承条件下的构造方法
继承条件下构造方法的调用规则
①子类构造方法没有通过super显式调用父类的有参构造方法,也没通过this显式调用自身其他构造方法
系统默认调用父类的无参构造方法
②子类构造方法通过super显式调用父类的有参构造方法
执行父类相应构造方法,而不执行父类无参构造方法
③子类构造方法通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则
5、子类可以继承父类的所有资源吗?
不能被继承的父类成员:
①private成员,②子类与父类不在同胞,使用默认访问权限的成员,③构造方法