javaSE_day05
目录
1. 面向对象和面向过程
1.1 面向过程
eg: 想吃面包 (自己做)
买面 --> 和面 --> 模型 --> 烤熟 --> 吃面包
- 关注点 --> 过程(步骤)
- 适合于简单应用
1.2 面向对象
eg: 想吃面包 (让别人做(面包师))
买面 --> 和面 --> 模型 --> 烤熟 --> 吃面包
- 关注点 --> 对象
以面向过程为基础
- 适合于大型、复杂的项目
三大特征:继承、封装、多态、(抽象)
1. 封装:
包括: 变量定义private、set / get方法、构造方法
封装的实现:
- 定义private 私有变量
- 提供公有的方法 get / set方法
2. 继承:
特点:
- 什么是继承:由已有类产生新类的一种机制
- 父类子类:
- 父类:已有类(被继承类)
- 子类:新类
- 父类子类:
- 继承性:子类可以继承父类的所有成员(构造方法不能继承),有些继承是不能使用的(如private)
- java只支持单一继承。
- Object是顶级类,是所有类的父类
- 满足一种关系:子类 is a 父类 eg: student is a dog //err
- extends表示继承
super
- super:表示父类对象
- super.成员
- super(实参列表):必须是子类构造方法的第一条有效语句
- 子类默认调用父类无参构造方法
eg:构造方法的调用
访问修饰符
修饰符 | 修饰 | 访问范围 |
---|---|---|
private | 变量名、方法 | 本类 |
默认 | 类、变量、方法 | 同一个包 |
protected | 变量、方法 | 同一个包、不同包(继承关系才可以) |
public | 类、变量、方法 | 任何地方 |
变量使用的范围:方法内 --> 当前类成员变量 --> 父类
方法重写
私有方法不能被重写
继承关系:
- 父类和子类
- 方法名相同,参数列表相同
- 方法的返回类型相同(如果是继承关系,子类的方法返回类型 要 <= 父类)
- 子类方法的访问修饰符 >= 父类的访问修饰符
- 子类方法的异常(非运行时异常) <= 父类的异常
- 为什么要重写? 扩展父类方法的功能
继承关系中构造方法的调用规则
- 子类创建对象时,总是默认调用父类无参的构造方法。
- 如果父类没有无参的构造方法,那么子类使用super() 调用父类的构造方法。
eg:
3. 多态
-
定义:一种类型的变量可以指向不同的对象。
父类声明 子类创建
eg:
Animal a1 = new Dog();
Animal a2 = new Bird(); -
分类
-
(1)编译时的多态:方法的重载
eg:
class A{
void f(){
System.out.println(“f”);
}
void f(int x){
System.out.println(“f”+x);
}
}A a1 = new A();
A a2 = new A();
a1.f(); // 输出 f
a2.f(1); // 输出 f + 1 -
(2)运行时的多态:方法的重写
eg:
//父类声明 子类创建
//在Animal 类中定义eat , Dog和Bird类重写了此方法
Animal a1 = new Dog();
Animal a2 = new Bird();
a1.eat();
a2.eat();- 在编译时,看变量的声明类型
- 在运行时,如果子类重写了父类的方法,动态绑定方法到子类上,运行子类的方法。但不会动态绑定其他。
练习:
-
-
多态的应用
方法的参数定义为父类类型或者接口类型
eg:
public void feed(Animal animal){
animal.eat();
}
2. 类和对象
-
类:对具有共同属性和行为特征的一类事物的抽象。(属性对应变量(静态);行为对应方法(动态))
-
对象:通过类创建的实例。
类是创建对象的模板 先有类再有对象创建对象就是调用构造方法
eg: 创建类、对象的创建、用对象使用类成员
2.1 类的定义
class 类名{
类成员的定义:成员变量,方法,块({ })
}
- 类名首字母要大写
- 类分为工具类,测试类(程序入口类)
2.2 构造方法(构造器)
-
定义:方法名和类名相同,无返回类型。
可以有多个构造方法(只和参数的数据类型有关),多个构造方法一定是重载的。
-
来源:2个途径。
- (1)系统默认。没有参数,一定是public修饰的
- (2)自定义。不再有默认的构造方法。
-
作用:和new一起完成创建对象。
-
使用(调用):new 构造方法;
eg:
package cn.tedu.demo;
/**
* 调用构造方法
* 构造方法的重载
* @author Dell
*
*/
public class Demo2 {
public void Demo2() { //有void,不是构造方法,在测试类中用demo2.Demo2()调用
System.out.println("Demo2");
}
//构造方法的重载
public Demo2() { // 是构造方法 用Demo2 demo2 = new Demo2();调用
System.out.println("Demo2");
}
public Demo2(int x) { //参数的数据类型不同,是构造方法的重载
System.out.println(x);
}
public Demo2(String str) { //参数的数据类型不同,是构造方法的重载
System.out.println(str);
}
}
构造方法不能继承,其他方法都可以被继承,只是private方法不能使用。
2.3 对象的初始化过程(内存)
创建对象时,成员变量会被初始化
2.4 构造块 { }
- 在构造方法之前执行,初始化成员变量
- 构造块内可以定义和成员变量相同名称的变量
2.5 局部块
public void test() {
// 局部块 :执行完毕,立即回收,可以提高内存的利用率
{
int x = 9;
System.out.println(“x = 9”);
}
System.out.println(“test”);
}
2.6 变量的分类
定义的位置 | 访问范围 | 默认值 | |
---|---|---|---|
成员变量 | 定义到类体中 | 整个类内 | 有默认值 |
局部变量 | 定义到方法内或参数列表 | 当前方法 | 无默认值 |
- void f(int x){
int y;
…(x);
}
2.7 this关键字
成员变量和局部变量 重名 时,用this关键字。
- this表示本类对象
- 访问类成员:this. 成员 (成员变量)
- 调用本类的构造方法:this(实参);
this()必须是构造方法的第一条有效语句。