异常的理解
异常指的是程序在执行过程中,出现非正常情况,不处理会导致 JVM 非正常停止,并非代码逻辑或语法出现问题,比如,客户端输入的数据格式错误,要读取的文件不存在,网络不畅通等等…
异常抛出的机制
java 把不同异常用不同的类表示,一旦出现异常,就会创建该异常类的对象,并且抛出 throw 程序员就可以捕获 catch 这个异常对象
异常体系Throwable 异常体系的根父类常用方法
public void printStackTrace():打印异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得使用 printStackTrace
public void getMessage():获取发生异常的信息
Error 错误 与 Exception 异常Error:
Java 虚拟机无法解决的严重问题。如:JVM 系统内部错误、资源耗尽等 严重情况。一般不编写针对性的代码进行处理
例如:StackOverflowError(栈内存溢出)和 OutOfMemoryError(堆内存溢出,简称 OOM)
Exception:
其它因编程错误或偶然的外在因素导致 ...
static 关键字
如果想让一个成员变量或方法被类的所有实例所共享,就用 static 修饰即可,称为类变量、类方法或类属性、静态变量
使用范围:属性、方法、代码块、内部类
被修饰后具备的特点:
随着类的加载而加载
优先于对象存在
被所有对象所共享
访问权限允许时,可不创建对象,直接被类调用
static 成员变量和方法静态变量使用 static 修饰的成员变量就是静态变量(或类变量、类属性)
public class Goods{
// 实例变量
String name;
double price;
// 类变量,静态变量
static String brand = "优乐美";
public Goods() {}
public Goods(String name) {
this.name = name;
}
}
public calss GoodsTest{
public static void main(String[] args){
Go ...
继承类的继承,子类继承父类的所以方法和属性
当多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个 类中无需再定义这些属性和行为,只需要和抽取出来的类构成继承关系
通过 extends 关键字,可以声明一个类 B 继承另外一个类 A,定义格式如下:
[修饰符] class 类 A {
...
}
[修饰符] class 类 B extends 类 A {
...
}
例如
// 动物父类
class Animal{
String name;
int age;
public void eat(){};
}
// 猫类
// 继承动物类的属性和方法
class Cat extends Animal{
// 新增猫捉老鼠方法
public void catchMouse(){};
}
继承的优点
减少了代码冗余,提高了代码的复用性,更有利于功能的扩展
现让类与类之间产生了 is-a 的关系,为多态的使用提供了前提
继承描述事 ...
面向对象的程序设计思想
类 :在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽 象出来,用类来表示。
典型的语言:Java、C#、C++、Python、Ruby和PHP等 代码结构:以 类 为组织单位。
每种事物都具备自己的 属性 和 行为/功能 。
是一种“设计者思维 ,适合解决复杂问题。代码扩展性强、可维护性高。
面向对象特征
封装、继承、多态、(抽象)
面向对象例子把猪肉放进冰箱
面向过程的做法
1.打开冰箱
2.把猪肉装进冰箱
3.把冰箱门关住
面向对象的做法
人{
打开(冰箱){
冰箱.开门();
}
操作(猪肉){
猪肉.进入冰箱();
}
关闭(冰箱){
冰箱.关门();
}
}
冰箱{
开门();
关门();
}
猪肉{
进入冰箱();
}
类和对象类(Class) 和 对象(Object) 是面向对象的核心概念
什么是类
类:具有相同特征的事物的抽象描述,是 抽象的 、概念上的定 ...
模块化
typescript最主要使用的模块化方案是 ES Module
知识点
在JS中规范声明如何没有 export 的 JS 文件都当作为一个脚本,并非模块
在脚本文件中,变量和类型会被声明在共享的全局作用域,将多个输入文件合并成一个输出文件,或者在 HTML使用多个 <script> 标签加载这些文件
将文件转成模块化文件加上 export{} 将会被模块处理,此时没有导出任何东西。{}里添加导出的内容即可
内置类型导入导出TS支持单文件导入导出,只需要加入 type 前缀,表示导入的是一个类型
// type.ts
export type IDType = number
export interface IFoo = {
name: string
age: number
}
// index.ts
import {type IDType, type IFoo } from './type'
// 写在前面也可,表示都是导入的都是type
import type ...
认识泛型软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能
在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件
需要方法使返回值的类型与传入参数的类型是相同,使用 类型变量,特殊的变量,只表示类型而不是值
function foo<Type>(arg: <Type>): Type{
return arg
}
// 参数类型为 number
const num = foo<number>(123)
// string
const str = foo<string>('hello')
// 类型推论,根据传入的参数自动确定Type的类型
const hello = foo('hello world') // type of output will be 'string'
给foo 添加类型变量Type ,帮助我们捕获用户传入的类型( ...
类 class
JS从ES6开始,引入了class关键字,可以更加方便的定义和使用类
TS作为JS的超集,支持使用class关键字,可以对类的属性和方法等进行静态类型检测
使用例子
class Person {
name: string
age: number
// 构造函数
constructor(name: string age: number){
this.name = name
this.age = age
}
running(){
console.log(this.name + ' running')
}
eating(){
console.log(this.name + ' eating')
}
}
// 创建实例
const kun = new Person('ikun',18)
kun.running()
类的继承
面向对象其中一大特征就为继承,可减小代码量
使用 extends 关键字来继承,子类使用 super ...
函数类型的表达式函数作为参数是也可以标识类型
type Calcfunc= (number1:number,number2:number)=>number接受两个参数的函数,number1 为number 类型,number2为number类型,返回值为number类型 使用
function foo(fn: Calcfunc){
// 5
console.log(fn(2,3))
}
// 调用
foo(function(num1: number,num2: number){
return num1+num2
})
调用签名函数表达式不支持声明属性 需要声明属性采用调用签名
interface IcalcFun {
name: string
// 返回值用标识符:声明,并非同上面的函数表达式 => 声明
(number1: number,number2: number): number
}
function foo(fn:IcalcFun){
console.log(fn.na ...