构造函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造函数相关的知识,希望对你有一定的参考价值。

变量:存值

表达式:计算一个值   值    

运算符:() =

语句:    编程

语句块:{。。。}

函数:名字{...}


数组:存多个值 



面向对象语言:抽象  封装   继承 多态

java:

jdk:java开发环境  jre

jvm:虚拟机

jre:java运行环境  jvm+一些必要的类

类:描述事物

静态特征:姓名 身高  性别     -- 变量(属性)

动态特征:eat sleep study swim    -- 函数(方法)


属性:不能重名!

方法:可以重名 ,构成了重载

重载:方法名一致,参数不一致即可(参数的个数,类型,顺序)  与返回值无关

构造函数可以重载

*** 方法调用是根据不同的参数调用不同的重载方法




类与对象:类是创建对象的模板   电子档试卷(类)     打印出来(对象)

如何创建对象:new People()  new:开辟内存空间  People():构造的对象

构造函数:类的名称 (){}  专门用来创建对象  同时在创建对象的时候 还可以赋值  如果构造函数是否成功执行 标志着 对象创建的成功与否

不能自己调用  是虚拟机调用 创建对象

每个类都有一个默认的构造函数(无参),如果你在类里面显示的写了一个构造函数,那么这个无参的构造函数 就不存在了

People p=new People();//创建people对象 并且 把这个对象的地址(指针)  赋给 变量 p

this:表示当前对象(指针)



类与类:


继承(extends):节省代码   继承的是那些允许被继承的(public protected )    提供 子类对象访问父类成分的一种途径

属性覆盖:子类覆盖父类的属性,只要属性名称一致就可以了,类型可以不一样    通常在属性中 很少 覆盖父类的属性

方法覆盖:方法名一致 参数一致  返回值一致  访问控制 权限 越来越 宽泛


***构造函数不能覆盖


创建对象:先创建父类对象 再创建子类对象

super:父类对象(指针)

super()是调用父类的构造函数 ,写与不写都存在,如果显示的写出来,只能在构造函数的第一行,super中的参数决定调用哪个构造函数


组合:一个类的对象拥有另一个类的对象



多态:字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态  (父类引用指向子类对象) 

多态前提是继承

2种环境:

编译时环境:只要符合java的基本语法

运行时环境:产生什么对象 就是执行该对象成分



接口(interface):定了一套规范和标准   可以有方法(没有方法体)和属性(常量)

接口 不是类  它没有构造函数  也不能够(不需要)创建对象  专门给类实现的

java语言只支持单继承(C++语言支持多继承) 支持实现多个接口  --  某种程度上降低了 单继承带来的 功能缺失

接口中的方法  都是抽象方法



抽象类(abstract class):描述一些抽象的事物    专门被继承的

抽象类中可以有抽象方法 也可以没有抽象方法  (可以全部抽象方法,可以全部不是抽象方法)

抽象类 中的抽象方法 ,子类一定要实现

抽象类  有构造函数    但是不能直接创建对象     子类创建对象的时候 ,可以产生父类对象 已供子类继承 



抽象类与接口:

抽象类 可以实现全部或部分接口方法, 也可以不实现接口的方法,如果抽象类不实现接口方法 子类一定要实现剩下的接口方法

抽象类可以实现接口方法,并且在接口方法中 抛出其它抽象方法,屏蔽子类直接操作接口方法




final:不能改变

属性:常量(不能改变值)

构造函数:不能修饰

方法:不能被覆盖

类:不能被继承


static:静态   --  类的成份

类:不能修饰类

属性:静态属性(变量)  类的属性

构造函数:不能修饰

方法:静态方法   类的方法


代码块:每次创建对象的时候 会促发 代码块执行   只执行一次


静态代码块 :会在 类加载的时候 执行一次 且 只执行一次




访问控制权限:private (defalut) protected   public

private :本类中访问

(defalut) :同包中访问

protected :子类或同包中访问

public:都可以访问



8种基本数据类型:byte boolean char short int float long double

String;不是基本数据类型 但是它表示出基本数据类型的特征




常用类介绍:

String:字符串   

字符串池:第一次创建字符串变量时,会到池中照这个变量值,如果没有创建一个 放入池中,后面直接从池中拿这个值,

但是new 会开辟新的内存空间 (==比较的是地址)



StringBuffer:能够追加字符串 (解决字符串常量问题)

StringBuilder 与 StringBuffer 一样,只是线程不安全 


Date:表示时间 主要用到new Date()创建时间  ,后来逐渐被Calendar 取代,Calendar 描述日期更为丰富


Math:主要用来数学计算 ,  常用 random 获得随机数,round 取整。


