三天回顾Java——零基础速成实战
第二天 初识Java入门基础(中)
4.面向对象
4.1、面向对象4.2、面向对象编程4.3、三大特性4.4、super & this4.5、面向对象进阶
4.5.1、方法重写(0veriding)4.5.2、重写规则4.5.3、方法重载(Overloading)4.5.4、方法重写与方法重载的区别4.5.5、重载规则4.5.6、instanceof和类型转换4.5.7、Static4.5.8、抽象类(abstract)4.5.9、接口(interface)4.5.10、内部类 5.异常
5.1简单分类5.2、异常处理机制 6.常用API
6.1 、date6.2 、math6.3、BigInteger类6.4、类的克隆技术6.5、 Timer定时器6.6、Calendar6.7、String
6.7.1基本类型与字符串之间的转换 6.8、StringBuilder 7.集合
7.1、HashMap的工作原理7.2、什么是HashMap7.3、HashMap同步?7.4、什么是HashSet7.5HashMap和HashSet的区别7.6、HashMap和Hashtable的区别7.5结论8. lambda表达式 9.GUI编程》》》下一节
第二天 初识Java入门基础(中) 4.面向对象 4.1、面向对象
面向对象思想
对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象来分析整个系统。 4.2、面向对象编程
(Object-Oriented Programming, OOP)本质:以类的方式组织代码,以对象的组织(封装)数据。
对象是类的实例化,类是对象的抽象。类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但并不能代表某一个具体的事物。
动物、植物、手机、电脑…
Person类、Pet类、Cat类等,都是用来描述/定义某一具体的事物应该具备的特点和行为。对象是抽象概念的具体实例,如张三是人的一个具体实例、张三家里的狗旺财就是狗的一个具体实例。
创建与初始化对象使用new关键字创建对象的时候,除了分配内存之外,还会给创建好的对象进行默认的初始化,以及对类中构造器的调用。类中的构造器也被称为构造方法,创建对象时必须要调用。有以下特点:
必须和类的名字相同没有返回类型,也不能写void一个类即使什么都不写,也会存在一个默认的构造方法 4.3、三大特性
封装继承多态 4.4、super & this
super()调用父类的构造方法,必须在构造方法的第一个super必须只能出现在子类的方法或构造方法中**super()和this()**不能同时调用构造方法,因为this也必须写在第一行super与this的区别:super代表父类对象的引用,只能在继承条件下使用;this调用自身对象,没有继承也可以使用。super(); //隐藏代码,默认调用了父类的无参构造,要写只能写第一行 4.5、面向对象进阶 4.5.1、方法重写(0veriding)
在Java中覆盖继承父类的方法就是通过方法的重写来实现的。所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。
4.5.2、重写规则在重写方法时,需要遵循以下的规则:
父类方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。父类的返回类型必须与 被子类重写的方法返回类型相同,否则不能称其为重写而是重载。Java中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限。编写过Java程序的人就知道,父类中的方法并不是在任何情况下都可以重写的,当父类中方法的访问权限修饰符为private时,该方法只能被自己的类访问,
不能被外部的类访问,在子类是不能被重写的。如果定义父类的方法为public,在子类定义为private,程序运行时就会报错。
4.5.3、方法重载(Overloading)
方法重载是让类调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。
方法的重载在实际应用中也会经常用到。不仅是一般的方法,构造方法也可以重载。
因此,每个重载方法的参数的类型或个数必须是不同。
当Java调用一个重载方法是,参数与调用参数匹配的方法被执行。在使用重载要注意以下的几点:
在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。不能通过访问权限、返回类型、抛出的异常进行重载。方法的异常类型和数目不会对重载造成影响。可以有不同的返回类型,只要参数列表不同就可以了。可以有不同的访问修饰符。可以抛出不同的异常。 4.5.4、方法重写与方法重载的区别
见上文描述4.5.2 / 4.5.3
4.5.5、重载规则方法名、参数列表必须相同修饰符范围可以扩大,不能缩小(public>protect>private)抛出的异常 范围可以被缩小,不能扩大被**static(属于类,不属于实例),final(常量方法),private(私有)**修饰的方法不能重写动态编译:类型 4.5.6、instanceof和类型转换
instanceof 引用类型比较,判断一个对象是什么类型
类型转换
父类引用指向子类的对象
4.5.7、Static
静态变量可以直接用类名访问,也称类变量。
静态变量(或方法)对于类,所有对象(实例)所共享。
静态区代码 加载类时一起被初始化,最早执行且只执行一次(第一次new)。
Math->随机数:
4.5.8、抽象类(abstract)
abstract修饰的类就是抽象类,修饰的方法就是抽象方法。
抽象类中可以没有抽象方法,但有抽象方法的类一定要声明为抽象类。
抽象类不能使用new来创建对象,它是用来让子类继承的。
抽象方法只有方法的声明,没有实现,让其子类实现。
子类继承抽象类,必须实现抽象类的所有方法,否则该子类也要声明为抽象类。
abstract 抽象类 类只能单继承(接口可以多继承)
4.5.9、接口(interface)普通类:只有具体实现
抽象类:具体实现和规范(抽象方法)都有
接口:只有规范,没有方法实现,专业的约束!约束与实现分离:面向接口编程~
注意点
接口没有构造方法,不能被实例化实现类必须要重写接口中的方法实现类(implements) 可以实现多个接口 4.5.10、内部类
内部类就是在一个类的内部再定义一个类,比如A类中定义了一个B类,那么B就是A的内部类,而A相对B来说就是外部类
成员内部类:可以操作外部类的私有属性及方法静态内部类:static修饰,不能访问外部类私有属性局部内部类:外部类的方法里定义的类匿名内部类:没有名字初始化类 5.异常
异常英文(Exception),意思是例外,这些例外情况需要我们写程序做出合理的处理,而不至于让程序崩溃。
异常指程序运行中出现的不期而至的各种状况:文件找不到,网络连接错误,非法参数等。
异常发生在程序运行期间,它影响了正常的执行流程。
5.1简单分类检查型异常:最具代表性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如用户要打开一个不存在的文件时引发的异常,这些异常在编译时不能被简单地忽略。运行时异常:是可能被程序员避免的异常,与检查性异常相反,运行时异常可以在编译时忽略。错误Error:错误不是异常,而是脱离程序员控制的问题。错误在代码经常被忽略。例如当栈溢出,一个异常就发生了,它们在编译也检查不到。 5.2、异常处理机制
抛出异常捕获异常异常处理关键字:try、catch、finally、throw、throws 6.常用API 6.1 、date 6.2 、math
int abs = Math.abs(-5); Math.sqrt(1000.0); Math.max(1000,2000); Math.min(1000,2000); Math.round(1000.6f); Math.random();6.3、BigInteger类
6.4 BigDecimal类
6.4、类的克隆技术类要实现克隆,需要做两步:
- 实现Cloneable接口;重写Object的clone方法。
String:字符串,使用一对“”引起来表示
String声明为final的,不可被继承
String实现了Serializable接口:表示字符串是支持序列化的
实现了comparable接口:表示String可以比较大小
String内部定义了final char【】 value用于存储字符串数据
String:代表不可变的字符序列:简称:不可变性。
体现:当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
通过字面量的方式给一个字符串赋值,此时的字符串值声明在字符串常量池中,字符串常量池中是不会存储相同内容的字符串。 6.7.1基本类型与字符串之间的转换 6.8、StringBuilder 7.集合
collection框架有自己的接口和实现,主要分为**Set接口,List接口和Queue接口。**它们有各自的特点,
Set的集合里不允许对象有重复的值List允许有重复,它对集合中的对象进行索引Queue的工作原理是FCFS算法(First Come, First Serve) 7.1、HashMap的工作原理
HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。
当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。
当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。
HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。
HashMap在每个链表节点中储存键值对对象。
7.2、什么是HashMap
HashMap实现了Map接口,Map接口对键值对进行映射。
Map接口有两个基本的实现,HashMap和TreeMap。
TreeMap保存了对象的排列次序,而HashMap则不能。
HashMap允许键和值为null。
Map中不允许重复的键。所以只允许最多一个空键存在
HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。
public Object put(Object Key,Object value)方法用来将元素添加到map中。7.3、HashMap同步?
HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);7.4、什么是HashSet
HashSet实现了Set接口,它不允许集合中有重复的值,
当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法
这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。
如果我们没有重写这两个方法,将会使用这个方法的默认实现。
public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。7.5HashMap和HashSet的区别
| HashMap | HashSet |
|---|---|
| HashMap实现了Map接口 | HashSet实现了Set接口 |
| HashMap储存键值对 | HashSet仅仅存储对象 |
| 使用put()方法将元素放入map中 | 使用add()方法将元素放入set中 |
| HashMap中使用键对象来计算hashcode值 | HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false |
| HashMap比较快,因为是使用唯一的键来获取对象 | HashSet较HashMap来说比较慢 |
HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
7.5结论
Hashtable和HashMap有几个主要的不同:线程安全以及速度。
在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java5或以上的话,请使用**ConcurrentHashMap**吧。
8. lambda表达式定义:任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口
lambda表达式写法
package com.lmr.practice;
public class TestLambda2 {
public static void main(String[] args) {
ILove love = null;
//1.lambda表示简化
love = (int a)->{
System.out.println("LOvee"+ a);
};
//简化1:参数类型
love = (a)->{
System.out.println("LOvee"+ a);
};
//简化2:简化括号
love = a->{
System.out.println("LOvee"+ a);
};
//简化3:简化花括号
love = a-> System.out.println("LOvee"+ a);
love.love(205);
}
}
//函数式接口
interface ILove{
void love(int a);
}
9.GUI编程
感兴趣可以了解,有需求时可以再学习
》》》下一节:第三天 初识Java入门基础(下)



