Java基础知识第二篇-面向对象

面向对象


    • 对于现实间事物有一定共同特征事物的抽象。
  • 对象
    • 对于类的实例化,即一个具体的事物。
  • 两者之间的关系
    • 类是对象的抽象,对象是类的实例化
  • 局部变量和成员变量的对比

    成员变量指的是在中定义的变量,且成员变量无需显式初始化,系统会在类的准备阶段或创建该类的实例时进行默认初始化
    局部变量指的是在方法中定义的变量
    局部变量存在于中,而成员变量存在于中。
    **成员变量的生命周期随着对象的产生而产生,消亡而消亡
    成员变量与局部变量同名时,在局部变量的作用域内局部变量优先**

  • 为什么有栈内存和堆内存之分

    当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法中定义的变量将会逐个放入这块栈内存,随着方法的执行结束,这个方法的内存栈讲自然销毁,因此,所有在方法中定义的局部变量都是放在栈内存中的,在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复运用(因为对象的创建成本通常较大)这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(在方法的参数传递时很常见),此对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候收回。

  • 面向对象的三大特征

    • 继承、封装、多态
      • 封装(private)一般只修饰一些类独有的属性或者方法
      • 优点:提高代码的安全性、复用性,将复杂的过程变简单
  • this关键字

    • this关键字总是指向调用该方法的对象
    • 作用:
      1. 区分同名的成员变量和局部变量
      2. 区分当前对象的属性和其他对象的属性
      3. this引用可以用于构造器中作为默认引用
      4. this()语句:实现构造方法之间的相互调用
      5. this()语句只能放在构造方法的第一句

构造器(构造方法)

  1. 目的只是用不同的方法来初始化(创建 )对象
  2. 一旦提供了自定义构造器,系统将不会提供默认的构造器
  3. 对于每个对象来说,构造器只在创建对象的时候都要执行一次。
  4. 构造器不能被一般方法调用
  5. 构造器之间可以互相调用(但是需防止递归构造器的出现)
  6. 构造器既不能定义返回值类型,也不能使用void声明构造器没有返回值
  7. 构造方法多用于传递参数

    • 构造代码块
    • 在类中由{ }表示,作用是初始化所有对象共有的部分。在每一次创建对象时调用。(调用早于构造方法)

    • 匿名类对象特点:是只能使用一次

    • static关键字
    • 实际上作用是用来区分成员变量、方法、内部类、初始化块这四种成员到底属于类本身还是属于实例(对象)
    • 可以修饰构造代码块、成员变量、成员方法
    • 当static修饰成员变量时,这个成员变量也叫类变量
    • static修饰的方法中不能使用this引用
    • 可以修饰类,但类必须是内部类

    • 静态成员和一般成员变量的区别

    1. 储存位置的不同,静态方法储存在方法区,静态变量储存在静态区,成员变量(方法)储存在
    2. 生命周期不同,静态变量(方法)随类的加载而加载,成员变量(方法)随对象产生而产生
    3. 静态成员(方法)可以直接使用类名.变量名来直接调用。
    4. 静态成员方法只能访问静态成员,不能访问非静态成员
      原因:静态成员的加载(类加载就加载了)早于非静态成员,所以静态成员可以调用非静态成员。
  8. 静态构造代码块
  9. 特点:只执行一次(类加载时执行)
  10. 静态构造代码块和构造代码块的区别
  11. 静态代码块随着类的加载而加载
  12. 构造代码块只要创建新对象就会被调用。
  13. 加载顺序
    静态代码块—>构造代码块—>构造方法

    最好不要使用对象去调用static修饰的成员变量、方法!!!!!

继承(extends)

  • extends—继承的关键字
    this—-当前类引用
    super—父类的引用

  • 继承后成员的特点

    1. 继承后,子类不能使用父类的非private的属性和方法
    2. java只能单继承。(一个类只能有一个(直接)父类)
    3. Object类是所有类的父类
    4. 当子类中有与父类同名的属性时,要调用父类属性需要在前面加super
    5. toString()方法会返回类名和所在的地址;equals()方法结果取决于toString方法,比较的是地址
  • 继承后构造函数的特点

    1. 当创建一个子类对象的时候,会先调用父类的构造方法,再调用子类的构造方法
    2. 每一个子类构造方法默认都会调用父类的空参构造方法
    3. 当父类没有空参构造的时候,子类就必须手动调用父类构造方法
    4. super语句和this语句都要写在第一行
    5. 子类的每一个构造方法都必须直接或间接调用父类构造方法
  • 重写和重载之间的区别

    • 重载发生于同一个类的多个同名方法之间,只关注同名方法的参数列表(父类和子类之间可能发生重载)
    • 重写除修饰符外要求完全相同,且重写只出现在子类和父类之间
    • 子类重写了方法的访问权限要大于等于父类方法
  • final关键字(可以修饰:变量、类、方法)

    • final类的特点:不能被继承
    • final变量的特点:一旦确定,不可修改
    • 常量的定义:全部大写。例:final double PAI=33.14;
    • final方法:不能被重写,但是可以产生重载

