`
lxq_xsyu
  • 浏览: 64924 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

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 基础 第2阶段:面向对象编程-尚硅谷学习笔记(含面试题) 2023年

    Java 基础 第2阶段:面向对象编程——尚硅谷学习笔记(含面试题) 2023年

    java学习笔记

    JAVA 的面向对象编程——课堂笔记,挺经典的。里面打包了pdf和txt两种版本,共33页~

    Java开发详解.zip

    000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2...

    Java OOP Part1.md

    我的博文配套《Java学习笔记第15期——Java 面向对象 Part1》笔记文件 博文地址:https://blog.csdn.net/lbwnbnbnbn/article/details/115967938

    数据结构与算法分析——C语言描述(Weiss著)的学习笔记

    学习建议:算法和数据结构的内容,用最简单的C语言描述会比较清楚,没有必要使用C++和Java的面向对象描述。面向对象编程在这里没啥用处,反而冲淡了学习主题。初学者,先学习Weiss的《数据结构与算法分析 C语言描述...

    c#学习笔记.txt

    看完了前面几段,我的朋友提出了不同的意见:C#不是Java的Clone,它只是长得有些像Java而已,其实面向对象、中间语言什么的也不是什么新玩意儿,非Sun独创,有文为证:华山论剑:C#对Java。另外他对我上一集中说...

    java8集合源码分析-LearningNotes:Java笔记

    、、基本概念、面向对象、基本数据类型与运算、字符串与数组、异常处理、Object 通用方法 数据结构 & 源码分析:ArrayList、Vector、LinkedList、HashMap、ConcurrentHashMap、HashSet、LinkedHashSet and ...

    python核心笔记

    ·加强对Python对象、内存模型和Python面向对象特性的深入理解; ·构建更有效的Web、CGI、互联网、网络和其他客户端/服务器架构应用程序及软件; ·学习如何使用Python中的Tkinter和其他工具来开发自己的GUI应用...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

    拼多多笔试题java-get-designpatterns:Java设计模式示例(24全)详尽笔记与代码示例

    pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...

Global site tag (gtag.js) - Google Analytics