异常:

Throwable:包含Error 和 Exception。

Error :比较严重的问题 ,系统性问题 (虚拟机出题,系统出现问题)

Exception:程序出现的一些问题,通常是由于程序人员考虑不周等情况 发生的问题

(程序出现的问题,这些问题本省可以避免)


异常分类:

1.运行时异常:不要求强制处理,只有在运行时可能发生异常

2.受检查异常(check):必须处理,不能会不会发生异常

(有些操作 jvm认为可能出现异常几率较大  所以要求强制处理 )


异常处理:

throws:主要针对受检查异常 ,写在方法上,表明该方法具有抛出异常的功能 ,能抛异常根据throws 后面跟的异常类型 

( public static void main(String[] args) throws FileNotFoundException )

运行时异常不需要 throws  标明具有抛异常的功能


抛出:

1.jdk抛出:FileInputStream fis=new FileInputStream("D:/11.txt"); 

 异常由jdk抛出来 逐级向上抛出  最后如果main也没处理 那么就抛给虚拟机,虚拟机接受异常  立即停止执行

2.人为抛出:throw 抛异常

throw new Exception("除数不能为0");


捕获:try {} catch (Exception e) {} catch (Exception e) {}  finally{}

catch捕获异常 针对 try中的代码块,catch在捕获的时候只能捕获参数指定的异常,如果异常被捕获,那么不在向下捕获,跳出捕获模块,执行try catch模块下面的语句

try中产生异常,try中后面代码不在运行      

finally:不能try中代码有木有异常 都会执行,除非强制退出JVM

一般 catch (Exception e) {} 放在catch模块的最后位置


一般不建议使用 try {try {} catch (Exception e) {} } catch (Exception e) {} ,try catch嵌套, 

建议大家采用try {} catch (Exception e) {} catch (Exception e) {} 

catch中不建议编写业务代逻辑码  try中代码要尽量少



//非常不建议,不够规范

// try {

// int n=i/j;

// }finally{

// System.out.println("--finally--");

// }



自定义异常:

1、能够更好的查找程序的错误

2、让异常信息更友好



***异常能够改变程序执行的流程

***提供程序出错的解决方式之一


复习2月18日内容


异常分为两大类:

Error + Exception(RuntimeException+受检查异常/编译期异常)

java程序写成的文件叫java源代码文件(.java)-->编译,字节码文件(后缀名是.class)-->运行,JVM

异常的五个关键字try{可能产生异常的代码} catch(异常类型 参数名){打印异常信息} finally{强制执行的代码,一般包括释放资源等}

try如果不紧跟这catch语句,则必须添加finally语句

try语句后续可以接多个catch语句,如果包含多个catch语句块,需要先写子类异常,再写父类异常

throws:抛出异常:方法名 throws 异常类型名称

throw:抛出一个具体的异常 ,写法:方法体内throw 一个具体的异常对象;

面试笔试必考题:写出不少于5个的常见异常

ClassCastException:类型转换异常

NullPointerException:空指针异常

ArithmeticException:数学异常

IndexOutOfBoundsException:索引越界异常

IllegalArgumentException:参数异常

FileNotFoundException:文件没有找到异常

ClassNotFoundException:没有找到类异常

2月19日内容

1、java中所有类的祖先类都是Object,一个类如果没有显示写出父类,那么系统默认父类是Object


2、建议子类重写父类的toString方法,直接输出一个对象名其实是调用了此对象的toString方法


3、toString: 包名.类名[email protected]+一段数字,为什么字符串的toString方法返回形式不是这样呢?因为字符串重写了父类的toString方法

重写:在继承关系中,子类的方法名、参数类型、返回值完全和父类一致,方法的重写

4、hashcode是对象地址的整数映射

5、getClass返回值class 包名.类名

6、阐述final、finalize、finally三者的区别

final可以修饰类、属性和方法,修饰类时类不能被继承,属性的属性表示常量,修饰的方法表示方法不能被重写

finalize垃圾回收器调用的方法

finally异常中必须执行的方法(提前中断有可能不执行)

7、当equals方法被重写时,通常有必要重写 hashCode 方法

8、final修饰的属性是只引用不可变还是值不可变?

9.字符串使用构造方法初始化和使用"="初始化区别




本文出自 “11149571” 博客,请务必保留此出处http://11159571.blog.51cto.com/11149571/1743270

以上是关于构造函数的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

防止 Proguard 删除片段的空构造函数

无法解析片段中的 ViewModelProvider 构造?

为啥要避免片段中的非默认构造函数?

片段真的需要一个空的构造函数吗?

这个嵌套类构造函数片段可以应用于泛型类吗?