标签:
思想
面向过程:是分析出解决问题所需的步骤,从上往下步步求精,自顶向下的编程,最重要的是模块化思想,考虑实际的实现
优点:性能高
面向对象:以事物为中心,将事物高度抽象为对象,对象包括属性与行为。
优点:易重用、易扩展、易维护、适合大型项目
联系与区别
联系:面向对象也含有面向过程的思想
区别:面向过程是一件事“该怎么做“,面向对象是一件事“该让谁来做”
举例
汽车发动 汽车到站
面向过程 汽车发动与汽车到站分别为两个事件,形成两个函数,依次调用
面向对象 关心汽车这个对象,两个事件只是这个对象所具有的行为
结构图
类与对象
类是一批对象的抽象,可理解成某种概念;对象才是一个具体的实体
实例与对象是对同一概念的不同描述
定义
[修饰符] class类名{
属性
初始化块
构造器
方法
}
[修饰符]属性类型属性名 [=默认值]
[修饰符]返回值类型方法名([形参列表]){
方法体
}
[修饰符]构造器名([形参列表]){
方法体
}
属性用来定义该类或该类的实例所包含的数据
方法用来定义该类或该类的实例的行为特征
构造器用来构造类的实例
方法
静态方法(类方法): 使用static修饰的方法,属于类,该类所有实例共享,可以使用类和对象调用
非静态方法(实例方法):不使用static修饰的方法,属于对象,只能使用对象调用
***静态成员不能访问非静态成员***
重载
两同 同一类中方法名相同
一不同 参数列表不同
(方法返回值、修饰符等与方法重载没有任何关系)
成员变量与局部变量
类属性:使用static修饰,可以使用类和对象调用
实例属性:不适用static修饰,只能使用对象调用
构造器
构造器是一个特殊的方法,用来创建类的实例
通过new调用构造器,返回类的实例
如果程序员没有为类编写构造器,系统会为该类提供一个默认的无参构造器
一旦提供自定义构造器,系统不再提供默认构造器
创建对象时,系统为该对象的实例属性进行默认初始化,可通过构造器指定初始值
初始化块
初始化块只能被static修饰
初始化三种方式
声明属性时指定值
初始化块
构造方法
声明属性时指定值与初始化块按代码位置先后执行
初始化块重视在构造方法之前执行
java系统加载并初始化某个类时,总是保证该类所有父类(包括直接父类和间接父类)全部加载并初始化
This
This关键字是一个对象的默认引用
两种情形
在方法中引用调用该方法的对象
构造器中引用该构造器初始化的对象
this不能出现在静态方法中
封装
将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过类提供的方法对内部信息访问和操作
package
java允许将一组功能相关的类放在同一个package中,从而组成逻辑上的类库单元
如果把一个类放在指定的包结构下,应在java源程序第一行添加:packagepackagename;
javac -d . Hello.java 指定将生成的class文件放在当前路径
java my.Hello
常用包
java.lang java语言核心类,系统自动导入该包下所有类
java.util 工具类/接口 集合框架类/接口
java.net 网络编程相关类/接口
java.io I/O编程相关类/接口
java.sql JDBC数据库编程相关类/接口
修饰符
修饰符 |
类 |
方法 |
构造器 |
属性 |
局部变量 |
初始化块 |
public |
√ |
√ |
√ |
√ |
|
|
protected |
|
√ |
√ |
√ |
|
|
无 |
√ |
√ |
√ |
√ |
√ |
√ |
private |
|
√ |
√ |
√ |
|
|
static |
|
√ |
|
√ |
|
√ |
final |
√ |
√ |
|
√ |
√ |
|
abstract |
|
√ |
|
|
|
|
native |
|
√ |
|
|
|
|
synchronize |
|
√ |
|
|
|
|
被声明为public的类、属性、方法、构造方法能够被任何其他类访问
被声明为protected的成员变量、方法和构造器能被同一个包中的任何其他类访问,也能够被不同包中的子类访问
不使用任何修饰符声明的属性和方法,对同一个包内的类是可见
被声明为private的方法、属性只能被所属类访问,构造器被private修饰,该类不能被其他类实例化
继承
介绍
定义
[修饰符] classSubClass extends SuperClass
{
//类定义部分
}
特点
子类是一种特殊的父类
子类可以从父类继承得到非私有的属性和方法
子类不能获得父类构造方法
如果一个类没有指定该类的直接父类,该类默认扩展java.lang.Object类。因此java.lang.Object是所有类的父类
初始化顺序
类初始化->对象初始化
当子类对应构造函数中没有显示调用时调用的是父类默认的构造函数
方法重写
两同 方法名相同、形参列表相同
两小 子类方法返回值类型、子类方法声明抛出的异常(或相同)
一大 子类方法的访问权限(或相同)
覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法
属性覆盖
如果子类定义了与父类同名属性,子类属性会覆盖父类属性
如果子类里没有包含和父类同名属性,则子类可以继承到父类属性
如果在某个方法中访问名为 a的属性,但没有指定调用者,系统查找 a顺序:
查找该方法中是否有名为a的局部变量
查找当前类中是否包含名为a的属性
查找a的直接父类中是否包含名为a的属性,一次上溯a的父类,直到java.lang.Object类
Super
super不能出现在静态方法中
调用父类类覆盖的属性、方法和构造器
super不能出现在静态方法中
多态
产生原因
编译时类型、运行时类型
编译时类型由声明该变量时使用的类型决定
运行时类型由实际赋给该变量的对象决定
编译时类型与运行时类型不一致,出现多态
向上转型
因为子类是一种特殊的父类,因此java允许把一个子类对象直接赋给一个父类引用变量,被称为向上转型,由系统自动完成
对象属性不具备多态性
当把一个子类直接赋给赋给父类引用变量,例如Base base = new Sub(); 引用变量base编译时类型是Base,运行时类型是sub,当运行时调用该引用变量的方法时,其方法行为总是像子类方法行为,而不是父类方法行为。
出现相同类型变量执行同一方法时出现不同的行为特征
引用变量只能调用编译时类型的方法
publicclass Sub extends Base{
publicString book = "java疯狂讲义";
publicvoid sub()
{
System.out.println("子类普通方法");
}
publicvoid test()
{
System.out.println("子类覆盖父类的方法");
}
publicstatic void main(String[] args) {
Base base = new Sub();
System.out.println(base.book);
//呈现出子类的行为特征
base.test();
}
}
向下转型
为了调用运行时类型的方法
引用类型转换
(type) variable
只能把一个父类变量转换成子类类型,如果两个没有任何继承关系的类型,则无法进行类型转换
Instanceof
instanceof和类型转换运算符一样,都是java提供的运算符
引用类型变量 instanceof 类(或接口)
判断前面引用类型变量是否是后面类、或者前面引用类型子类(或实现类)的实例,是返回true,否则返回false
标签:
原文地址:http://blog.csdn.net/qq_21919787/article/details/51899394