java学习笔记(3)——面向对象
this关键字
this是当前对象的引用,是运行期间当前对象本身。
可以使用this明确的访问当前对象的属性或者方法,类似于“我”
this()可以调用本类的其他构造器,可以使用构造器的重用简化代码的实现
this()必须写在构造器的第一行!
一、java调用方法参照两点:
1,方法签名(方法名+参数列表)
2,就近原则:
比如 f('a',5) ---->f(int ,int)
f(double,int)
3,java参数的传递规则
基本类型:值传递
引用类型:地址传递
二、多态和重载
java使用方法的重载体现了多态的特征
Person是Student的超类
Person stud = new Student();
编译期类型为Student()运行时类型为Person(),这种现象叫动态绑定(也就是多态)
如果父类没有无参构造器,就必须在子类中明确的指定父类的有参构造器。
所以建议每个类都提供无参构造,减少继承时候的麻烦。
-------------------------------------------------------------------package pack01;
public class Persion {
private int age;
private double height;
private double weight;
Persion(int age, double height, double weight){
this.age = age;
this.height = height;
this.weight = weight;
}
}
class Student extends Persion{
private int id;
Student(int age, double height, double weight, int id){
super(age, height, weight);
this.id = id;
}
}
-------------------------------------------------------------------
三、对象实例化过程
1,创建类之前,检查类是否加载,如果没有加载,先加载父类,再加载该类。
加载类:通过CLASSPATH找到.class文件,将硬盘上的.class文件加载到内存中
java采用按需加载:第一次用到就加载,只加载一次。
2,在内存堆中分配对象空间。递归分配所有父类和子类属性空间。
默认自动初始化,初始化"0"值。
3,进行属性的赋值。
4,递归调用父类的构造器。
5,调用本类的构造器。
四、访问控制修饰符
类内
包内
子类
包外
1,public
yes
yes
yes
yes
2,protected
yes
yes
yes
3,default
yes
yes
4,private
yes
五、引用类型的转换
向下转换:小类型---->大类型 (自动转换)
向上转换:大类型---->小类型 (强制转换)
六、静态绑定和动态绑定
多态就是动态绑定
静态绑定就是在Student对象中有2个属性name,系统为了加以区分,会为同名属性加一个标签:将属性标记
为在栈内存中声明的引用变量的类型,调用具体引用变量.属性时,根据标签去找,这种现象称为静态绑定
七、javabeen规范
关于JavaBean规范:JavaBean丌是语法规范,是习惯性编程规范,用这个规范写的类使用方便。
有时候JavaBean的类也称为:POJO 类(Plan Old Java Object)
简化规范:
1) 必须有包(package)
2) Java类,具有无参数构造器
3) 有用getXxx() 和 setXxx() 声明的Bean属性
如:getName() 和 setName(String n) 声明的Bean属性为:name, 不是否有实例变
量name无关
boolean类型的get方法可以有两种形式:getMarried() 戒者 isMarried()
4) 必须实现序列化接口(注:在学习IO的时候具体学习)
JDK提供的类几乎都符合JavaBean规范。如:String类, 集合类
JavaBean最大的好处:“使用方便”
八、static关键字
static关键字修饰:属性,方法,内部类,代码块。
1) static修饰的资源属于类级别,是全体对象实例共享的资源
2) 静态属性
使用static修饰的属性,属于类的全体类的实例共享的变量
静态属性是在类的加载期间初始化的
使用类名.属性访问,如:System.out
3) 实例变量
属于对象的属性
使用对象.属性访问,如:person.name
九、finally关键字
1) final 修饰的类,不能再被继承
Java 的String就是final类,不能被继承!(面试题可能考到)
Math 是final类,不能被继承!
Integer 、Long、Character等包装类是final类,不能被继承!
在实际项目开发中,原则上不允许使用final类!
Spring, Hibernate,Struts 2, 这些框架使用了"劢态继承代理"技术,使用final的类会影
响"动态代理技术" 的实现.
2) final修饰的方法,不能再被覆盖
在实际项目开发中,原则上不允许使用final方法! 原因也是因为: 动态代理技术
3) final 修饰的变量,初始化以后不允许再修改了
final 局部变量
final 方法参数
final 的成员变量
4) final static -- Java使用final static修饰的变量作为常量
一般要求常量名都有大写字母
Java常量丌是const(c、c++中修饰常量的修饰符)
final修饰属性表示“不能改”,static修饰属性表示属于类的“仅此一份”,注意区分
知识点:
final的局部变量,只能初始化不能改
final的方法参数,不能改
final的引用,引用指向丌能改,但是对象的属性可以改
十、抽象类
十一、接口
接口中的属性,默认是常量 public static final
接中的方法一定是public abstract的(默认,可以不写)
十二、Object类
toString() ,hashCode(), equals()
toString()方法,经常由系统默认调用,是活劢当前对象的文本描述
Object默认返回值: 全限定名为@hashCode
建议覆盖为:当前对象的文本描述
十三、equals方法:
用来比较两个对象是否相等的方法
比较对象分为两种:“引用相等”与“对象相等”
equals在Object类中声明,默认的比较规则是:比较引用(地址值)
建议覆盖,实现对象的比较(比较对象的状态,就是比较对象的数据)
覆盖规则:
自反性:对于任何非空引用值x, x.equals(x) 都应返回true.
对称性:对于任何非空引用值x 和 y当且仅当 y.equals(x)返回true时, x.equals(y)
才应返回true.
传递性:对于任何非空引用值 x,y 和 z,如果x.equals(y)返回true,并且y.equals(z)返回
true, 那么x.equals(z)应返回true.
一致性:对任何非空引用值x和y,多次调用x.equals(y)始终返回true或始终返回false.
十四、hashCode()方法
hashCode()方法要与equals方法一同覆盖(sun公司规定)
当两个对象的equals比较为true时,应具有相同的hashCode()值
当两个对象equals比较为false时,应具有不同的hashCode()值
hashCode()值要稳定(一致性),一个对象创建以后就不应该再变化
默认的hashCode()值是当前堆对象地址转换的一个整数,这个整数不是内存地址!
一般使用OID值作为hashCode的值
OID是对象的唯一编号,在项目中一般采用数据库生成OID,也就是数据库中的"主键"
十五、String字符串
字符串就是字符数组
字符串和字符数组可以相互转化
String str = new String(new char[]{'1','2','3'}); //字符数组转化为字符串
char[] chs = str.toCharArray();
//字符串转化为字符数组
-----------------------------------------------------------------------
package pack01;
public class Test {
public static void main(String[]args){
String str1 = "abc";
String str2 = str1;
str1 = str1 + "efg";
System.out.println(str1);
System.out.println(str2);
}
}
该程序的内存分配过程为:
栈
堆
str1 ----------->
"abc"
str2 ----------->
"abc"
"efg" (堆中有"abc"和"efg")
"abcefg" (堆中有"abc"和"efg"和"abcefg")
str1 ----------->
"abcefg" (堆中有"abc"和"efg"和"abcefg")
-----------------------------------------------------------------------
十六、正则表达式
用户名规则 ^\w{8,10}$
【解释】可出现8-10个单词戒字符
电话号码 +86 13912345678
^(\+86|0086)?\s?\d{11}$
【解释】 "+"特殊字符,需要转义"\+"表示"加号" \+86 表示出现"\+86"这几个字符
(\+86|0086)? 表示"+86"戒"0086"出现0-1次 \s? 表示空白(空格)出现0-1次 \d{11} 表示出现11位数字
身份证号码 ^\d{15}(\d{2}[0-9xX])?$
一个点的坐标 ^\d+(,\s*|\s+)\d+$
【解释】 \d+ 表示出现1个及以上的数字
(,\s*|\s+) 表示出现“逗号和0个及以上的空 白”戒“1个以上的空白” \d+ 表示出现1个及以上的数字 ^\d+[,\s]\s*\d+$
答案规则(参考) ^\s*A?(\s+|,\s*)B?(\s+|,\s*)C?(\s+|,\s*)D?\s*$
【解释】 \s* 可出现0-n个空格 A? A可出现0-1次 (\s+|,\s*)
"1个以上空白"戒"逗号,0个及以 上空白" D?\s*
日期 2011-01-30
^\d{4}-\d{2}-\d{2}$ ^\d{4}(-\d{2}){2}$
IP 地址 192.168.0.2
^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$ ^\d{1,3}(\.\d{1,3}){3}$ ^(\d{1,3}\.){3}\d{1,3}$
“.”是特殊字符,需要转义“\.”
十七、String和StringBuffer的区别
String = char[] + 操作(复制创建新对象)
StringBuilder = char[] + 对char[]的操作(处理当前数组内容)
区别StringBuilder内部的数组内容和长度可变。
String内部的数组内容和长度不可变。
----------------------------------------------------
----------------------------------------------------
StringBuilder
1) StringBuilder是变长字符序列
2) StringBuilder方法:append,insert ... 都返回当前 StringBuilder 对象本身的引用
3) 如果软件需要大量字符串处理时候建议使用StringBuilder
4) String s = s1+s2; Java实际上是如下代码运行:
String s=new StringBuilder(s1).append(s2).toString();
5) String s = s1+s2+s3+s4; 被优化为
String s = new StringBuilder(s1).append(s2).append(s3).append(s4).toString();
6) s += "a";会产生两个新对象(StringBuilder, String)(笔试题)
StringBuilder buf=new StringBuilder(); buf.append("a"); buf.append("a");
7) StringBuffer 和 StringBuilder API几乎一样!
StringBuffer 是java早期提供的(JDK1.0),速度稍慢,线程安全 StringBuilder
是Java5 以后提供的(JDK5.0),速度快,非线程安全
所以对大量的字符串拼接使用StringBuilder.
如果对字符串性能有极高的要求,就用char[]
十八、ArrayList(1.2版本以后的)是使用变长数组算法实现的,ArrayList继承自List
1,ArrayList和Vector的比较
Vector,现成安全,效率稍低,也是使用变长数组算法实现的,继承自List接口。
ArrayList,线程不安全的,效率高速度快(现在较常用)
2,ArrayList和LinckedList的比较
LinkedList是采用双向循环链表实现的List
ArrayList是采用变长数组算法实现的List
十九、散列表概念
1,容量
散列表中散列数组大小
2,散列运算
key->散列值(散列数组下标)的算法,如: "mm".hashCode()%10->8
3,散列桶
散列值相同的元素的 "线性集合"
4,加载因子 是散列数组加载率,一般小于75%性能比较理想
就是(元素数量/散列数组大小)如
如: 7/10 = 70%
5,散列查找 根据Key计算散列值,根据散列值(下标)找到
6,散列桶
在散列桶中顺序比较Key,如果一样,就返回value
散列表中Key不同,Value可以重复
二十、HashMap
在ArrayList中查找Mac,顺序查找,需要查找5次
在HashMap中(底层实现原理是散列表)查找Mac,经过散列运算,仅需1次
java学习笔记(3)——面向对象的更多相关文章
- Java学习笔记之---面向对象
Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...
- Java学习笔记之面向对象、static关键字
一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...
- Java 学习笔记(4)——面向对象
现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢 ...
- 【原】Java学习笔记019 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 仔细想一想,Ani ...
- Java学习笔记--关于面向对象的思考
1.不可改变的类生成对象以及变量的范围 2. 关键词this的使用 3.用类抽象的思想制作软件 4.通过关系模型建立类 5.使用面向对象的范例来设计程序,遵循类设计指导. 已经学习了:怎么定义类已经创 ...
- 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器
Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...
- java 学习笔记2 面向对象(上)
类和对象 类是某一批对象的抽象,可以把类理解成某种概念.对象是一个具体存在的实体.类和对象是面向对象的核心. 类定义的是多个实例的特征,类不是具体存在,实例才是具体存在. 定义类(class)的语法: ...
- 【原】Java学习笔记016 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // this 关键字 ...
- 【原】Java学习笔记014 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 面向对象思想 // ...
- Java学习笔记之面向对象
面向对象概念 面向对象编程 &面向过程编程 面向对象:关心是谁来做 面向过程:关心的是怎么做 面向对象总结成一句话:就是分工与协作,干活的是对象 生活中: 对象 -----抽象-------- ...
随机推荐
- LoadRunner error -27979
4.LoadRunner请求无法找到:在录制Web协议脚本回放脚本的过程中,会出现请求无法找到的现象,而导致脚本运行停止.错误现象:Action.c(41): Error -27979: Reques ...
- 在 Asp.NET MVC 中使用 SignalR 实现推送功能
一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请 ...
- spring实例化bean的方式
1.使用类构造器实现实例化(bean的自身构造器) <bean id = "orderService" class="cn.itcast.OrderServiceB ...
- 时间日期Date类型
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- Android 订阅-发布者模式-详解
1.概念简述 Android 简称观察者模式, GoF说道:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”. 有 ...
- mysql执行update报错1175解决方法
mysql执行update报错 update library set status=true where 1=1 Error Code: 1175. You are using safe update ...
- SQLyog Enterprise 8.14
用户名:yunjian注册码:81f43d3dd20872b6 下载地址:SQLyog Enterprise 8.14
- 在JSP中使用CKEditor网页编辑器
为了在我的一个项目使用CKEditor网页编辑器,我开始了寻找应用之法. 我下载了ckeditor_4.3.3_standard和ckeditor-java-core-3.5.3. 之前的版本和现在版 ...
- Hadoop中的辅助类ToolRunner和Configured的用法详解
在开始学习hadoop时,最痛苦的一件事就是难以理解所写程序的执行过程,让我们先来看这个实例,这个测试类ToolRunnerTest继承Configured的基础上实现了Tool接口,下面对其用到的基 ...
- 服务器多块磁盘 ,同时磁盘类型混合(SSD+STAT+SAS)
服务器多块磁盘 ,同时磁盘类型混合(SSD+STAT+SAS)