java面向对象一些知识点的整理

Java面向对象编程

类与对象

1.访问控制修饰符

  • private,只有同一类可以访问
  • (default)缺省,只有同一类,同一包中的类
  • protected,同一类,同一包类,不同包子类
  • public,都可以使用

注意:private、protected、public不能修饰局部变量

2.引用与垃圾产生分析

1617164870145.png
  • 垃圾空间就是没有任何栈内存所指向的堆内存空间。
  • 产生的垃圾过多,会影响GC的处理想能,所以对于垃圾的产生应该越少越好。
  • 一个栈内存只能保存一个堆内存的地址。

3.构造代码块:{}

每次生成对象都先执行构造代码块,优先于构造方法。

4.静态代码块:static{}

只执行一次,优先于构造代码块

在主类中,优先于主方法先执行

class Student{
    //构造方法
    public Student(){
        System.out.println("构造方法");
    }
    //构造代码块
    {
        System.out.println("构造代码块");
    }
    //静态代码块
    static {
        System.out.println("静态代码块");
    }
}

public class Test { 
    public static void main(String args[]) {
          Student student1 = new Student();
          Student student2 = new Student();
    }
}

四大特性

一、封装

  • 将类的基本信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来对实现对隐藏信息的操作和访问成员变量private,提供对应的getXxx()/setXxx()方法

  • 作用:提高了安全性,复用性,实现了程序的高内聚、低耦合。

二、继承

  • 继承就是在一个已经存在的类的基础之上,在加入或者修改(覆写)为自己独特的特性。

  • class Zi extends Fu 特点:单一继承、隐式继承、多层继承

好处和弊端

  • 好处

    • 提高代码的复用性(多个类相同的成员放在同一个类中)
    • 提高代码的维护性(只需修改一处)
  • 缺点

    • 类的耦合性增强了

什么时候用继承

  • 继承体现的关系:is a
  • 假设法:我有两个类A和B,满足A是B的一种时才考虑使用继承

继承中构造方法的访问特点

  • 子类中所有的构造方法都会默认访问父类的无参构造方法,相当于隐式调用了super()

  • 原因:因为子类会继承父类中的数据,可能还会使用父类中的数据,所以在初始化子类之前要先进性父类的初始化。

遇到只有有参构造方法的父类时

  • 使用super显示的调用父类的构造方法
  • 父类中自己提供一个无参的构造方法(推荐)

private修饰的属性,被隐式继承了

三、多态

  • 同一个对象,在不同时刻表现出来不同的形态。

多态的前提和体现

  • 有继承/实现关系
  • 有方法重写
  • 有父类引用指向子类对象

向上转型

  • 从子到父
  • 父类引用指向子类对象

向下转型:

  • 从父到子
  • 子类引用父类对象

判断是否可以向下转型

  • 对象 instanceof 类; 返回boolean类型

好处和弊端

  • 好处

    • 提高了程序的扩展性和灵活性
    • 体现:定义方法的时候,使用父类型作为参数,将来使用的时候,使用具体的子类型参与操作
  • 弊端

    • 不能使用子类的特有功能

四、抽象

  • 抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。

this/super

this

  • 单独用表示当前对象的引用(注意)注:super单独没有表示的意义

内存图

1617677908676.png

对比关系

关键字 访问成员变量 访问构造方法 访问成员方法
this this.本类成员变量 this(...) this.本类成员方法()
super super.父类成员变量 super(...) super.父类成员方法()

注意

  • this先在本类中找属性,再到父类中找,super直接去父类中找
  • this\super都可以进行构造方法的调用,但是this()调用的是本类构造方法,super()调用的是父类构造方法,故两者不能同时使用

静态(static)

成员变量

  • 可以直接通过类访问
  • 类级别的,也可叫做类变量

成员方法

  • 可以直接通过类名访问,也叫做类方法
  • static:属于类与this冲突
  • 静态能够访问静态,不能访问非静态
  • 非静态能够访问非静态,能够访问静态

代码块

  • 当java虚拟机加载类时,就直接执行。

注意:static不可以修饰局部变量

抽象(abstract)

