一.面向对象的三大特征:
1.封装性:对外部不可见 可以保护程序中的某些内容
2.继承性:扩展类的功能
3.多态性:方法的重载 对象的多态性
类与对象的关系:
类是某一事物的描述,是抽象的,概念上的定义(模板),对象时实际存在的该类事物
的各一个个体,因而也称实例(instance)
类的定义:
作用域 class 类名称{
数据类型 属性 //声明成员变量
...
作用域 返回值的数据类型 方法名称(参数1,参数2) //定义方法和功 能
程序语句;
return 表达式;
对象的创建与使用:
类名称 对象名称 = null; //声明对象
对象名称 = new 类名称() //实例化对象 用类的构造方法实例化对象
1.类属于引用传递,引用数据类型必然存在栈内存-堆内存的引用关系,实际上
在类与对象的使用上依然存在这样的关系.
Person per = new Person();
.声明对象:Person per,栈内存中声明的,对象名称保存在栈内存中,之开辟
了栈内存的对象时无法使用的,必须有其堆内存的引用才可以使用.
.实例化对象:new Person(),在堆内存中开辟空间,所有的内容都是默认值.
引用数据类型为null,基本数据0
对象是保存在栈内存中的,属性是保存在堆内存中的,方法是保存在全局代码区之中
的,此区中内容是所有对象共享的.
在使用对象的时候,对象必须被实例化之后才可以使用(实例化对象,并不单单
指的是直接通过new关键字实现的,只要其有堆内存的空间指向,则就表示实例化成功)
如果不实例化对象,就没有堆内存的引用指向,调用类中的属性或方法,则会出现NullPointerException空指针异常
所谓的引用数据类型,实际上传递的就是堆内存的使用权,可以同时为一个堆内存
定义多个栈内存的引用操作.(定义多个对象)
(1)Person per1 = new Person(); Person per2 = null;
per2 = per1;//把per1的堆内存空间使用权给per2
per1.name = "cyq"; per1.age = 23;
设置per2对象的内容,实际上就是设置per1对象的内容.
(2)Person per1 = new Person(); Person per2 = new Person();
per2 = per1;
把per1堆内存的使用权给了per2,因为per2本身就有堆内存的空间
指向,所以如果要想再指向per1对应的空间,则必须先断开已有的连接
指向,因为per2改变了指向,所以其原本的内存空间就没有任何栈的引用
,则这样的内存就被称为垃圾,
GC:垃圾收集机制
2.封装性:
目的:
封装就是保护内容,保证某些属性或方法可以不被外部看见修改(eag)
用private封装属性和方法
访问封装的内容:
被封装的属性需要被访问,则需要编写setter和getter方法,由外部
设定和访问属性,如果要加入验证,则在setter方法中加入
封装性在java中有很多种形式,private只是最基本的形式,也是一种比较
常见的形式,类中的每一个属性都必须封装
3.构造方法与匿名类
构造方法:只要已有对象的实例化就会调用构造方法, Person p = new Person()
构造方法是一种特殊的方法,构造方法必须与类名称一致,声明处不能
有任何返回值类型,不能在构造方法中使用return返回一个值
每一个类中肯定会有一个构造方法,如果一个类中没有声明一个
明确的构造方法则会自动生成一个无参的构造方法
目的:构造方法的目的是为类中的属性初始化,构造方法中也可以调用setter
方法设定属性
构造方法在声明对象时不调用,构造方法的重载与普通方法一样,只要参数的类型
或者个数不同.
匿名类: 没有名字,如果准备只是用一次类对象,则可以使用匿名类
new Person().tell();
匿名对象就是比对象少了一个栈内存的引用关系,之开辟了
堆内存的实例对象.
4.类的设计分析
(1)根据要求写出类所包含的属性
(2)所有的属性都必须进行封装(private)
(3)封装之后的属性通过setter和getter方法设置和取得
(4)如果需要可以加入若干构造方法
(5)再根据要求添加相应的方法
(6)类中所有方法都不要直接输出,而是交给被调用处输出
5.String类
实例化String对象方式:
(1)直接赋值:String name = "cyq";
(2)通过new关键字 String name = new String("cyq");
String的比较:
基本数据类型比较通过"=="比较
String有两种比较方式:
"=="在String中比较的是地址值,equals()方法比较的是具体的内容
String两种实例化的比较
一个字符串实际上就是一个String类的匿名对象(从调用equals方法可知)
String name = "cyq"; //直接赋值,只实例化一个对象,节省空间
String name = new String("cyq");//开辟两个内存空间,实例化两个对象
String内容是不可改变的,说的是内存地址的改变
String类的常用方法:
(1)字符串与字符数组
将字符串变为字符数组:public char[] toCharArray()
将字符数组变为字符串:public String(char[] value)
将部分字符数组变为字符串:
public String(char[] value,int offset,int count)
(2)从字符串中去除指定位置的字符
public char charAt(int index) 返回char类型
(3)字符串与byte数组的转换
byte数组(字节数组),一般在IO操作中使用
字符串变为字节数组:public byte[] getBytes()
将一个字节变为字符串:String: public String(byte[] bytes)
将部分字节数组变为String:
public String(byte[] bytes,int offset,int length)
(4)取得一个字符串的长度:
public int length()
(5)查找指定字符串是否存在
从String头开始查找指定字符串: public int indexOf(String str)
从指定的位置开始查找指定的字符串:
public int indexOf(String str,int fromIndex)
返回值都为int类型,如果没有查找到则返回"-1";
(6)去掉空格:
使用trim()方法去掉字符串左右两端的空格,但是字符串中的空格
是不能去掉的.
(7)截取字符串:
从指定位置开始一直截取到结尾位置:
public String substring(int beginIndex)
截取指定范围的字符串:
public String substring(int beginIndex,int endIndex)
(8)拆分字符串:
public String[] split(String regex)
regex表示是按照什么拆分
(9)大小写转化:
小写变大写: public String toUpperCase()
大写变小写: public String toLowerCase()
(10)判断是否以指定的字符串开头或结尾
判断是否以指定的字符串开头: public boolean startsWith(String prefix)
判断是否以指定的字符串结尾: public boolean endsWith(String prefix)
(11)不区分大小写的比较:
在String类中equals()方法比较字符串时时区分大小写的
equalsIgnoreCase()方法是不区分大小写的
(12)字符串的替换功能:
public String replaceAll(String old,String new)