局部变量
在方法体内声明的变量以及方法体传入的形参都是局部变量,离开方法体后作用范围便失效,在方法体外部无法进行访问,且对局部变量做出的任何修改不会影响到调用方法体时传入的实参上
成员变量、函数
在类内声明的变量或函数为成员变量、函数
成员变量有默认值,布尔型(boolean)变量默认值为false,byte、short、int、long为0,字符型为'\u0000'(空字符),浮点型(float double)为0.0,引用类型(String)为null
成员变量和函数可以用public、protected、private关键字进行修饰
不进行修饰则默认权限为default,外部对类内成员变量或函数的访问权限由public、protected、default、private依次变小
访问范围如下:
public: 当前类、类所在包、子类、其他包
protected:当前类、类所在包、子类
default::当前类、类所在包
private:当前类
static
可以用static关键字对成员变量、函数进行修饰
用static关键字修饰的成员变量、函数归属为整个类任何该类的实例化变量共享static修饰后的成员变量及函数
static成员函数只能访问用static关键字修饰的成员变量
注意:非静态方法既可以访问静态数据成员 又可以访问非静态数据成员,而静态方法只能访问静态数据成员;
非静态方法既可以访问静态方法又可以访问非静态方法,而静态方法只能访问静态数据方法。
原因:因为静态方法和静态数据成员会随着类的定义而被分配和装载入内存中,而非静态方法和非静态数据成员只有在类的对 象创建时在对象的内存中才有这个方法的代码段。
引用类型
理解下面知识点之前可以粗略的了解下java虚拟机对内存的分配情况
jvm会对内存分成3块分别为stack栈、heap堆、method方法区
任何非java基本数据类型的变量都为引用数据类型
声明与类名同名的方法为构造方法,构造方法无需声明返回值类型,因为不需要进行返回
用new 类名()的方式对类进行实例化
引用数据类型声明时将在栈stack中声明一个指针(java没有指针,但可以理解为c++中的指针)
对引用数据类型进行new之后将在堆heap中分配内存,用于存储类中非static关键字修饰的成员变量、方法
static关键字修饰的成员变量、方法在类初始化之前就在method方法区中分配了内存用于存储这些变量和方法
类初始化之前不会有任何new关键字对类进行实例化,所以此时jvm未在heap中为该类的对象分配内存空间
因此static修饰的方法无法访问到非static修饰的变量
this
所有类或引用中有个默认的this变量,其为非static所以static方法也无法使用this变量
this变量为在堆中分配的一个空间,该空间的内容指向jvm为该类分配的heap空间的头部
因此this指针通常用于表示当前类实例化的对象
可以用this()的方式在一个构造方法中调用类中的其他构造方法(此处涉及重载,后面会讲)
this()只可以出现在构造函数的第一行
代码块
用花括号{}括起来的内容称之为代码块
代码块随处可见此处就不展开了
但有一种代码块比较特殊就是构造代码块
构造代码块写在类中声明成员变量的位置直接用{}括起来
里面的内容会在编译时加到所有未用this()的构造方法中
package
package可以对应理解为windows系统下的文件夹
java文件夹下的lang文件夹下的Math类对应为java.lang.Math
要使用需要在类头部import java.lang.Math 但java.lang.Math属于java常用包无需显式import也可使用
但调用Math类的方法时需要new一个Math类对象用 对象.方法() 的方式进行函数调用
import
上面例子如Math math = new Math();
如频繁用到math.abs()之类的调用可以用static import java.lang.Math.*的方式进行静态import
静态import后可以直接用abs()的方式进行函数调用
如果import的类里有不同包下的同名类,则后导入的包下的类进行实例化时必须写全包名
封装
一个类中非必要声明为public的成员变量和函数应该尽量声明为private进行封装
如类外部需要访问private的成员变量可以设置public的getter和setter函数对private成员变量进行修改和访问
继承
一个类可以用extend关键字对另外一个类进行继承,继承的父类之允许有一个
Java 父类中权限为private的私有变量,子类对象继承后,在其内存中其实也有该变量存在,只是不能直接引用该变量,而是需要通过调用父类public或protected的set或get等方法使用该变量。
无论父类中的成员变量是静态的、还是非静态的,子类都会拥有父类中的这些成员变量。
无论父类中的成员变量是否被子类覆盖,子类都会拥有父类中的这些成员变量。
没有显式用extend继承其他类则其默认继承Object类
Super
一个子类有内置的super关键字指向其父类
可以通过super+. 的方式访问父类中的public、protected的成员变量和函数
可以在本类的构造函数中用super(参数)的方式对父类的构造函数进行调用,参数数个数和类型与父类一致,参数不同调用的构造函数也不同,可以是无参构造函数
super(参数)的调用只允许出现在构造函数的第一行
一个构造函数中super(参数)和this(参数)不可同时使用
因为编译器会在编译时默认为所有未调用super(参数)的子类构造函数第一行加入super()(无参构造函数)
重写
一个子类可以对父类的成员函数进行重写
重写的函数名、返回类型、参数类型必须相同,否则不算为重写
重载
一个类可以声明多个名字相同的成员函数,但返回类型或参数类型或参数个数必须有一个不同
abstract
可以用abstract关键字在声明一个类时进行修饰
修饰后的类为抽象类,无法用new关键字进行实例化
抽象类也可以有构造方法,构造方法仅供子类进行调用
抽象类也可以有非抽象成员函数
抽象类的抽象成员函数在抽象类被继承后,子类必须对抽象函数进行重写,除非子类也为抽象类
有抽象函数的类必须声明为抽象类
final
如果不希望一个类被继承可以在声明该类时用final进行修饰
final和abstract不可联用
用final修饰的变量为常量,只允许一次性赋值,赋值可以同时在声明时进行,也可以先声明后赋值,赋值后不可再更改变量的值
native
用native修饰的类或方法为jvm调用内核实现的方法,了解即可
Object类
关于Object类的介绍这里有个链接我感觉说的很详细,这里不展开可以自行浏览
https://www.cnblogs.com/HuiH/p/11677018.html
多态
以Daughter类和Son类继承了Parents类为例
daughter和sonf分别对father类的teach()函数进行了重写
则Parents p1 = new Daughter();
Parents p2 = new Son();后
对p1.teach()和p2.teach()进行调用则会分别调用daughter的teach和son的teach
多态也可用于返回值中
如果有一个方法返回值有不同类型如
Parents bePerents(int type){
if(type==1)
return new Daughter()
else
return new Son()
}
可以以这种方法返回不同类型的参数
而调用处:
Parents p = beParents(1);
p.teach();则调用的daughter的teach,反之调用son的teach
这种多态使用方式常用在简单工厂模式,工厂方法模式,抽象工厂模式中这几种设计模式此处不展开