特点:

  • 一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类
  • 抽象类不一定有抽象方法,抽象方法一定在抽象类里
  • 抽象类不能直接实例化,但可以通过多态的形式,由子类创建。
  • 抽象类子类要么是抽象类,要么就要重写实现所有抽象方法

成员特点:

  • 可以有成员变量,构造方法,成员方法,抽象构造方法

接口(标准\能力)

特点:

  • 接口用关键字interface
  • 类实现接口用implements表示
  • 接口可以参照多态的方式,通过实现类的对象实例化,这叫接口多态
  • 多态的形式:具体类多态,抽象类多态接口多态
  • 多态的前提:有继承或者实现关系,有方法重写;有父(类/接口)引用指向(子/实现)类对象
  • 接口的实现类:要么是抽象类,要么实现接口中的所有抽象方法

成员特点:

  • 1接口中没有成员变量,只有常量,且为静态(默认被public static final修饰)
  • 2接口里没有构造方法,没有非抽象方法
  • 3接口里的方法默认被public abstract修饰

jdk8,jdk9有新特性

  • 默认方法(default修饰)
    • 有方法体,升级接口但不会破坏现有代码(可以重写但不强制)
  • 静态方法(static)
    • 有方法体,只有接口才可以调用:接口名.方法名();
  • 私有方法(private)
    • 有方法体,被默认方法和静态方法使用

类和接口:

  • 类可以实现多个接口,但只能继承一个类
  • 接口可以继承接口,且可以多继承

抽象类和接口:

成员区别:

  • 抽象类:变量,常量;有构造方法;有抽象方法,也可以有非抽象方法
  • 接口:常量,抽象方法

设计理念:

  • 抽象类:对象抽象,包括属性,行为
  • 接口:对行为抽象,主要是行为

抽象类名作为形参

  • 方法的形参是抽象类名,其实需要的是该抽象类的子类对象
  • 方法的返回值是抽象类名,其实返回的是该抽象类的子类对象

接口名作为形参

  • 需要实现接口的对象

内部类

成员内部类

  • 它可以直接访问外部类的成员

内部类如何在外界创建对象使用:

  • 外部类名.内部类名 对象名 = 外部类对象.内布类对象;
  • Outner.inner oi = new Outer().new inner();(内部类要是公有的)
jo.method(new jumping(){
public void jump(){
    syso;
}
});

注:用static定义内部类则其就成了“外部类”,其只能访问外部类的静态属性或方法。范问:Outner.inner oi = new Outer.new inner();

注:以后在开发之中如果发现类名称上提供了“.”首先应该立刻想到这是一个内部类的结构,如果可以直接进行实例化,则其是一个static定义的内布类或接口(接口最为常用)

局部内部类

  • 间接调用
  • 也可以访问外部类成员,还可以访问方法内的成员

匿名内部类

  • new 类名/接口名(){重写方法}
  • 它实际是继承了该类或实现接口的对象
  • 应用:当只是想调用这个类中的方法或这个接口的方法是,用这种形式可以免去创建其实现类/继承类的过程。

匿名对象

  • 例子:new 类名().add();
  • 注意:使用之后就会称为垃圾,会被GC清楚

数据表和简单java类的映射转换(迈向正规的第一步)

映射:

  • 数据实体设计 = 类的定义
  • 表中的字段 = 类的成员属性
  • 表的一行记录 = 类的一个实例化对象
  • 表的多个记录 = 类的数组
  • 表的外键关联 = 引用关联实现

在实际开发过程中,一定是:

  1. 根据表的结构关系进行对象的配置
  2. 根据要求通过结构获取数据

覆写(重写)

  • 覆写的方法不能比父类父类方法的访问权限更加严格

面试题:

请解释Override与Overloading的区别:

区别 Overloading Override
中文含义 重载 覆写
概念 方法名称相同,参数的类型及个数不同 方法名称、参数类型及个数、返回值相同
权限 没有权限限制 被覆写方法不能拥有更严格的控制权限
范围 发生在一个类中 发生在继承关系类中

注:重载的返回参数不一定相同,但是好的习惯应该保持返回类型一致方便处理

属性覆盖(一但封装,没太大意义)

在子类中定义与父类相同名字的属性,就会覆盖父类

你可能感兴趣的:(java面向对象一些知识点的整理)