Java面向对象

来源:互联网 发布:wow 1.12数据库 编辑:程序博客网 时间:2024/06/11 14:33

什么是对象?

说到对象先得了解类,类是具有一组相同属性和行为的抽象集合。而对象就是类的实例。

创建类的实例:类名  引用变量名 = new 类名(参数列表);后续要访问类的方法或属性,使用'.'点运算符进行访问。

类的构造方法是对对象创建的同时进行初始化。语法: 访问修饰符  类名(参数){ 初始化代码 };构造方法的特点:1.方法名与类名相同;2.不能被显示调用,只能new的时候自动调用;3.没有返回值;4.可以有多个构造,但参数列表必须不一样;5.当类中没有构造的时候,编译器会自动创建一个空参构造,如果一个类中已经定义一个构造方法,编译器不会自动添加。

面向对象是一种程序设计方法,基本思想是使用对象,类,继承,封装,多态,抽象等基本概念来进行程序设计。从程序设计的角度来看,面象对象的程序设计语言必须有描述对象及其相互之间关系的语言成分:1.系统中一切皆为对象;2.对象可按性质划分为类,对象成为类的实例;3.实例关系和继承关系是对象之间的静态关系;4.消息传递是对象之间的动态联系的唯一形式,也是计算机的唯一形式;5.方法是消息的序列。


一:面向对象的编程语言有封装、继承、抽象、多态4个主要的特征。

1.封装

封装的目标是要实现软件内部的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个模块中,也就是一个类中,属性用变量定义,行为用方法定义,方法可以直接访问同一对象的属性。将对象封装成一个高度自治和相对封闭的个体,对象状态由这个对象自己的行为(方法)来读取和改变。

如下:---银行卡Account有卡号、密码、余额等属性。封装在Account中;

public class Account {

    // 卡号(cardNo)、密码(password)、余额(balance)
    //包含方法:  存钱(save)、取钱(deposit) 抽象
    
    private String cardNo ;
    private String passwd ;
    private int balance ;

}

2.抽象---abstract

抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,避免一些与目标无关的细节。

3.继承--extends——is a的关系

Java中的继承是单一继承,定义类的时候,可以在一个已经存在的类的基础上之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并且可以添加新的属性或方法。1.一个子类只能有一个父类;一个父类可以有多个子类。2.Object是所有类的根,若果类名后没有写extends,则默认继承Object。3.可以继承传递,子类可以获得直接父类或间接父类的方法和属性。

需要注意的是,父类的构造方法不能被继承

构造方法中有super()和this()。构造方法不能被继承,但是可以通过super()隐式调用。在构造方法的第一行代码用super()调用父类的某个构造,不一定是空参,如:

(1).父类的构造

public class Account {  
    private String cardNo ;
    private String passwd ;
    private int balance ;
    
    public Account() {
        super();//调用父类的空参构造,如果父类没有空参,则编译报错。
    }

    public Account(String cardNo, String passwd, int balance) {
        super();//调用父类Object的空参构造
        this.cardNo = cardNo;
        this.passwd = passwd;
        this.balance = balance;
    }

}

(2)子类的构造方法:子类创建空参构造时,父类必须有空参构造,否则编译报错

public class SavingAccount extends Account { // 继承类,构造函数无法继承
    public SavingAccount() {//每一个类最好构造一个自己的构造方法
        super();//空参空体的构造方法也是调用父类的空参构造
    }

    public SavingAccount(String cardNo, String passwd, int balance) {
        super(cardNo, passwd, balance);//调用父类的构造
    }

}

(3)假如构造方法的代码的第一行没有this()或super(),此时编译器会自动添加一个super()调用父类的空参,如果父类没有空参,会编译报错。

当构造一个类的实例时,会递归调用父类的构造,直到Object(先打印间接父类,在轮到直接父类),如:


以上代码在每个构造中都会添加一个隐式的super();调用父类的构造。

(4)abstract

在定义某个方法时,代码是不确定的,就可以将其声明成抽象方法。一个类中只要有抽象方法,必须声明成抽象类。

语法: 访问修饰符  abstract  返回类型  方法名();

如:父类是抽象类,子类必须实现父类的抽象方法。

因为抽象类中有未实现的方法,所以抽象类不能实例化。



一个类中没有任何抽象方法,仍然可以声明成抽象类,目的:防止实例化.

abstract不能与static同用,因为abstract是未能确定的代码,不能直接被子类调用,子类必须实现这个方法;static是静态的可以直接调用的。

abstract不能与private同用,因为abstract需要被子类实现,而private不能被子类看到。

(5)接口--interface——has a的关系

类名  implements  接口名;一个类可以加载多个接口,之间“,”逗号隔开。




接口也可以继承,通过继承获得父接口中定义的方法,支持多个父接口(与类不同,子类只能继承一个父类)。



4.多态

一个类中有两个或两个以上满足如下条件:1.方法名相同2.参数列表不同。并且对方法的访问修饰符和返回类型都没有要求

1)静态多态:同一个方法有不同的行为。重载的多态在编译时已经确定,多以称为静态多态;

实现方式:重载;实现时机:编译时;


2)动态多态

Java中的数据类型


代码



动态多态----重写override

定义:父类和子类中存在两个方法满足如下条件

-1-方法名相同;

-2-参数列表相同;

-3-子类方法的返回类型<=父类:假如返回类型是基本数据类型,要求相同;假如是引用类型,子类的返回类型可以与父类相同,也可以返回父类的返回类型的子类

-4-子类方法的可见性>=父类

-5-子类方法抛出的异常<=父类


3)向上转型

原型  引用变量名 = new 滋生类()------滋生类为原型的子类。通过原型只能访问父类的属性和方法,子类新增的不能访问。父类的引用可以指向子类的实例,子类的引用不能指向父类的实例。


一个类中有多个相同的方法(指的是重写的方法),以及有多个同名属性,调用哪个?

1个类中有多个同名方法(指的是多个重写的方法),调用哪个方法看等于号右边

1个类中有多个同名属性,调用哪个属性看等于号左边(非静态方法)


原型是接口

滋生类为接口的实现类: 通过这个引用只能访问这个接口中定义的方法,其它的属性和方法通过此引用无法访问。








Instanceof 运算符

作用:判断对象的实际类型

语法:对象 instanceof 类名

假如可以用 后面的类名定义一个引用变量指向前面的对象,则返回true,否则返回false

代码:





一个父类有多个子类,判断其实际类型,子类判断在前,父类判断在后:

代码:





0 0
原创粉丝点击