单例设计模式

单例类:如果一个类始终都只能创建一个实例,则这个类被称为单例类

懒汉式&饿汉式

**懒汉式:在需要创建对象的时候才new
饿汉式:在刚开始时就new好对象,调用时直接返回该对象**
区别:
1. 懒汉式只有第一次调用时才new 对象 饿汉式直接new一个对象
2. 懒汉式省内存 饿汉式耗费内存
3. 懒汉式有线程安全问题 饿汉式不存在此问题

抽象(关键字 abstract)

  • 抽象类:有抽象方法的一定是抽象类,但是抽象类中不一定有抽象方法
  • 父类如果是抽象类且含有抽象方法,子类必须重写抽象方法或者继续让该方法抽象
  • 抽象类不能创建对象(无法实例化)原因:如果创建对象后,抽象方法无法体现
  • 抽象方法要么被子类实现,要么子类继续为抽象类

接口

interface(定义接口),与类同级、implements(接口的实现)
接口是对外暴露的一种规则,目的是拓展功能,弥补java的单继承缺陷,接口之间可以多实现(继承)

  • 接口成员的特点:
    • 接口成员变量都是常量,接口的方法都是抽象方法
  • 类和接口的关系:

    1. 一个类实现了接口,那么称这个类是这个接口的实现者
    2. 一个类如果实现了部分接口,那么这个类必定是抽象类
    3. 一个类实现了接口方法,此方法必定是public修饰
  • 抽象类和接口的区别

    1. 都没有方法体,都不能够被实例化,无法通过new关键字创建实例
    2. 都可以包含抽象方法,实现接口或继承抽象类都必须实现其中的抽象方法
    3. 抽象类是一个类,接口和类属于并列关系
    4. 抽象类可以有非抽象方法,接口只能有抽象方法
    5. 抽象类可以有任意的成员变量,接口只有常量
    6. 抽象类只有单继承,接口可以多实现,接口之间可以多继承
    7. 抽象类的方法、变量必须写abstract,接口可以省略
    8. 接口中的方法之前的访问修饰符只能是共有的(public)

接口不能创建对象,但是可以创建引用!!!!
例如:A是B的子类,且B是一个接口,则可以:
B b=new A();//多态在接口中的应用

多态

B b=new A( );
B:编译时类型 A:运行时类型
前提:B是A的父类

java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由于声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现多态。

  • 多态的必要条件:

    • 要有继承
    • 要有方法的重写
    • 父类引用指向子类对象
  • 多态中的成员特点

    • 变量的值取决于引用(编译时类型),静态方法:取决于引用(编译时类型)
    • 一般方法:代码编译时看左边(看父类是否含有该方法,如果没有,编译不会通过)、运行时,看右边,执行的是子类方法的实体
    • 静态绑定:谁引用就是谁(变量和静态方法)
    • 动态绑定:谁调用就是谁(一般方法)
  • instanceof运算符
    用于判断一个引用类型变量是否属于一个类,返回值类型为boolean类型。
    注意:instanceof运算符前面操作数的编译时类型要么与后面的类相同,要么和后面的类具有继承关系,否则编译错误。

内部类

属性和方法不足以描述类中的一些特征,就需要内部类来表示
- 内部类的访问规则
- 在外部访问一个类的内部类的格式
外部类名称.内部类名称 变量=外部类对象.内部类对象
- 外部类访问内部类通过内部类对象来访问
- 内部类可以直接访问外部类的属性和方法(包括私有成员)
原因是内部类持有一个外部类的引用Outter.this
- 内部类一般私有
- 非静态内部类不能拥有静态成员
- 如果外部类需要访问非静态内部类的成员,必须显式的创建非静态内部类对象来调用访问其实例成员
- 创建内部类对象时,非静态内部类必须使用外部类对象来调用构造器
- 静态内部类
- 特点:静态内部类只能访问静态成员

