您的位置:首页 > 编程语言 > Java开发

Java面向对象

2016-05-29 14:34 253 查看
java 学习:

面向对象:

面向对象的基本概念:

java是面向对象的程序语言,c是面向过程的程序语言,各有特长。

- 面向对象的三个主要特征:

封装性:

对外部不可见,可以保护程序中的某些内容。

继承性:扩展功能。

多态:方法的重载,对象的多态性。

- 类与对象的关系:

面向对象的核心组成部分,就是类与对象。

类是对某一事物的描述,是抽象的,概念上的定义;

对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。

-

- 类的定义:

class定义一个类,

class类名称{
数据类型 属性;
............
public 返回的数据类型 方法名称(参数1,参数2......){
程序语句;
return 表达式;
}
}


类的名称首字母必须大写!

class Person{
//人中有姓名和年龄两个属性
Srting name;   //姓名
int age;        //年龄
public void tell(){
System.out.pringln("姓名:"+name+"年龄:"+age);
}
}


person类图:

第一层表示类的名称,类的名称与之前一样要求开头首字母大写;

第二层表示属性的定义,按照“访问权限 属性名称:属性类型”的格式定义;

第三层表示类中方法的定义,按照“访问权限 方法名称():方法返回值”的格式定义

- 对象的声明及使用:

Person per = new Person();

声明对象:Person per,栈内存中声明的,与数组一样,数组名称就保存在栈内存之中, 只开辟了栈内存的对象是无法使用的,必须有其堆内存的引用才可以使用。

实例化对象:

new Person(),在堆中开辟空间,所有的内容都是默认值。

类属于引用数据类型,从数组中可以知道,引用数据类型必然存在栈内存-堆内存的引用关系,实际上,在类与对象的使用关系上必然存在这种关系。

使用格式:

调用属性:对象.属性

调用方法:对象.方法()


有两种写法:

Person per = new Person();
per.name = "小明";




Person per = null;

per = new Person();

per.name = "小明";


注意:

对象是保存在栈内存之中,属性是保存在堆内存之中;

在程序中所有的方法是保存在全局代码区之中的,此区中的内容是所有对象共享的;

在使用对象的时候,对象必须被实例化之后才可以使用;

实例化对象并不止指的是直接通过new关键字实现的,只要其有堆内存的空间指向,则就表示实例化成功。

如果不实例化—则会出现空指向异常,在引用操作中,如果一个对象没有堆内存的引用,而是调用了类中的属性或方法,就会出现此问题;

所谓的引用数据类型,实际上传递的是堆内存的使用权,可以同时为一个堆内存空间定义多个栈内存的引用操作。

总结

掌握栈与堆内存的关系;

对象保存在栈内存之中,而具体的内容保存在堆内存之中

对象间的引用传递,实际上传递的就是堆内存空间的使用权

垃圾的产生;

- 面向对象的封装性

封装就是保护内容:保证某些属性或方法不被外部看见。

- 封装的实现:

为属性封装:private 属性类型 属性名称

为方法封装:private 方法返回值 方法名称(参数列表){}

- 访问封装的内容:

被封装的属性如果需要被访问,则需要编写setter和getter方法完成;

eg:

private String name;
public void SetterName(String n){  //设置姓名
name = "skye"
}
public void GetterName(){
return name;
}


注意:

如果年龄设置有问题,则不应该为属性赋值;

应在setter方法中加入检验;在getter方法中只是把内容简单的取回;

封装性在java中有很多种形式,private只是最基本的一种形式,也是一种比较常见的形式;

类中的每一个属性都必须封装;

- 构造方法与匿名对象

构造方法的概念及调用时机

什么是构造方法?

只要一有对象产生实例化,就会调用构造方法。

构造方法的定义格式:

class 类名称{
访问权限 类名称(类型1 参数1,类型2 参数2,......){
程序语句;
....//构造方法没有返回值
}
}


构造方法的申明:

构造方法的名称必须与类名称一致;

构造方法的申明处不能有任何返回值类型的申明;

不能在构造方法中使用return返回一个值;

申明对象时,并不去调用构造方法;

每个类中都会有一个构造方法;

java的操作机制中,如果一个类没有明确的声明一个构造方法,则会自动生成一个无参的什么都不做的构造方法,供用户使用。

构造方法的主要目的是为类中的属性进行初始化。

- 构造方法的重载

构造方法与普通方法一样,都是支持重载操作的,只要参数的类型或个数不同,则就可以完成重载操作。

匿名对象的使用

