java 面向对象总结

			#一、概念

##1.1基本概念
1、面向对象:三大特征: 封装、继承、多态
2、对象:客观事物的实体(具体)
3、类:具有相同属性和方法的一组对象的集合(抽象)
##1.2 定义类
1 、定义类
访问修饰符]class 类名{}
访问修饰符有4种:public private protected 默认的
2、属性
对象所拥有的静态特征即属性
3、方法
对象执行操作的行为称为类的方法
方法的返回类型有两种:
1、无返回值:void(),方法体中不必使用"return"关键字,但是可以使用return关键字,退出方法。
2、有返回值:在方法体中一定要使用”return“,否则编译报错,小括号的参数类型和参数名必须对应,多个参数列表用 ”,“分隔开
##1.3创建和使用对象
1.创建对象 :类名 对象名=new 类名();
(1)左边的类名:对象 的数据类型
(2)右边的类名():类的构造方法
面向对象的优点:(1)与人的思维一样;(2)信息隐藏;(3)提高了程序的可重用性,一个类可以创多个对象
对象数组:
方法重载
同一个类中,方法名相同,参数类型或者参数个数不同,与返回值无关,简化类调用方法的代码
成员变量
作用域:直接在类中定义的变量(成员变量),即方法的外部
在整个类中都可用,如果访问权限允许,在类外部都可以使用,有默认初始值(基本数据类型为0,引用类型为null)
局部变量: 定义在方法内部的变量,只是在方法体里面使用时需要赋值,否则编译报错,同一个方法体内不允许有同名的局部变量,不同方法体之间可以有同名的局部变量,
局部变量具有更高的优先级
数据类型
基本数据类型:byte short char int long float double boolean
引用数据类型:String 类 数组 接口
构造方法
创建一个对象时会自动调用该类的构造方法
作用:进行数据的初始化
注意:构造方法无返回值,默认构造方法没有参数 ,方法名与类名相同
构造方法的重载:
this关键字
是对一个对象的默认引用。每个实例方法内部都有一个this引用变量
作用:
(1)用this 调用成员变量,解决同名冲突
(2)this调用成员方法
(3)this调用重载的构造方法,只能在构造方法中使用,且必须是构造方法的第一条语句

注意:this不能调用(类变量和类方法 static修饰),也不能调用局部变量

					****封装****

作用:(1)将类的状态信息隐藏到类内部,不允许外部程序直接访问,通过该类提供的方法来访问(2)事物相对独立性 (3)隐藏类的实现细节(4)松耦合(降低代码之间的关联性,和依赖性)
步骤:
(1)将类的属性私有化(private)
(2)为私有属性添加getter/setter()方法。在setter方法中利用判断语句进行赋值限制
(3)设置必要的读取权限

作用:(1)包也是封装的一种形式 (2)防止命名冲突,不同的包中类才能重名(3)类似于文件夹,将类组合成较小的单元
定义包:
package 包名:在Java源文件的第一条非注释语句,一个源文件只能右一个包
包名全部小写的ASCII字母
使用import导入包
static 关键字(静态)
使用static修饰的属性和方法属于类,不属于对象,可以直接通过类名"."直接调用类的成员
(1)修饰属性
static修饰的属性称为:静态变量或者类变量*
无static修饰的叫实例变量
(2)修饰方法
static修饰的方法叫做静态方法或者类方法
无static修饰的叫实例方法
注意:静态方法中不能直接访问实例变量和实例方法
实例方法中可以直接调用类中定义的静态常量和静态方法

**常量final修饰,**不能改变
eg: static final int PERSON_LIVE=1;

				**继承**

作用:
(1)解决代码冗余
(2)实现代码重用
(3)增加软件的可扩充性
Java中类只支持单继承(extends)
子类可以继承父类的哪些内容:
(1)继承public和protected修饰的属性和方法,无论是否在一个包里面
(2)继承默认访问修饰符修饰的属性和方法,子类和父类必须在一个包里面
子类不能继承父类的哪些内容:
(1)无法继承父类的构造方法
(2)private修饰的属性和方法
(3)不同包的默认访问修饰符
使用继承和重写完善类的结构:
步骤:(1)extends继承(2)super()调用父类成员 (3)重写父类的方法输出子类自身的信息

使用super关键字调用父类成员
注意:super只能用在子类,
不能访问父类的private成员
作用:(1)访问直接父类中被屏蔽的内容(2)提高代码的重用性和灵活性
(3)super可访问父类的构造方法、父类的成员、父类的属性、父类的方法