当外部类成员基本都为静态时,才会选择使用静态内部类
如果使用static修饰一个内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象。(所有用static修饰的成员都是这样)
静态内部类中可以包含静态成员,也可以包含非静态成员
接口内部类只能是静态内部类(因为接口中定义的内部类默认使用public static修饰)
创建内部类对象时,静态内部类只需使用外部类即可调用构造器
- 匿名内部类
- 前提:匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口
创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。
匿名内部类不能是抽象类。因为系统在创建匿名内部类时,会立即创建匿名内部类的对象,因此不允许将匿名内部类定义为抽象类。
匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义初始化块,可以通过实例初始化块来完成构造器需要完成的事情。

异常

错误:error
异常:Exception(除0、数组越界、类型转换)
异常出现后的两种处理方式:
捕获异常:

try{
    可能出现异常的语句;
}catch(Exception e){
    异常处理代码;
}finally{
    用于保护的,必须执行的代码释放,占用内存的代码
}

特殊:try里面有return语句时,return后方法不会被回收,会等finally语句执行后才会被回收。

抛出异常:
throws——-用于一个方法头、抛出的是异常的类名
throw——–用于方法体内部、抛出的异常的是一个对象

接口的实现类中的异常不能选择抛异常

String 字符串(引用数据类型)

字符串一经定义,无法改变内容。
String类无法被继承,原因:API中显示String类为final

  • 两种定义方式:
    String s =”love”相当于String[ ]{‘l’’o’’v’’e’}
    String s1=new String(“asasas”)
    区别:s的定义只有一个对象,而s2的定义有两个对象(new String为一个对象,as为另一个)
  • String基本方法
length() // 获取字符串长度
substring() // 获取字符串的一个子串:
indexOf() // 获取(字符/子串)在字符串中第一次出现的位置
startsWith() // 判断一个字符串是否以指定内容开始
endsWith() // 判断一个字符串是否以指定内容结束
isEmpty() // 判断一个字符串是否为空
toLowerCase() //大小写转换(转小写) toUpperCase()//转大写
toCharArray() //字符串转字符数组
基本数据类型转String:使用String的构造方法 new String(基本数据类型[])
String.valueOf() String转基本数据类型
//String.valueOf方法可以转任何类型,包括Object类
trim()去除空格(只能去除前面和后面)
compareTo()//按位比较,返回值为具体数值,0为相等
split()// 切割
replace() //替换

前提:不论对字符串做什么操作,源字符串不变,操作后生成一个新字符串
- 字符串的操作类
StringBuilder和StringBuffer(String类的容器类)
- StringBuilder和StringBuffer的区别
1. StringBuffer为1.0版本出现的,而StringBuilder为1.5版本出现
2. StringBuffer是线程同步的(意味着安全),效率低;StringBuilder线程不同步,效率高,执行速度快。
3. 一般使用StringBuilder。(执行速度快)
- StringBuilder的常用方法

append()//添加字串
charAt()//查找字符(返回某一位置的字符)
delete()//删除字串
insert() //插入字串
replace()//替换字符
reverse()//反转字符串
subSequence() //取出字符串的一部分
  • 字符串的比较
    双等比较的是地址,equals比较的是内容
    String类重写了toString方法,用于返回它自身而不是它的地址

  • 工具类
    命令:javadoc –d 文件目录 文件名

  • 基本数据类型的封装类(以Int为例)
    基本数据类型封装类的父类都是Number类
  • 常用方法
    MAX_VALUE 最大值
    MIN_VALUE 最小值
    SIZE 返回该类型储存所占用的位数

自动装箱: 将int类型的数据直接装箱为Integer
自动拆箱:将Integer类型的对象直接拆箱为int(包装类中的intValue方法)
字符串转基本数据类型:包装类的构造方法new Integer(String s)
Interger的特殊情况:如果定义Integer对象的数值范围在byte只内(小于127)。就不会有新对象的产生,会直接指向此对象

Integer i3=128;     
Integer i4=128;         
sop(i3==i4);                
返回 false            
Integer i1=23;  
Integer i2=23;
sop(i1==i2);
返回true

常用方法:

parseInt(”101”,2//将二进制的101转换为十进制
toBinaryString(10//将10转换为二进制
toOctalString(10//将10转换为八进制
toHexString (17//将17转换为十六进制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值