面向对象最重要的两个概念:类和对象;
类名的首字母大写,满足“驼峰写法”;
一个Java代码文件中,可以定义多个类,但是只有一个类是public修饰的,而且public修饰的类名必须成为代码的文件名称;、
类中的成分研究:
类中有且仅有五大成分(五大金刚)
1.成员变量(Field:描述类和对象的属性信息的)
2.成员方法(Method:描述类或者对象的行为信息的)
3.构造器(constructor:初始化一个类的对象并返回引用)
4.代码块
5.内部类
注意:只要不是这5大成分放在类下就会报错;
面向对象三大特征:封装、继承和多态;
什么是特征:特点就是特征,
封装的作用:1、提高安全性。2、实现代码的组件化;
封装的规范:1、建议成员变量都私有,用private修饰;2、提供成套的getter和setter方法暴露成员变量的取值和赋值。
静态成员变量:可以和类名一起访问;
实例成员变量:需要先new一下;
在同一个类中访问静态成员可以省略类名不写;
成员变量和成员方法访问的拓展(面试题):
继承的作用:
1、可以调高代码的复用,相同代码可以定义在父类中;
2、在Java中,继承是is a的关系。
3、子类不能继承父类的静态成员;
4、子类可以继承父类的私有成员;
5、就近原则:子类有找子类,子类没有找父类,父类没有报错;
super 父类,this,当前类;啥也不加,局部子类;
方法重写:一般是子类继承父类之后;
方法加上@override 则必须是成功重写父类的方法,否则报错;
子类重写的返回值类型,要么和父类一样,要么比父类的范围范围值更小;
静态方法和私有方法是否可以被重写?? 都不可以?
构造器:
子类构造器的第一行默认一定会访问父类的无参构造器,再执行子类自己的构造器;
通过super()可以根据参数选择调用父类的某个构造器;
this和super的关键字使用总结:
工作场景:张三对这个工作更熟悉,工作交给他来做;
注意:
this 借用本类其他构造器;
super调用父类的构造器;
this和super 必须放在构造器第一行,否则报错;
所以this和super不能同时出现在构造器中;
继承的特点:
1 一个类只能继承一个直接父类;如果继承两个,会出现类的二义性;
2 多层继承;一个类可以间接继承多个父类;
引用类型作为方法参数和返回值:
引用类型作为Java的数据类型,自然可以作为方法的参数类型和返回值类型。除了基本数据类型都是引用数据类型;
拥有抽象方法的类,一定定义为抽象类;
抽象类的特征:有得有失:
1、有得:抽象类得到了拥有抽象方法的能力;
2、有失:抽象类失去了创建对象的能力。(抽象类不能创建对象);
抽象本身意味着,不能具体化;除此之外,别的成分都有;
抽象类的子类,必须重写抽象父类的所有抽象方法,否则子类也必须定义为抽象类;接口???
接口与接口的多继承:
接口同样不能创建对象。
接口与接口的多继承关系:一个接口可以同时继承多个接口;
JDK1.8之后,接口新增的方法(Lambda Stream 函数式接口):
(1)默认方法:写的实例方法:必须用default修饰;默认用public修饰;只能用接口的实现类的对象来调用;
(2)静态方法:可以直接用static修饰;默认加public修饰;接口的静态方法调用只能用接口的类名称调用;
(3)私有方法(JDK1.9开始的):私有的实例方法,必须加private修饰;私有方法通常是给其他私有方法或默认方法调用的;
接口使用的注意事项:
1、如果实现了多个接口,多个接口中存在相同的静态方法并不会冲突,原因是因为只能通过各自接口访问各自静态方法;
2、当一个类继承父类,又实现若干个接口,父类中的成员方法与接口中的默认方法重名,子类就近接受执行父类的成员方法;
3、当一个类实现多个接口,多个接口中存在同名的默认方法,实现类必须重写这个方法;
静态代码块:
静态代码块按照static分为:静态代码块、实例代码块;
属于类,会和类一起优先加载,而且自动触发执行一次;
静态代码块可以用于在执行类的方法之前进行静态资源的初始化操作;
实例代码块:
属于类的每个对象,会和类的每一个对象一起加载;
每次创建对象的时候,实例代码块就会触发执行一次;
实例代码块可用于初始化资源(扩展);
实例代码块实际上提取到每一个构造器中执行的;
final关键字
final 修饰类,类不能被继承;
final修饰方法,方法不能被重写;
final修饰变量,变量有且仅能被赋值一次;
扩展:abstract和final的关系是什么?互斥关系,一个继承,一个不能被继承;不能同时出现修饰成员;
final修饰静态成员变量,变量变为常量;
final修饰实例成员变量可以在哪些地方赋值1次:
1.定义的时候赋值一次。
2.可以在实例代码块中赋值一次。
3.在每个构造器中赋值一次。
单例模式:
什么是单例: 单例是一个类永远只存在一个对象,不能创建多个对象;
为什么用单例:开发中有很多类的对象,我们只需要一个,例如虚拟机对象,任务管理器对象!对象越多越占内存、单例节约内存,提高性能;
如何实现单例:(1)饿汉单例设计模式:通过类获取单例对象的时候,对象已经提前做好了;(2)懒汉单例设计模式:通过类获取单例对象发现没有对象,采取创建一个对象。
(1)饿汉单例设计模式
1、定义一个静态成员变量存储一个对象;
2、类的构造器私有,构造器只有在本类中访问;
3、提供一个方法返回单例对象;
(2)懒汉单例设计模式
1、构造器私有;
2、定义一个静态成员变量用于存储一个对象;
3、通过方法返回一个对象,第一次不存在对象才创建一个返回;
枚举类
作用:做信息标志和信息分类的;
格式:修饰符 enum 枚举名称{
实例1名称,实例2名称....;
}
--- 枚举类第一行罗列的必须是枚举类的对象名称;
特点:1、枚举类是final修饰的,不能被继承;
2、枚举类默认继承了枚举类型,Java.lang.Enum;
3、枚举类的第一行罗列的是枚举类对象,用常量存储;
4、第一行写的是常量对象,默认存储枚举类对象;
5、相当于多例设计对象;
常量 类名.名称;
多态
形式:父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
多态的概念:
同一个类型的对象,执行同一个行为,在不同的状态下会表现出不同的行为特征;
对于方法的调用:编译看左边,运行看右边;
对于变量的调用:编译看左边,运行看左边;
多态的使用前提:
(1)必须存在继承或实现关系;
(2)必须存在父类类型的变量引用子类类型的对象;
(3)需要存在方法重写;
多态的优劣势:
优势1、在多态形式下,右边对象可以实现组件化切换,业务也随之改变,便于扩展和维护,可以实现类与类之间的解耦;
2、实际开发过程中,父类类型作为方法形式参数,传递子类对象给方法,可以传入一切子类对象进行方法的调用,更能体现多态的扩展和便利;
劣势1、多态形势下,不能直接调用子类的独有的功能;父类没有子类独有的功能;
引用类型的自动类型转化
小范围变量赋值给大范围的变量;小范围对象赋值给大范围的变量;
父类类型的变量或者对象强制转化为子类类型的变量;
多态下,类型转化异常问题研究(重点):
有继承/实现关系的两个雷翔就可以相互转换,并且不报错;
内部类
什么是内部类:定义在一个类里面的类就是内部类;
内部类作用:提供更好的封装性,内部类有更多权限修饰符,封装性有更多的控制;
内部类的分类:
(1)静态内部类
(2)实例内部类(成员内部类)
(3)局部内部类
(4)匿名内部类(重点);
1、静态内部类
什么是静态内部类:有static修饰,属于外部类本身,会加载一次;
成分研究:类有的成分,他都有,只是位置在别人的里面;
外部类 = 宿主;
内部类 = 寄主;
静态内部类的访问格式:
外部类名称.内部类名称;
静态内部类的访问扩展:
静态内部类可以访问外部类的静态成员变量;
静态内部类不可以直接访问外部类的实例成员;
2、成员内部类
什么是成员内部类:没有static修饰,属于外部类对象,会加载一次;
可以定义常量;
成员内部类的访问扩展:
成员内部类可以访问外部类的静态成员变量;
成员内部类不可以直接访问外部类的实例成员;
3、局部内部类
不能定义静态成员,只能定义实例;
可以定义常量;
4、匿名内部类
一个没有名字的局部内部类;目的:简化代码;
new 类(){
}
匿名内部类的对象的类型相当于是当前new的那个的类型的子类类型;
包package
相同包下直接使用;
不同包下先导包,再使用;
Date日期-Simdateformate简单日期格式化
BigDecimal
这是用来解决精度问题,最终还是要回归到double上;
包装类
作用:引用数据类型的默认值是NULL;
泛型
正则表达式
Collection迭代器遍历
foreach遍历循环
数据结构
树->二叉树->二叉查找树/二叉排序树->平衡二叉树->红黑树
LinkedList
双链表,定位前后的元素非常快;
TreeSet
引用类型的排序,需要重写compareTo()方法;
异常
异常类:Throwable
分为Error和Exception异常;
Exception:需要提前处理,以便于程序更加健壮;
编译时异常:编译阶段报错,必须由程序员处理;Exception;
运行时异常:RuntimeException的异常或者是其子类,编译阶段不会出错,运行时阶段可能会出现,代码都能通过;
(1)数组索引越界异常 ArrayIndexOutOFBoundinfsException
(2)空指针异常:NullPointerException
(3)类型转换异常:ClassCastException
(4)迭代器遍历没有此元素异常:
(4)数学操作异常:ArithmeticException;
10 / 0
(5)数字转换异常:NumberFormatException;
异常产生的默认处理过程
方法1:异常一旦出现,会自动创建异常对象,最终抛出给虚拟机,虚拟机只要收到异常,就直接输出异常信息,干掉程序!!!
方法2:在出现异常的地方自己处理,谁出现谁处理;出现异常后代码不会死亡;上层调用者不知道底层的情况;
方法3:在出现异常的地方把异常一层一层的抛出给最外层调用者,最外层集中捕获;
运行时异常处理机制
运行时异常,不需要手动抛出;直接在最外层捕获输出;
finally关键字
无论代码是出现异常还是正常执行,最终一定会执行finally里面的代码;
finally作用:可以在代码执行完毕以后,再进行资源的释放操作;
什么是资源?资源是实现了Closeale接口的,都自带close()关闭方法!!
标签:Java,静态,子类,接口,对象,-----,父类,方法 From: https://www.cnblogs.com/kuangmeng/p/18092394