匿名:没有名字,在java中如果一个对象只使用一次,则称为匿名对象;

所谓的匿名对象就是比之前的对象少了一个栈内存的引用关系。

匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。

总结:

构造方法的定义及使用原则:

对象实例化时必须调用构造方法

每个类中都至少有一个构造方法

匿名对象:只开辟了堆内存的实例对象

- 类设计分析:

根据需求写出类所包含的属性;

所有的属性都必须进行封装(private);

封装之后的属性都必须通过setter和getter设置和取得;

如果需要可以加入若干构造方法;

再根据其他要求添加相应的方法;

类中所有的方法都不会直接输出,而是交给北调用处输出。

- String 类:(比较重要)

string有两种比较方式:

- ==用来判断地址空间是否相等,判断的是地址值,比较的地址值;

- 如果判断内容相等与否,则就使用equals()方法来比较;

- String类的两种实例化方式

在String 中可以直接赋值和new 调用构造方法的方式完成,

String name = “skye”;

表示将一个堆内存空间的指向给了栈内存空间;

- String类的两种比较操作

使用直接赋值的方式,只需要一个实例化对象即可,可以有效的节省内存空间,

使用new String()的方式,开辟了两个内存对象,开发中最好使用直接赋值的方式完成。

String的特点:

字符串的内容不可改变;改变的是堆内存地址的指向(内存地址的引用关系);

StringBuffer();

-

- String 的常用方法:

语言的使用文档,,为用户列出了全部的类以及相关的操作及使用方法;

- 字符串与字符数组

一个字符串可以变为一个字符数组,同样,也可以把一个字符数组变为一个字符串。

在String类中提供了以下方法:

1. 将字符串变为字符数组:public char[] toCharArray()

2. 字符数组变为字符串:public String(char[] value) 和

3. public String(char[] value,int offset,int count)

- 从字符串取出指定位置的字符

此方法的返回值一定是一个char类型,public char charAt(int index)

public class StringAPIDemo{
public ststic void main(String args[]){
String str1 = "hello";
System.out.pringln(str1.charAt(3));
}
}


- 字符串与byte数组的转换:

byte数组(字节数组),一般在IO操作中会经常使用到。

字符串变为字节数组:public byte[] getBytes()

将一个字节数组变为字符串:

将全部字节数组变为String:public String(byte[] bytes)

将部分字节数组变为String:public String(byte[] bytes,int offset,int length)

- 取得一个字符串的长度:public int length()