实例化子类对象时构造方法的执行
一、类的构造方法总执行:
创建该类的对象(实例化)
创建该类的子类的对象(子类的实例化)
子类在实例化时先执行父类的构造方法,后执行自身的构造方法
子类继承父类时构造方法的调用规则如下:
(1)如果子类的构造方法中没有通过super调用父类的有参构造,也没有通过this调用自身的其他构造,则会先调用父类的无参构造
(2)如果子类的构造方法中通过super调用父类的有参构造,则执行相应的父类的构造方法,不执行父类的无参构造方法
(3)如果子类的构造方法中通过this调用自身的其他构造,则遵循以上条
注意:如果存在多级继承,在创建一个子类对象时,一直执行到顶级父类(Object)的无参构造方法

object类所有类的父类
object类常用的方法:
toString()…返回字符串对象
equals()…比较是否为同一个对象
clone()…生成当前对象的一个副本,并返回
hashCode()…返回该对象的哈希代码值
getClass()…获得当前对象所属的类信息,返回class对象

方法重写(Overriding):
重写与被重写的方法要求:
方法名相同 参数列表相同 返回值类型相同或是其子
注意:重写方法不能缩小被重写方法的访问权限

					**多态**

含义:一个特定类型的变量可以引用不同类型的对象,并且能自动调用引用对象的方法,实现不同的操作重写是多态的基础

1、向上转型:子类向父类的转换
Pet pet=new Dog();
将一个父类的引用指向一个子类的对象
调用子类覆盖父类的方法,但是,调用不了子类特有的方法

2、向下转型:父类类型转换为子类类型
Dog dog=(Dog)pet;将一个指向子类对象的父类引用赋给一个子类的引用
实现子类特有的方法
注意*:转换时如果不是真实的子类时会出现异常借助于( instanceof )关键字,该关键字前面的对象类型必须和后面的参数所指定的类右继承关系,不然编译错误*
多态的应用:
1、使用父类作为方法的形参

//主人类
class Host(){
public void letCry(Pet pet){
pet.cry();//调用动物叫的方法
	}
}
//调用代码
public class Test{
public  static void  main(String[]args){
Host host=new Host();
Pet pet;
pet=new Dog();
host.letCry(pet);
}
}

2、使用父类作为方法的返回值

//主人类
class Host{
//赠送动物
public  Pet donatePet(String type){
Pet pet;
if(type==dog){
pet=new Dog();
}
return pet;
}
}
//调用类
public class Test{
public static void main(String[]args){
Host host=new Host();
Pet pet;
pet=host.donatePet("dog");
pet.cry();
}
}

注意:
1、抽象类不能被实例化
2、子类如果不是抽象类,则必须重写抽象父类的全部抽象方法
3、abstract 修饰符不能和 final 修饰符一起使用
4、abstract 修饰抽象方法,没有方法体
5、private 关键字不能用来修饰抽象方法

多态的优点:
可替换性 可扩充性 接口性 灵活性 简化性

				**抽象类和接口**
****被abstract 修饰的类,抽象类里面的抽象方法,没有方法体
抽象类没有具体的实现,但是其子类如果不是抽象类则子类可以实例化。,抽象方法只能在抽象类中****

接口:可看作特殊的抽象类,全部为抽象方法
不能被实例化
注意:1、定义接口interface,访问修饰符只能是public
2、接口成员为全局常量和公共的抽象方法
3、子类通过implements 实现接口

定义和实现接口时:
1、接口和类、抽象类一个层次,命名规则一样
2、修饰符如果是public ,则在整个项目中可见,如果不写,则该接口只能在当前包中可见
3、接口中全部是常量,属性默认用 " public static final "修饰接口中所有属性都是全局静态常量。必须赋初值

//两种定义方式等价,在接口中
public static final int PI=3.14;
int PI=3.14;
4、接口中全是抽象方法,默认public
5、接口不能实例化,不能有构造方法
6、接口之间可以通过extends继承,且一个接口可以继承多个接口,但接口不能被继承,
7、类可以通过implements 实现多个接口,该类必须实现接口的全部方法,不然该类必须定义为抽象类
8、一个类如果既有继承又有实现接口,必须继承在前
//继承在前。实现接口在后
//A类继承B类,实现接口c,d,e
public class A extends B implements c,d,e,{}
					**异常的捕获和处理**

异常处理的步骤:

try-catch
try-catch-finally
使用多重catch 块处理

异常的体系结构:
(1)Error类:程序本身无法恢复,内存溢出、动态链接失败、虚拟机错误
(2)Exception类
(3)运行时异常
(4)Checked异常(非运行时异常)
自定义异常
//常见的异常类
Exception //异常层次结构的根
ArithmeticException//算术错误异常,如除数为零
ArrayIndexOutOfBoundsException//数组下标越界
NullPointerException//空指针(访问的对象成员为null)
ClassCastException//对象强制转换出错
NumberFormatException//数字格式化转换异常,如把abc 转换成数字

