面向过程和面向对象的设计思想
java面向对象语言
object oriented programming OOP
面向过程和面向对象都是语言设计思想.
案例: 把大象装进冰箱 图书馆管理系统 书类 管理员类 借阅…
**面向过程:**关注于具体的流程,一步一步实现解决问题
3步可以实现
1.开门();
2.装大象();
3.关门();
面向对象:
先设计 对现实中客观事物进行分类,创建出类(在类中定义功能), 创建出具体的对象,让对象去做具体的事情.
类是对象现实事物的抽象.
冰箱类{
开门()
关门()
装大象()
}
大象类{
}
难?
概念多,设计复杂.
类
类是对象现实事物的抽象.
实际生活中,先有对象(具体存在),后有类.
人 人类(概念)
张三 对象(具体的一个人)
类的结构
成员变量: 类中的属性 名词: 品牌,颜色 价格 型号
方法 : 类中行为(功能) 动词: 行驶,加速,停止…
构造方法
代码块
内部类
类是一个模型,对现实事物的抽象.是模板.
对象时从类这个模型创建出的一个具体实例.
java对象
对象是类的一个实例,是以类为模板在内存中创建的实际存在的实例
● 对象的创建和使用
Car x1 = new Car();
Car x1:使用Car类作为类型声明一个变量x1.
new Car():使用new + Car类构造方法创建对象.
= :将右边创建的对象地址 赋给 左边的x1变量
使用x1变量访问对象中的成员变量和成员方法.
● 同一类的每个对象有不同的成员变量存储空间。
● 同一类的每个对象共享该类的方法。
对象内存简图
变量分类
● 成员变量
成员变量是定义在类中,方法体之外的变量。
成员变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)。
在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。引用类型默认值为null 整数-0,浮点-0.0 ,boolean-false ,char- ‘ ’ ;
成员变量在创建对象的时候会从类中复制一份到对象中。
成员变量可以被类中方法、构造方法和特定类的语句块访问。
成员变量的作用范围为整个类体。
● 局部变量
在方法、构造方法或者语句块中定义的变量被称为局部变量。
局部变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)。
局部变量在使用前必须初始化赋值。
变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
方法分类
● 成员方法:成员方法是定义在类中。 语法格式:
修饰符 返回值类型 方法名 ( 参数列表) {
方法体语句;
[return 返回值]
}
● 构造方法:用来初始化对象的方法
• 构造方法名与类名相同,且没有返回值,且不需要使用void修饰。
• 作用:在构造方法中为创建的对象初始化赋值,
• 在创建一个对象的时候,至少要调用一个构造方法。
• 每个类都有构造方法。如果没有显式地为类定义构造方法,Java将会为该类提供一个默认
构造方法,但是只要在一个Java类中定义了一个构造方法后,默认的无参构造方法即失效。
• 一个类可以有多个构造方法。
例: public class Car{
public Car(){ }
public Car(String name){ // 这个构造方法有一个参数:name }
}
例:创建Car类的对象
Car car1 = new Car();
Car car2 = new Car(“宝马”)
方法的重载
● 方法的重载是指同一个类中具有相同的名字,但参数不同的多个方法。
● 参数不同(可以有三方面的不同)
● 数量不同
● 类型不同
● 顺序不同
● 调用时,会根据不同的参数表选择对应的方法。
• 注意:方法重载跟方法的返回值类型没有任何关系
对象与引用
-
java中除8种基本数据类型之外的变量类型都称之为引用类型。
-
java中的对象是通过引用对其操作。
例如: 我们有一个自定义类为Car(汽车类)
class Car{
String color;
String name;
String model;
}
Car bm= new Car();
通常把这条语句的动作称之为创建一个对象,其实,它包含了三个动作。1)右边的“new Car()”,是以Car类为模板,调用Car类的构造函数,在堆空间里创建一个Car类对象。
2)左边的“Car bm”创建了一个Car类型引用变量。所谓Car类的引用,就是以后可以用来指向Car
对象的对象引用。
3)”=”操作符使对象引用指向刚创建的那个Car对象。
我们可以把这条语句拆成两部分:
Car bm;
bm= new Car();
这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。public class Person {
//成员表变量
public String name;
int age;
//构造方法
public Person(){}
public Person(String name,int age){
this.name=name;
this.age=age;
}
//成员方法 哪个对象调用showInfo方法,那么name,age就是哪个对象中的属性
//this 表示当前正在操作的对象 在成员方法,构造方法中使用成员变量,使用this调用.
public void showInfo(){
System.out.println(“姓名:”+this.name+" 年龄:"+this.age);
}
} 此处省略测试类创建对象初始化和调用方法
-
值传递与引用传递
-
java中进行方法调用传递参数时,参数传递有两种(严格来说都是传值):
-
值传递
例:class Demo{
public static void main(String []args){
Demo d = new Demo();
int a = 10;
d.test(a);
System.out.println(a);
}
//形参a的值直接对b赋值,在内存中有两个独立的存储空间 a,b
public void test(int b){
b = 20;
}
}
//测试结果为10;
(形参数类型是基本数据类型):方法调用时,实际参数把它的值传递给
对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。 -
引用传递
Package
class Person{
public String name;
public int age;
//省略构造方法
}
class Demo{
public static void main(String []args){
Demo d = new Demo();
Person zs = new Person (“张三,age:20”);
d.test(zs);
System.out.println(张三.name);
}
public void test(Person p) {//zs和p指向同一个对象
p.name = “李四”;
}
} //测试结果name为李四
this关键字
this关键字代表当前对象
使用this关键字引用成员变量
使用this关键字引用成员方法 -
在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的
格式来引用成员变量名,常常用来区分同名的成员变量和局部变量。static关键字
●概念
● static被称为静态,可以用来修饰类的属性,方法,代码块,内部类。
• 随着类的加载而加载
• 优先于对象存在
• 修饰的成员,被所有对象所共享
• 可不创建对象,直接被类调用static属性
静态属性是类的所有对象共享的,即不管创建了多少个对象,静态属性在内存中只有一个。● static方法可以使用对象调用,也可以直接用类名调用,建议用类名直接调用。
● 在static方法内部只能访问类的static属性,不能访问类的非static属性,static属性先加载。
代码块
代码块在类中声明,类似一个没有名称的方法体(代码块),代码分实例代码块和静态代码块
实例代码块块:每次创建对象时自动调用
{
//任何符合语法的Java代码
}
静态代码块:类加载时自动调用,仅一次,与是否创建对象无关。
static {
//任何符合语法的Java代码
}类什么时候加载?
·main方法在哪个类中执行,这个类加载
·创建某个类的对象
·调用某个类静态属性,方法
类的加载执行
创建对象先于类加载执行
public class Test {
Person person = new Person(“Test”);//第二个执行
int age;
static{
System.out.println(“test static”);//先执行
}
{
System.out.println(“test”);//第三步执行
}
public Test() {
System.out.println(“test constructor”);//最后一步执行
}
public static void main(String[] args) {
new Test();//两个过程 对象创建 类加载初始化
}
}
class Person{
static{
System.out.println(“person static”);
}
public Person(String str) {
System.out.println("person "+str);
}
}
//静态代码块加载先于实例代码块
实例代码块加载快于构造方法
包
为了更好的组织类,Java提供了包机制
● 包可以更好得管理逻辑相关的类,可以控制不同包之间的访问权限
● 导入外部包的类,关键字“import避免类重名
import导入的是类的全类名
同一个类名简称只能用一次
如 :import java.util.Data;
import java.sql.Data;不能重复
按功能管理(目前按日期管理)
Gui(窗口)
数据访问层
工具类
包的命名规则
包名都小写
项目类型 :com(商业) org(组织) edu gov
公司名称:oracle huawei sun
项目名称: oa erp cms
功能模块:窗口/视图层 数据访问层 服务层 工具类
细分子模块
例 com.ffyc.javaoop.day2.pack.
访问权限修饰符
●访问权限修饰符
public (公共的) 类,成员变量,方法,内部类
protected (保护的) 成员变量。方法,内部类
(default) 默认的(无) 类,成员变量,方法,内部类private (私有的) 成员变量,方法,内部类
面向对象特征
封装
将类的某些信息隐藏在类内部,不允许外部程序直接访问,
而是通过该类提供的方法来实现对隐藏信息的操作和访问 。 设计模式:解决一类问题的解决方案。
单例模式: 让一个类在一个程序,只能创建一个对象。
解决方法:构造方法设置为私有权限。
继承
extends关键字
java只支持单继承(一个父亲)
继承具有传递性 A继承B B继承C 那么C也继承A的非私有属性和方法
当没有extends 默认都继承Object
创建子类对象后,调用构造方法时,从上向下,先初始化父类后子类
使用supe() 在子类构造方法第一行默认执行
super关键字
注:super不是父类对象,只是将父类信息加载到子类对象来
super()调父类无参构造 只能放第一行
方法重写
方法名,参数列表,返回值类型相同
访问权限修饰符大于等于父类权限
@override java中提供的注解标签
多态
同一种事物,在不同时刻表现不同的状态
多态条件
1需有继承关系(类继承类,类实现接口,类继承抽象类)
2需方法重写
3父类的引用执行子类对象(Animal d = new dog( ));
非静态成员方法 : 编译看左,运行看右;
语法:
优缺点:
父类型引用指向子类型,提升程序扩展性
父类不能调用子类特有的方法 (调用子类得向下转型,用instanceof判断)
接口和抽象类
抽象类
只有声名,没有实现
●子类要么重写全部方法,要么也声名为抽象类
接口
接口类似于抽象类(更彻底的抽象类)
接口和抽象类都用于在顶层类,制定规范。(设计功能)
●接口中成员变量默认为静态常量 // 接口名只能调用接口中静态成员
●接口中定义静态抽象方法 //接口名.方法名可调用
●默认方法public default void xx( )只能通过子类调用
●一个接口可以继承一个/多个接口,一个类可实现多个接口
●接口不能实例化对象**,无构造方法**