public class StringAPIDemo{
public ststic void main(String args[]){
String str1 = "hello skye";
System.out.pringln("\""+str1+"\"的长度为:”str1.length());
}
}


注意:

在数组中可以使用数组名称.length,而在字符串的操作中一定要记得用():字符串.length();

- 查找指定的字符串是否存在:

从头开始查找:public int indexOf(String str)

从指定位置开始查找:public int indexOf(int ch,int fromIndex)

查找的时候方法的返回值是一个字符串的位置,如果查到的话返回字符串的位置,如果没有查到的话,他将返回-1;

- 去掉空格:

如果信息由用户输入,可能有空格,需要去掉左右两边的空格,但是在字符串之间的空格是不能去掉的

- 字符截取:

从一个指定的字符串中取出里面的部分内容,

使用方法:

从指定位置开始一直截取到结束位置:public String substring(int beginIndex)

截取指定范围的字符串:public String substring(int beginIndex, int endIndex)

- 拆分字符串:

需要按照指定的字符串去拆分一个字符串:public String[] split(String regex)

- 大小写转换:

转化为大写:public String toUpperCase()

转化为小写:public String toLowerCase()

- 判断是否以指定的字符串开头或结尾:

public boolean startsWith(String prefix)测试此字符串是否以指定的后缀开始。

public boolean endsWith(String suffix)测试此字符串是否以指定的后缀结束。

- 不区分大小写的比较:

equals只能对大小写一致的字符串进行比较,

public boolean equalsIgnoreCase(String anotherString)将此 String 与另一个 String 比较,不考虑大小写。如果两个字符串的长度相同,并且其中的相应字符都相等(忽略大小写),则认为这两个字符串是相等。的。

- 引用传递

- this 关键字

表示类中的属性:

使用this调用构造方法:

使用this表示当前对象:

当前对象:当前正在调用方法的对象。

- java集合

作用:存放对象,有时候是容器。

数组:缺陷—类型单一,固定长度,无法更改不能知道数组中对象的真实数量。

集合:可变容量的数组,java.util.collection –接口,表示集合

list 接口 有顺序,可以重复

set 接口 没有顺序,不可重复

map 接口 不是collection的子接口,名值对,一次保存2个对象,前面的对象是KEY,后面的对象为value,根据key来获取value。key 不可重复,value可以重复。

类的关系图:

1.向集合中添加对象

collection c1 = new ArryList();
//


boolean add(E e)–向列表的尾部添加指定的元素(可选操作)。

boolean 表示是否成功加入。

c1.add(“hello”);

c1.add(new Integer(1));

2.将一个集合中所有的对象加入到另一个集合

collection c2 = new ArryList();


3.清除集合中所有的对象

void clear()

4.比较集合中是否包含指定的对象

boolean contains(Object o)

5.比较集合中是否包含另一个集合的所有内容

boolean containsAll(Collection

package com.skye;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
* 用一个集合保存十份学生成绩,输出其中不及格的成绩。*/

public class StudentScore {
public static void main(String[] args) {

Collection score = new ArrayList();
score.add(11);
score.add(79);
score.add(80);
score.add(92);
score.add(87);
score.add(79);
score.add(90);
score.add(59);
score.add(60);
score.add(77);
//迭代器来遍历集合
Iterator it = score.iterator();

while(it.hasNext()){
Integer i = (Integer)it.next();
if(i<60){
System.out.println(i+"");

}

}

}

}


- List

ArryList –使用数组来实现,

特点:

访问元素 快速,改变集合效率低(增加,删除,插入较多)

按照序列进行访问的操作多,改变集合内容的操作少的情况下,选择使用该类

最常使用LIst集合

- LinkedList

特点:

修改集合内容效率高,(增加,删除,插入),资源利用率高

根据序列访问效率比较低;

修改操作频繁,根据序列查询操作少,选择使用该类

- Vector

古老的list,线程安全,效率低,速度慢

public class CollectionDemo{

public ststic void main(String args[]){

//List 集合 (有序可重复)

List list = new LinkedList();

//向List 集合中添加对象,对象的顺序按照添加的顺序
//序列从0开始
list.add("hello");

list.add("world");
list.add("hello");
//2.可以为新添加的对象指定添加的位置
list.add(1,"hehe");

//3.根据对象的序列获取对象
System.out.println(list.get(1));

//4.返回此列表中第一次出现的指定元素的索引
System.out.println(list.IndexOf("hello"));

//5.替换list集合的对象
list.set()1,"haha";
System.out.println(list.get(1));
System.out.println(list.get(2));
//6.返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图
List newList = list.subList(0,3);
System.out.println(newList.size());

Iterator it = list.iterator();
while(it.hasNext()){
Systom.out.println(it.next());
}
}
}


collections类–一个工具类

集合的工具类—工具类:其中的方法都是static静态的方法

使用:

reverse(List list):反转 List 中元素的顺序

sort(List list):根据元素的自然顺序对指定 List 集合元素按升序排序

//按照对象的自然顺序来排列,(也可以自定义顺序)

Collections.sort(list);

it.list.iterator();

while(it)

Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素

void copy(List dest,List src):将src中的内容复制到dest中

练习:

package com.skye1;
/*
* 1.一个饲养员给动物喂食物的例子体现JAVA中的面向对象思想,接口(抽象类)的用处
*/

//1.动物接口  -- interface
interface Animal{
public void eat(Food food);

}
// 第一种动物  -- 狗
class Dog implements Animal{

@Override
public void eat(Food food) {
System.out.println("狗啃"+food.getName());

}

}

// 第二种动物  -- 猫
class Cat implements Animal{

@Override
public void eat(Food food) {
System.out.println("猫吃"+food.getName());

}

}

//2. 食物抽象类  -- abstract
abstract class Food {
protected String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

//第一种食物  -- 鱼
class Fish extends Food{

public Fish(String name) {
super();
this.name = name;

}

}

// 第二种食物  -- 骨头
class Bone extends Food{

public Bone(String name) {
super();
this.name = name;
}

}

//4. 饲养员类 --
class Feeder{

//有一个喂养的方法
public static void feed(Animal animal,Food food){
animal.eat(food);

}

}

//5. 测试类 -- 饲养员给动物喂食物
public class TestFeeder {

public static void main(String[] args) {
Feeder feeder = new Feeder();

Animal animal = new Dog();
Food food = new Bone("骨头"); //给狗喂肉骨头
Feeder.feed(animal,food);

animal = new Cat();
food = new Fish("鱼");
Feeder.feed(animal, food); //给猫喂鱼

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 语言 面向对象