变量所处的位置的不同,分为局部变量和成员变量(全局变量、实例变量)
变量三要素: 变量类型 变量名 作用范围/声明周期声明在方法中或者是代码块中的变量称之为局部变量。 只在当前声明的方法中有效 出了方法之后啥也不是 变量要声明之后 初始化之后才能被使用
声明位置: 类中 方法外
在整个类当中都有效,要注意下面代码报错的原因是由于static的问题而不是成员变量的问题。
在main方法中方法非static修饰的成员变量,需要在成员变量前加static修饰
成员变量都存在默认值:
整形->0
浮点型->0.0
逻辑->false
字符-> 空格 ‘\u0000’
引用类型->null
代码块:以一组大括号组成的一个代码段 代码块
一种编程技巧,程序中自己调用自己
递归头 终止环节
递归体
优势: 能够更快的写出代码 复杂度特别低
劣势: 特别消耗内存
凡是可以使用递归程序的都可以使用循环,但是能够使用循环的不一定能够使用递归
使用场景:数据结构和算法
能够做到栈帧复用的递归程序称之为尾递归
面向对象: 语言在发展过程中, 人开车 面向过程: 1:买辆车 2:考驾照 3:打开车门 4:踩离合,打火 5:挂挡、松离合、踩油门 。。。。 将一个问题,分成N多个小步骤,按步骤 按照顺序依次完成 整个功能就完成 面向对象: 对象: 对象可以帮助你完成一些功能或者是愿望 完成该功能中遇到的所有问题都和你无关 -> 更加轻松 驾驶员、人 车
面向对象和面向过程不是相对的,而是相辅相成。
面向对象和面向过程的对比:
面对对象:宏观上把控整个事务的完成度以及事务走向。 是对象帮我们处理具体的问题,而对象是如何做的,和调用者无关,调用者只需要负责结果即可。 调用的复杂度降低。底层具体的实现思路还是过程式的。 面向过程:微观上更精细化的处理具体问题
类中编写的内容有哪些? 成员变量:从属于当前类的 方法:对象完成 功能
编写类: Person类: 将张三、李四。。。的相同的部分抽离出来: 外在的表现形式: 姓名、年龄。。。。 -> 成员变量 内在的功能: 能够做什么 -> 方法 java中如何创建对象?
创建的对象的方法: 类名 变量名=new 类名();
创建对象要做的三件事:
1.开空间(在内存中开空间) 2.初始化(成员变量初始化) 3.指向引用 class类和对象的关系? 类: 分门别类。抽象的概念。祖先为了能够让后来的人更好的去认识这个世界,将各个具象的内容抽离出来一个一个的类。 对象: 将类中所有抽象的内容进行了具象化 。 现实生活中真实存在的。 类和对象: 类是对于对象的抽象,抽象就是抽取像的部分 对象就是对于类的具象化的体现。 问题:
先有类还是先有对象? 如果是编写过程: 先有类 再有对象 如果是构建过程: 先有对象,将对象的共性抽离出来,外在、内在->类问题:
什么时候类会被加载? 1:调用当前类中的静态方法 2:创建当前类的实例对象的时候在类中用来创建对象那个的方法称之为构造器 构造函数 构造方法
1:构造器是一个特殊的方法:
a:方法名称和类名相同 b:方法无返回值 c:在方法中无须显示return返回数据 d:构造器是允许方法重载的 e:所有类默认情况下都会存在一个无参构造器,如果在当前类中显式的声明了构造器之后,无参构造器就不存在了构造器的作用就是用来创建对象的
构造器的调用只能通过new关键词去调用当给一个类中的成员变量的类型声明为基本数据类型之后,导致基本数据类型存在默认值。未赋值的情况下存在值,后续的逻辑可能存在问题。当前对象的-》 谁在调用 代表谁
可省略: 不需要区分区分同名变量,局部变量和成员变量的时候可以省略不可省略: 区分同名变量,局部变量和成员变量不可以省略 \\为了区分同名变量这里的this 不能省略 public Student(String name) { this.name = name; }java中只支持单继承 一个子类有且只能有一个父类 复用性的提高是有限的
Q:多继承好还是单继承好?
多继承 :极大提高代码复用性 但是代码调用的复杂度也提升了 单继承:代码调用的复杂度比较低,但是复用性比较有限假设在应用场景中: A->B 后期随着业务不断扩展,导致A需要继承C时一般的解决办法:A->B->C 但是该种解决办法随着后期业务的不断升级,导致整个继承连会变得极其复杂,既不利于后期维护以及拓展。 所以,能不能用继承就别用继承。
当创建子类对象时 会先执行父类的构造器
super: 和this的用法一模一样
super. 表示当前对象的父类对象的
调用父类的构造器,默认情况下调用的父类的无参构造器(默认情况下每个类中都存再一个无参构造器 哪怕不写也存在)
当父类中存在其他构造器时,无参构造器不存在,此时如果再子类中没有通过super()显示的指定调用的构造器会导致程序报错。
在构造器中this()和super()不能同时出现,如果两个都不存在,默认是存在的super()。
在子类中定义了和父类中同名的方法 我们将该方法称之为重写方法(覆盖)
父类的功能不能满足子类的需求。子类在父类的基础上进行了扩展。
在子类的方法上加入@Overried 注解 如果不报错 证明是重写
Object: 是所有类的根基类 超类 父类
当一个类没有显式的继承关系的时候,默认情况下他的父类都是Object
Object: ctrl+O 罗列当前类中的所有方法 finalize: gc回收垃圾时 自动调用finalize wait notify notifyAll --- 学习多线程时候会讲 clone: 克隆 (创建对象的一种方式 深浅复制) hashCode: 哈希码 -> 哈希算法 唯一的值 getClass:获取当前类的Class对象 反射 输出一个对象的时候默认情况下会调用当前对象的toString局部变量只能通过final修饰
1:将类中的成员变量通过public 默认的 protected 修饰之后,导致在某些情况下 可以随意.出来。这些修饰符修饰的变量不够安全。2:将这些变量通过private 修饰。但是导致无法正常访问修饰符的作用是用来屏蔽一些底层的实现逻辑,降低调用者(程序员)的复杂度。确保当前类更加安全。 修饰符可以修饰 类
属性(成员变量) : 避免随意.属性,修改获取属性 造成数据不安全 如果用private修饰的话 一定要保证对外提供get、set方法让外部可见方法屏蔽底层调用细节,降低调用者(程序员)的复杂度 使得代码更加健壮public private 比较常用前人总结的(编码)套路 23种: 遵循5大原则,以开闭原则为基础 (模式推荐书籍:大话设计模式、设计模式之禅、ODD)
一个类只能产生一个实例对象
什么场景下使用单例:windows 任务管理器 Spring SessionFactory注意:
public : 外界一定是通过该方法获取当前类的实例对象 所以对外一定要可见static : 构造器都私有了 外部肯定无法获取到当前类的实例对象 所以只能用 static修饰 属于类的 可以通过类名调用。不加static要通过对象调用 对象没有返回值 : 当前类的实例lazy: 懒汉式 能够做到延迟加载 但是线程不安全
多种形态
{} 代码块:
声明在方法中的代码块 缩减局部变量的生命周期 提高内存是使用率
初始化块 声明在方法外 类中的代码块 初始化块在类加载的时候是不会执行的 在创建对象之前会被调用(对于对象中的一些初始进行初始化操作)
声明在类中 方法外 且使用static修饰 类加载的时候就会被加载 并且只加载1次 静态内容
类加载:
使用当前类中的静态方法、静态变量创建当前类的实例对象父类型 变量名 = 子类对象;【new 子类对象|子类对象的变量】
强制转换子类型 变量名 = (子类型)父类变量; [事先确定了父类变量中实际存储的对象是什么类型]
错误提示:ClassCastException 类型转换异常