类与对象
对象
定义:客观存在事物,万事万物皆为对象
对象有特征(属性)和行为(方法
成员访问方式:对象名。成员名
类
定义:类就是从具备相同属性和方法的多个对象中抽象出来的
类和对象有什么区别呢?
类是一个抽象的概念
对象是一个你能看得到,摸得着的具体实体
面向对象编程的三个重要的原则
封装
定义:将属性和实现细节隐藏,提供可访问的接口
继承
多样性
定义类
class(类)——说明
1个文件中可以有多个类,但是公共类只有一个,且与文件名同名
编译是以类为单位,一个类中有多少个类,编译生成多少个class文件
class类名{ ——属性;——方法; {
属性——在类中声明的变量,都有初始值
方法
方法1
方法
定义方法语法——public 返回值类型 方法名(){ / /这里编写方法的主体 }
方法的返回值类型
非void(有返回值)方法体中必须有return <表达式>语句,且<表达式><br> *类型中要与方法的<返回值类型>要一致;
说明:方法只有一个返回值
void(返回值)为空:方法中最后默认teturn语句
方法的调用
方法:对象名。方法名
调用过程:方法在调用时,程序流程进入到方法体,当执行return时,返回调用处
变量的作用域: {}决定变量的作用域
根据变量的作用域分为:全局变量(成员变量)和局部变量
成员变量:是在类中声明的变量,作用范围是整个类; 有初始值;其初始值参考数组元素;<br> 数值类型为0 , boolean:false, char:’\u0000’空格
局部变量:在方法中声明的变量 ,作用范围当前方法中; 没有初始值<br>
局部变量的优先级高于全局变量
{}决定变量的作用域
封装
定义:隐藏对象的属性和实现细节,仅对外公开接口(类的成员)来和对象进行交互.
封装基本单元:类
功能:代码重用
什么是封装————将属性私有化private,提供公共的set/get方法访问私有的属性
怎样封装————alt+shift+get/set
封装两部曲
私有化属性
公开读写方法 get拿到 set设置值
方法2
String类型的全局变量的初始值为null
构造方法
特点——方法名与类名相同;没有返回值
调用——在实例化时
说明——
子主题
任何类都有一个隐式默认不带参的构造方法;
写了构造方法,就无默认不带参的构造方法;不需要定义返回值类型也不需要void,下对象实列化的时候自动调用的不能手动去带点
this
功能——代表当前对象
使用——this.成员名调用属性和方法
功能——解决局部变量和全局变量同名时,如果要访问全局变量在前面加this
this是一个当前对象的地址(引用) this.属性 this.方法 this() 调用自己本类的构造
参数
参数分为
形参——定义方法中声明的变量
实参——调用方法中的参数
方法调用时,实参要与形参一一对应;实参与形参的类型、数量、顺序一一对应
给成员变量赋值方法
成员变量声明时初始化
通过构造方法给成员变量赋值
通过对象名,属性名给成员变量赋值
对象数组
封装
为什么要封装,提高安全性
定义——将水属性和实现细节隐藏,提供外界可访问接口
封装的基本单位是类
toString方法
默认返回的类的全路径和对象在内存中的地址
输出一个对象时会自动调用toString方法
数据类型(值类型和引用类型)
值类型:8种基本数据类型; 枚举<br> 引用类型: 数组、类、接口
值类型变量中保存的是“值” <br> 引用类型变量中保存的是“地址”
赋值后 值类型变量无关系<br> 引用类型变量有关系
String类型——特点——不可更改
重载&构造
构造方法
什么时候调用——实列化时
功能——初始化
定义:没有返回值类型,与类名相同
说明
任何类都有一个隐式不带参的构造方法
如果类中写了构造方法,就无隐式构造方法
子类的构造方法
子类构造方法第一句有一个隐式的super()调用父类不带参的构造方法<br>
子类构造方法初始值过程:<br> * 初始化父类属性<br> * 调用父类的构造方法<br> * 初始化子类属性<br> * 调用子类的构造方法<br>
方法重载
定义——在一个类中,如果方法名相同,但参数不同的现象,与方法的返回类型无关
功能
减少方法的记忆量
JDK中有大量的重载:Systom.out.print(),Scanner()
封装
为什么要发封装:不封装数据不安全
怎样封装:将类的某些信息隐藏在内部,不允许外部程序直接访问而时通过该类提供的方法来实现对隐藏信息的操作和访问
面对对象的三大特征:(抽象)、封装、继承、多态
封装的基本单位——类
this
定义——代表当前对象
使用
this.属性名:调用属性
this.方法名调用方法
this():调用构造方法,如果使用,必须是构造方法中的第一条语句
在什么情况下使用:局部变量与全局变量同名时,调用全局变量
static(静态的)
修饰方法
1)在本类中:静态方法只能调用静态成员
2)在不同类中:<br> 静态成员访问方式:<br> 1)对象名.成员名(不推荐)<br> 2)类名.成员名
修饰属性
1)静态属性是所有实例共享
2)静态属性生命周期为整个应用程序
静态块和非静态块
静态块在整个应用程序中被执行一次 //在声明一个类时,就会加载Clazz.class文件<br> 类文件加载在整个应用程序中也只会被加载一次<br> 非静态块在实例化之前被执行
应用:初始化<br>
单例模式 (设计模式)
普通的类是多列模式
将结构方法私有化
声明一个静态本类的·对象
提供公共静态的方法,获取本类实列
继承
说明:
如果两个类存在is(是)的关系<br>那么就两个类就允许存在继承关系父类和子类:父类中放的是共有的特征或者行为。子类中放的是独有的特征或者行为
父类中公开的方法或者属性子类都可以<br>无条件拿到(继承到)
单继承,每个类只有一个父类
继承的好处
少写一些共有的代码
提供另外一种形式的分类
代码重用
<br>父类和子类
父类(parentClass)也叫超类(superClass)也叫基类(baseClass)
子类(subClass)也叫派生类(deriveClass)
语法:子类 extends 父类
子类可以直接拿到父类的公有的<br>但是父类不能拿子类的,继承的单方向<br>一个类只允许有一个父类<br>继承也是单继承
super
super.属性可以显示调用父类属性<br>super.方法可以显示调用父类方法<br>但是请切记!!<br>super不是父类的地址(引用)<br>它仅仅是一个关键字<br>super()表示调用父类的构造<br>它也只能放在构造方法的第一行
this
this是一个当前对象的地址(引用)<br>this.属性<br>this.方法()<br>this()调用自己本类的构造
注意
<br>对于继承关系的构造方法<br>一定是先调用父类的再调用子类的
private 私有的 <br>friendly 默认的(友好的)<br>protected 受保护的(父子类)<br>public 公开的
<br>子类(派生类) extends 父类 (基类 超类)
super 调用父类的东西 可以调用父类的构造函数,子类在实例化的时候 会先调用父类的构造函数
重写&&抽象
赋值
使用setXX方法给属性赋值
使用构造方法给属性赋值
final
在类中使用,类不会被其他类继承
在属性中使用,属性不会被修改
注意:final修饰的变量称为:符号常量
在方法中使用,方法不会被重写
abstract:抽象类
定义——abstract
特点——不能被实列化
abstract:抽象方法
抽象体没有方法体
抽象方法必须在抽象类里
抽象方法必须在子类中被返现,除非子类是抽象类
重写·
子类用过重写父类的方法,可以用自身的行为替换父类的行为,方法的重写是实现多态的必要条件
定义:子类存在与父类相同的方法现象
1.“==”:方法名、形参列表相同
2.“
final&多态
多态定义:同一个引用类型,使用不同的实列而之呈现不同操作
实现多态的步骤:
编写父类
编写子类,子类重写父类方法
运行时,使用父类的类型,子类的对象
方法重写的规则:
再继承关系的子类中
重写的方法名,参数,返回值类型必须与父类相同
私有方法不能继承因而无法重写
优点:可扩展,可维护
里氏替换原则:子类替换父类
接口
1.定义接口:interface
特点:
1)接口中的方法都是抽象方法,abstract可以省略
2)接口中的变量都是公共的静态的最终常量<br> 可访问性默认也只能是public
3)接口不能被实列化
4)一个类可以实现多个接口
接口变量为什么不能修改:因为接口中的所有变量是符号常量,所以不能被修改
接口是一种规范
Arrays.sort排序
接口是什么
接口表示的其实是一种能力<br>
<br> 对象是对现实世界物体的抽象<br>
<br> 类是对对象的抽象<br><br>
<br> 接口是对类的抽象
语法:public interface 接口名<br> 如果一个类要实现这些功能:<br> 语法是 public class 类名 implements 接口名1,接口名2..
接口与抽象类的区别:
抽象类是类所以只能单继承,而接口(interface)可以多实现
抽象类继承用extends,而接口用implements
抽象类可以有构造,接口不能
抽象类可以有一般的属性,接口中的属性只能是静态常量
抽象类中可以有抽象方法,也可以有一般的方法,而接口中只能有抽象方法
抽象类中抽象方法可以被除private以外的修饰符修饰,但是接口中只能是public
常量一定是全大写
异常
异常定义:程序运行过程中可能发生的错误;
后果:可能导致应用中止
处理异常两种方式
if
try catch
try块:监控可能发生异常的代码
catch块:捕获异常、处理异常
1)捕获异常:声明类型是抛出异常对象类型或它的父类类型<br> Exception是所有异常类的父类
2)处理异常:printStsckTrace()是异常中的打印异常信息
如果发生异常会怎么样?
如果发生异常,系统会抛出异常对象,catch块中声明异常类的类型<br> 如果异常类的类型抛出异常对象的类型或它父类类型,
如果发生异常,try块中后面的代码不会执行,直接跳到catch块
常见的异常类型:
除数为0抛出:ArithmeticException
数组下标越界:ArrayIndexOutOfBoundsException
对象为空时,调用方法:NullPointerException
如果指定的类不存在:ClassNotFoundEcception
异常基类:Throwable类,它有Error和Exception子类
Error异常:属于jdk或系统异常
Exception:是程序抛出的异常
Exception:分为RuntimeException(运行时异常)和(非运行时异常)RuntimeException
try-catch-finally块
finally块:特点:无论是否有异常,都会被执行;<br>应用与释放资源
try可以只和finally块组合;但没有处理异常,所以异常还是会抛出
语法
try{//监视<br> 有可能出现问题的代码<br>}catch(异常的类型 异常信息所封装成的对象){<br> 处理异常的代码<br>}finally{<br> 最后会被执行的代码(有无异常都会被执行)<br>}
自定义异常 throws
抛出异常throw<br>