面向对象
面向对象(重点难点)
面向对象和面向过程
都是编程思想
面向过程注重过程,步骤,怎么做 执行者
面向对象注重对象,谁来做 指挥者
面向对象学习
1、类与对象
(1)类与对象的概念
(2)类与对象的关系
(3)如何设计类,类的成员
(4)如何创建对象
2、面向对象的三个基本特征和高级特性
基本特性
封装 继承 多态
高级特性
枚举 接口 抽象 泛型 注解 可变参数 自动装箱与拆箱 foreach lambda表达式
相关的关键字和API
关键字: class new this super 权限修饰符(public protected private 缺省) ......
API: 集合 异常 IO 网络编程 线程 ......
类与对象
类与对象的概念
类:对一类具有相同特征的事物的抽象描述
对象:类的实例,是具体的个体
类与对象的关系
类是对象的设计图,创建的模板
对象是类的实例,是一个具体的个体
类的设计、成员
属性:
属性的特点: 声明的位置在类中方法外 保存的位置 static在方法区 非static在堆中 默认值 byte,short,int,long是0,float,double是0.0,boolean是false,char是\u0000,引用数据类型都是null 作用域在整个类中 ,生命周期 随着对象的创建而创建,到垃圾回收为止
属性的声明格式:[修饰符] 数据类型 属性名 【=显式值】; 修饰符 private 私有化
构造器:
构造器的作用: 和new一起创建对象 为属性赋值
如何声明:
无参
[修饰符] 类名(){
}
有参
[修饰符] 类名(形参列表){
}
特点:
(1)构造器名与类名必须相同
(2)构造器没有返回值
(3)构造器可以重载
(4)如果一个类没有声明过构造器,编译器将默认添加一个无参构造如果这个类声明了构造器,编译器将不再自动添加无参构造
如何调用:
和new一起 new 构造器() new 构造器(实参列表)
在本类的其他构造器中或子类的构造器中:
在本类的其他构造器中:this()或this(实参列表)
在子类的构造器中:super()或super(实参列表)
方法:
有参无返回值 无参无返回值 有参又返回值 无参无返回值
内部类:
什么情况下使用内部类:
(1)当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类
(2)内部类可以访问外部类的所有的成员,包括私有的
静态内部类
//格式 [修饰符] class 外部类{ [修饰符] static class 内部类{ }
修饰符的问题:
(1)权限修饰符 必须有
(2)static 必须有
(3)final(极少) 可以 表示不能被继承
(4)abstract(极少)可以 表示可以包含抽象方法,需要子类继承
静态内部类的成员:所有都可以,包括静态的
使用问题:
(1)在静态内部类中使用外部类的成员
只能使用外部类的静态成员
(2)在外部类中使用静态内部类
都可以
(3)在外部类的外面,其他类中
(1)用静态内部类的静态成员
外部类名.内部类名.静态成员
(2)用静态内部类的非静态成员
需要静态内部类的对象
外部类名.内部类 变量 = new 外部类名.内部类();变量.成员....
非静态内部类,通常称为成员内部类:
//格式 [修饰符] class 外部类{ [修饰符] class 内部类{ }
修饰符的问题:
(1)权限修饰符 必须有
(2)static 没有
(3)final(极少) 可以 表示不能被继承
(4)abstract(极少)可以 表示可以包含抽象方法,需要子类继承
非静态内部类的成员:除了静态成员,其他都可以
使用问题:
(1)在非静态成员内部类中使用外部类的成员
都可以
(2)在外部类中使用非静态成员内部类
在外部类的静态成员中不能使用非静态成员内部类
静态不能用非静态 原因,静态的成员先加载,非静态只有创建对象才有
(3)在外部类的外面使用非静态成员内部类
依赖于外部类的对象
形式一
(1)先创建外部类的对象
外部类 out = new 外部类();
(2)通过外部类的对象创建内部类的对象
外部类.内部类 in = out.new 内部类();
(3)通过内部类对象调用它的成员
in.成员
形式二
(1)在外部类中提供一个方法,用来返回内部类的对象
class 外部类{ class 内部类{ } public 内部类 getInnerInstance(){ return new 内部类(); }
(2)创建外部类的对象
外部类 out = new 外部类();
(3)通过外部类的对象,获取内部类的对象
外部类.内部类 in = out.getInnerInstance();
(4)通过内部类对象调用它的成员
in.成员
面试题:
//如何继承非静态成员的内部类 class Outer{ class Inner{ } } class Other extends Outer.Inner{ Other(Outer out){ out.super(); } }
有名字的局部内部类,通常称为局部内部类
//格式 [修饰符] class 外部类{ [修饰符] 返回值类型 方法名([形参列表]){ [修饰符] class 内部类{ } }
修饰符的问题:
(1)权限修饰符 都不行
(2)static 没有
(3)final(极少) 可以 表示不能被继承
(4)abstract(极少)可以 表示可以包含抽象方法,需要子类继承
有名字的局部内部类的成员 除了静态成员其他都可以
使用:
(1)在内部类中使用外部类的成员
受所在方法的约束,如果所在方法是静态的,那么只能使用外部类的静态成员,如果所在方法是非静态的,那么都可以使用
(2)在内部类中使用外部类的局部变量
必须是final修饰
(3)在外部类中使用内部类
只能在声明它的方法中使用,而且在声明之后使用
和局部变量的作用域一样
(4)在外部类的外面
不可以
(5)在外部类的其他方法中
不可以
匿名内部类:
//格式 new 父类/父接口(){ 方法 }
修饰符 一个都没有
匿名内部类的成员
除了非静态的都可以,但是一般很少自定义方法等成员,它的成员都是重写父类的,父接口的方法
匿名内部类的特点
(1)声明类和创建对象同时进行, 只有一个对象
public static void main(String[] args) { //Object的一个子类对象 new Object(){ public void test(){ System.out.println(this.getClass()); } }.test(); //Object的另一个子类对象 new Object(){ public void test(){ System.out.println(this.getClass()); } }.test(); }
(2)子类一定会调用父类的构造器
class MyClass{ private String info; MyClass(String info){ this.info = info; } } //创建一个MyClass的子类对象,使用匿名内部类 MyClass m = new MyClass("参数"){ };
匿名内部类的使用形式
//形式一 //匿名内部类的匿名对象直接调用方法 new Object(){ public void test(){ System.out.println(this.getClass()); } }.test();
//形式二 //与父类或父接口直接构成多态引用 class MyClass{ public void test(){ System.out.println("父类的测试方法"); } } MyClass m = new MyClass(){ public void test(){ System.out.println("重写"); } }; m.test();
//形式三 //匿名内部类的匿名对象作为实参 MyClass[] arr = new MyClass[5]; Arrays.sort(arr, new Comparator(){ @Override public int compare(Object o1, Object o2) { return 0; } });
使用其他要求
(1)在内部类中使用外部类的成员
受所在方法的约束,如果所在方法是静态的,那么只能使用外部类的静态成员,如果所在方法是非静态的,那么都可以使用
(2)在内部类中使用外部类的局部变量
必须是final修饰
代码块(按位置分):
在类中方法外
有static修饰的:静态代码块
//语法结构 class 类{ static{ 静态代码块 } }
特点
随着类的加载并初始时而执行,而且一个类的静态代码块只执行一次
而且父类的静态代码块优先于子类的静态代码块
静态代码块肯定优先于构造块和构造器
作用
为静态变量(类变量)初始化(赋值)
没有static修饰的:非静态代码块,构造块
//语法结构 class 类{ { 静态代码块 } }
特点
每次创建对象时调用,而且先于构造器调用
作用
为实例变量初始化(赋值),一般是多个构造器中重复的代码提取到构造块
在方法中:局部代码块(了解)