异常处理的5大关键字:try catch finally throw throws

try-catch-finally 
try 必须存在。catchfinally 二者至少出项一个
finally表示总被执行,除非System.exit(1),退出虚拟机;不执行
//使用多重catch时,catch的排列顺序必须是子类到父类
try{
Scanner input=new Scanner(System,in)int totalTime=input.nextInt();
}catch(InputMismatchException e1){
System.err.println("必须输入数字")}catch(Exception e2){
System.err.println("发生错误")}

使用throws 声明抛出异常
throws声明某个方法可能抛出的各种异常,异常之间用 ”,“ 隔开

使用throw抛出异常
1、throw用于程序员自行产生并抛出异常,throws 用于声明该方法内抛出了异常
2、throw 位于方法体内部,可以作为单独语句使用;throws 必须在方法参数列表的后面,不能单独使用
3、throw 抛出一个异常对象,只能一个;throws 后面跟异常类。可以多个

			**JAVA高级特性**
一、集合框架和泛型

集合框架在这集合里插入图片描述
接口:
collection :存储一组不唯一、无序的对象
map:键值对(单向映射),键唯一

collection:
List:存储一组不唯一、有序的对象
set:存储一组唯一、无序的对象
List接口
(1)ArrayList: 动态数组, 长度可变 , 内存分配连续空间 存储任何类型的数据,
优点:遍历和随机访问元素的效率高

//ArrayList常用方法
boolean add(Object o);//在列表末尾添加O元素
void add(int index,Object o);//在指定下标位置添加O元素
int size();//元素个数
Object get(int index);//取出该位置下的元素(Object)类型
void set(int index,Object obj);//将该位置的元素替换成obj
boolean contains(Object o);//判断列表是否有O元素
int indexOf(Object obj);//返回该元素在集合中的下标
boolean  remove(Object o);//删除指定元素
Object  remove(int index);//删除对应下标的元素

(2)LinkedList:
存储方式:链表存储方式
优点:插入和删除元素效率比较高

//常用方法
xxxFist();
XXXLast();

set接口
(1)、HashSet–>查找效率高
特点:集合内元素无序 非线程安全 允许集合元素为null

//常用方法
Boolean add();//添加元素
void clear();//清空集合
int size();//集合元素个数
boolean isEmpty();//是否为空
boolean contains();//是否为空
boolean remove();//删除元素

Map接口
存储键值对key–>value 不要求有序,但是唯一

//常用方法
Object put(key,value);//添加键值对
remove(key);//删除key返回对应的value
get(key);//获取key对应的value 如果不存在则返回null
boolean containsKey(key);//是否包含key
boolean containsValue(value);/是否包含value
boolean isEmpty();//是否为空
void clear();//清空
int size();//键值对数
Set key(Set);//获取所有Key的集合
Collection values();//获取所有value 的集合
二、实用类
String类常用的方法
length();//字符串长度
equals();//比较字符串
concat();//连接两个字符串
substring();//提取字符串
indexOf();//索引字符串
split();//拆分字符串
replace()//替换字符串

StringBuffer

//常用方法
toString();//转string
append();//连接字符串
insert();//插入字符串
三、I/O和反射机制
一、反射机制:
//反射在多态中的应用,不用instanceof
package fanshe;

/**
 * 父类:货物类
 */
public  abstract class Goods {
    private  String name;

    public Goods() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    //抽象方法
    public  abstract  void print();
}

package fanshe;
/**
 * 子类
 */
public class Food extends Goods {
    @Override
    public  void print(){
        System.out.println("输出食品名称:"+super.getName());
    }

}
package fanshe;

public class Tv extends  Goods {
    @Override
    public void print() {
        System.out.println("输出TV名称:"+super.getName());
    }
}
package fanshe;

public class Test {
    //生产一个商品:父类作为方法返回值类型(多态)
    //className用户想要获得的商品类型,这里为 Food Tv 类的完整限定名包括包名
   public  Goods getGoods(String className){
       //获取类型对应的Class对象实例
       //通过Class的newInstance()生成相应类型的实例,即用户所需要的对象
       Goods goods=null;
       try {
           //关键代码
           goods=(Goods)Class.forName(className).newInstance();
       } catch (InstantiationException e) {
           e.printStackTrace();
       } catch (IllegalAccessException e) {
           e.printStackTrace();
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       }
       return  goods;
   }
        //测试类
    public static void main(String[] args) {
        Test test=new Test();
        //生成用户需要的子类对象(包名.类名)!!!
        Goods goods=test.getGoods("fanshe.Food");
        goods.print();

        Goods goods2=test.getGoods("fanshe.Tv");
        goods2.print();

    }
}
//输出结果:
输出食品名称:null
输出TV名称:null
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值