一、对象(Object):
1、定义:对象简单的来讲就是东西,一切事物都是对象。
2、面向对象:面向对象就是根据客户提出的需求抽象出业务对象,然后对业务的模块进行合理的分层,构建独立的业务模块,之后设计业务逻辑,利用多态,抽象,继承,封装的编程思想,实现业务需求,最后通过整合各模块,达到高类聚,低耦合的效果。
3、对象的创建:
Eg : Book book = new Book(); //对象的创建默认自动初始化
System..out.println(book.name); //输出结果为null
System.out.println(book.id); //输出结果为0
注:在null值上调用属性和方法,会发生空指针异常(NullPointException)
4、构造器的作用:用来描述对象的创建过程。
Eg:月饼实例的创建,月饼和馅构成月饼。
制作(构造器)
月饼模子(类)——————————>> 月饼(对象)
原料(构造参数)
注:a: Java中的构造器(构造方法)声明在类内部。
ü b: 方法名与类名一致的方法叫构造方法
ü c: 构造方法不能声明迒回值类型。
ü d: 构造方法可以包含参数,参数一般是创建对象实例必须依赖的条件(前提条件)
Eg: public class Point{
int x;
int y;
/*构造器*/
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
5、对象的实例化:
第1步 根据类的属性在堆中分 配对象空间,并且自动初 始化实例变量
第2步 根据参数类型调用构造器
第3步 new运算迒回对象的引用地址
6、this关键字
this是对当前对象的引用:
a:可以使用this明确的访问当前对象的属性或者方法,类似于“我”
b: this() 可调用本类的其他构造器, 可以使用构造器的重用简化代码的实现
c: this() 必须写在构造器的第一行!
Eg:this调用本类构造器:
在Point(int x)的构造方法中调用Point(int x, int y);
public class Point{
int x;
int y;
public Point(int x){
this(x, x); //调用本类构造器,根据参数列表匹配
//this.x = x;
//this.y = x;
}
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
注:
ü 方法签名 = 方法名+参数类型列表
ü 方法重载有如下觃则:
a 方法名一样 b 方法参数不一样
ü 重载方法也可以说是,方法名一样, 方法签名不同的方法
二、String类
1、String = char[] + 操作
Eg: String s1 = “西安”;
String s2 = “长安大学”;
String s3 = s1.concat(s2);
System.out.println(s3);
注: char[]就是一串字符,Java中可以作为字符串
ü s1.concat()方法的底层实现原理就是用数组复制完成的 (Arrays.copyOf()和System.arrayCopy())
String字符串
2、String类:数据+相关的操作,即char[ ]+操作
n# char数组只是数据,没有操作
n# 一串字符就是字符串:char[]、String、StringBuilder
n# 字符串的字面量(也叫直接量),都是String类型实例
n “字符串常量”:static final修饰的变量
public static final String TYPE = "car" //TYPE被称为常量,“car”是字面量
n# String内部就是一个char[]
3、String API 有一个实现原则:对象内容永远不变,也就是说String对象永远不变
这样的规定使字符串使用起来和基本类型相同
4、 String字面量相同时,会替换为同一个String对象的引用,常量连接的结果也被优化为一 个字符串
5、 String 的比较,使用equals.
6、 String API(字符串的常用方法)
n 字符串覆盖了equals() hashCode() toString()
n String字符串中的字符是有序号的,从0开始
n 这些方法如果字符串有变化就返回新的String对象, 不变 化就返回原字符串. 如: trim()
n API 方法
u charAt()
u length()
u trim()
u toLowerCase()
u toUpperCase()
u indexOf()
u lastIndexOf()
u endsWith()
u startsWith()
u substring(int start, int end)
u substring(int start)
u toCharArray() 字符串和字符可以相互转换
String str = new String(new char[]{'1','2','3'}); char[] chs = str.toCharArray();
Eg:public static void main(String[] args) {
String str = "My name is Cindy , hello everybody,";
char ch1 = str.charAt(1);
System.out.println(ch1); //y
int ch2 = str.length(); //35
System.out.println(ch2); //35
System.out.println(str.trim()); //My name is Cindy , hello everybody,
System.out.println(str.toLowerCase()); //my name is cindy , hello everybody,
System.out.println(str.toUpperCase()); //MY NAME IS CINDY , HELLO EVERYBODY,
System.out.println(str.lastIndexOf(",")); //34
System.out.println(str.indexOf("i")); //8
System.out.println(str.substring(3, 7)); //name
System.out.println(str.substring(3)); //name is Cindy , hello everybody,
}
三、封装
封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(当然也无从知道),但可以通过该对象对外的提供的接口来访问该对象。
对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。
使用封装有三大好处:
1、良好的封装能够减少耦合。
2、类内部的结构可以自由修改。
3、可以对成员进行更精确的控制。
4、隐藏信息,实现细节。
首先我们先来看两个类:Husband.java、Wife.java
从上面两个实例我们可以看出Husband里面wife引用是没有getter()的,同时wife的age也是没有getter()方法的。至于理由我想各位都懂的,男人嘛深屋藏娇妻嘛,没有那个女人愿意别人知道她的年龄。
所以封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界方法,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。比如我们将一个房子看做是一个对象,里面的漂亮的装饰,如沙发、电视剧、空调、茶桌等等都是该房子的私有属性,但是如果我们没有那些墙遮挡,是不是别人就会一览无余呢?没有一点儿隐私!就是存在那个遮挡的墙,我们既能够有自己的隐私而且我们可以随意的更改里面的摆设而不会影响到其他的。但是如果没有门窗,一个包裹的严严实实的黑盒子,又有什么存在的意义呢?所以通过门窗别人也能够看到里面的风景。所以说门窗就是房子对象留给外界访问的接口。