JAVA面向对象基础一

面向过程和面向对象

面向过程的程序设计思想 (procedure -Oriented Programming),简称POP
关注的焦点是过程:过程就是操作数据的步骤。如果某个过程的实现代码重复出
现,那么就可以把这个过程抽取为一个函数。这样就可以大大简化冗余代码,便
于维护。
典型的语言:C语言
代码结构:以 函数 为组织单位。
是一种“执行者思维” ,适合解决简单问题。
分析出解决问题所需要的步骤,然后把步骤一步一步实现。
扩展能力差、后期维护难度较大。
面向对象的程序设计思想 ( Object Oriented Programming),简称OOP
关注的焦点是 :在计算机程序设计过程中,参照现实中事物,将事物的属性特
征、行为特征抽象出来,用类来表示。
典型的语言:Java、C#、C++、Python、Ruby和PHP等
代码结构:以类为组织单位。每种事物都具备自己的 属性和行为/功能
是一种 设计者思维 ,适合解决复杂问题。代码扩展性强、可维护性高。

类和对象

什么是类?
类:具有相同特征的事物的抽象描述,是抽象的、概念上的定义。
什么是对象
对象:实际存在的该类事物的每个个体,是具体的,因而也称为实例。

类的结构

变量:事物属性的描述(名词)
方法:事物的行为(可以做的事情 动词)
构造方法:初始化对象
块:一段没有名称的代码块
内部类: 即在类体中声明的类

发现类的共有属性(成员变量)

public class Car{
// 成员变量定义
String name; // 名称
String color; // 颜色
float price;// 价格
}
声明成员变量的格式为:
[ 访问权限修饰符 ] [ 修饰符 ] type attr_name [=defaultValue] ;
成员变量是定义在类中,方法体之外的变量。
成员变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)。
在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。
成员变量可以被类中方法、构造方法和特定类的语句块访问。
成员变量的作用范围为整个类体

创建并使用对象

对象 :是类的一个实例,是以类为模板在内存中创建的实际存在的实例。
对象的创建和使用
Car bm= new Car();
Car bm :使用Car类作为类型声明一个变量 bm .
new Car() :使用new 创建对象,然后调用Car类的构造方法初始化对象.
= : 将右边创建的对象地址赋给左边的 bm 变量
同一类的每个对象有不同存储空间。
对象是类的一个实例,必然具备该类事物的属性和行为(即方法)。
使用对象名.属性或对象名.方法的方式访问对象成员(包括属性和方法)

构造方法

构造方法名与类名相同,且没有返回值,且不需要使用void修饰

作用: 在构造方法中为创建的对象成员变量初始化赋值

特点: 每个类都有构造方法,如果没有显式地为类定义构造方法,Java将会为该类提供一个默
认无参构造方法,但是只要在一个Java类中定义了一个有参构造方法后,默认的无参构造方法
会失效。
一个类可以有多个构造方法。
例: public class Car{
public Car(){ }
public Car(String name){ // 这个构造方法有一个参数:name }
}
例:创建Car类的对象
Car car1 = new Car();
Car car2 = new Car(“宝马”)

方法的重载

方法的重载是指一个类中具有相同的名字,但参数不同的多个方法。
参数不同(可以有三方面的不同)
数量不同
类型不同
顺序不同
l 调用时,会根据不同的参数表选择对应的方法。
注意:方法重载跟方法的返回值类型没有任何关系

对象与引用

值传递

形参数类型是基本数据类型,方法调用时,实际把它自己的值传给形式参数,是两个不同的存储单元,所以形参值的改变不影响实参的值。

public class Test1 {
    public static void main(String[] args) {
        int a = 20;
        Test1 test1 = new Test1();
        test1.add(a);
        System.out.println("a= "+a);
    }
        public void add(int x){
            x = 65;
            System.out.println("x="+x);
        }
}

引用传递

形参数类型是引用数据类型参数,实际传递的只是地址,实参和形参指向的是同一地址,任何一方改变对象的值,另一方也会改变。

public class Test2 {
    String name;
    public void set(String n){
        name = n;
        System.out.println("name = "+n);
    }
    public static void main(String[] args) {
        Test2 test2 = new Test2();
        test2.name = "小黑";
        test2.set("小黄");
        System.out.println("name = "+test2.name);
​
    }
}

基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象本身 。但是无论是值传递还是引用传递,其本质都是传值,所以也都统称值传递.

this关键字

this在类中表示当前正在表示的对象

this.成员变量名---->显示的访问当前对象的成员变量,常常用来区分同名的成员变量和局部变量

使用this关键字也可以引用成员方法或者构造方法

static关键字

static:被称为静态,可以修饰类中的成员变量,成员方法,代码块,内部类。

静态成员不依赖于类的示例,可以被所有实例共享,只要这个类被加载,静态成员就会被创建

特点:

1、随着类的加载而加载

2、优先于对象存在

3、修饰的成员。被所有对象共享

4、可不创建对象,直接使用类名调用

static属性:静态属性是类的所有对象共享的,可以通过类名.静态变量直接访问,也可以通过对象.静态变量的方式访问(但是更推荐使用类名.静态变量的方式)。

static修饰的方法,称为静态方法,可以直接使用类名调用,静态的方法中只能使用静态的成员变量,因为他们都是随着类的加载而加载,一旦方法中使用了非静态的成员变量,那么此方法不能定义为静态的方法,非静态的方法中可以使用静态的成员变量。

static修饰成员方法,修饰的成员方法称为类方法,可以直接使用类名访问。

静态方法中也不能使用this关键字,也不能使用super。

代码块

在类中声明的一个没有名字的代码块。

代码块分为:实例代码块和静态代码块

实例代码块在每次创建对象时执行

静态代码块在类被加载时会自动执行,运行类中的main方法,访问类中的静态成员变量或者静态成员方法,创建类的对象时会加载类。

public class Demo {
    static String s ="静态";
    {
        System.out.println("实例代码块,创建对象时执行");
    }
    static {
        System.out.println("静态代码块,类加载时执行");
    }
    static {
        System.out.println(s);
    }
    public static void main(String[] args) {
        new Demo();
    }
}

包名命名,目前至少三级

第一级:项目名称 com org edu

第二级:公司名称 baidu sun huawei

第三级:项目名称 oa cms erp

第四级:功能模块 web service dao config

包的作用:

1、按照不同的功能管理类

2、避免类重名

3、控制访问权限,在不同的包中对不同权限的成员进行访问限制

当在一个类中,使用了另一个包中的类,使用前必须使用import关键字导入;使用本包的类以及java.lang包中的类时不需要导入

访问权限修饰符

访问权限修饰符可以修饰类、成员变量、成员方法、内部类

访问权限修饰符四种

public:公共权限;可以修饰类、成员变量、成员方法、内部类,可以在任意地方访问到。

protected:受保护权限;在本类中,同包的其他类中,不同包的子类中可以访问到

什么都不写:默认权限;在本类中,同包的类中可以访问到

private:私有权限;不可以修饰类,只能在本类中访问到。

访问权限修饰符,修饰类、成员变量、成员方法

变量的分类(按数据类型分)

基本类型变量

byte、short、int、long、float、double、char、boolean这8种关键字声明的

引用类型变量

类、数组等持有的是对象的引用地址

按照位置分

成员变量

定义在类中,可以使用权限修饰符修饰

在构造方法中进行自动的初始化赋值

生命周期:非静态的随着对象的创建而创建,随着对象的销毁而销毁;静态的随着类的加载而加载,销毁而销毁

存储位置:非静态在堆中;静态的在方法区中

局部变量

定义在方法中,不可以使用权限修饰符修饰

必须我们自己进行初始化

生命周期:方法调用时创建,运行结束时销毁

存储位置为栈

面向对象特征

面向对象语言的三大特征:封装、继承、多态

封装

一般意义封装,将重复出现的代码抽取为一个函数,称为代码的封装(包装)。

面向对象语言中的封装是将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 。方便加入控制语句,主动权在类自己手中

将构造方法私有化,外界不能随便调用

向外界提供一个使用此对象的方法

继承

继承就是将同一类事物中共性的属性和行为进行抽取,定义在一个类中(基类),其他的类可以继承基类,就可以拥有基类中的功能,实现代码的复用性,以及可以在子类中扩展自己特有的功能而不影响其他类。

比如猫和狗都是动物,就可以抽取一个动物类,让猫和狗继承动物类

只要符合is-a(什么是什么)关系就可以使用继承

继承的语法

优点:

1.提高了代码的复杂性

2:减少了代码的冗余

3.继承的出现,更有利于功能的扩展。

4.继承的出现让类与类之间产生了is-a的关系,为多态的使用提供了前提

*子类 :使用extends(关键字)继承另一个类;

*一个类只能继承一个类,但可以间接的继承类,成为继承的传递性;子类继承父类后,拥有了父类的成员变量和成员方法,但是不能访问父类的私有成员。

*当一个类没有显示的继承,那么这个类默认继承object类。

*object类是java类体系中最大的类。

方法重写:

*当父类中的实现不能满足子类需求时,可以在子类中对父类的方进行重写(覆盖),这样调用时,就会调用子类中重写的方法。

方法重写的要求:

*子类重写的方法的结构必须和父类方法和名字一致,方法名,参数列表,返回值必须一致,访问权限应该大于父类方法权限。

@Override使用说明:

@Override是java中定义的注解标签,用来进行标记(进阶部分细讲) 写在方法上面,表示此方法是从父类重写而来,用来检测是不是满足重写方法的要求。

这个注解就算不写,只要格式满足要求,也是正确的方法覆盖重写。

建议保留:

1.这 样编译器可以帮助我们检查格式,

2.可以让阅读源代码的程序员清晰的知道这 是一个重写的方法

super:在子类中调用父类中的成员。

在Java类中使用super来调用父类中的指定操作:

1.super可用于访问父类中定义的属性

2.super可用于调用父类中定义的成员方法

3.super可用于在子类构造器中调用父类的构造器

注意:

尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员 super的追溯不仅限于直接父类还可以是父类的父类 super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识。

误区: 不要把super误认为是父类对象,在创建子类对象时,不会创建父类对象.只会将父类中的信息加载到子类对象中存储
·如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有空参 的构造器,则编译出错

抽象

抽象方法是一种特殊的方法:

它只有声明,而没有具体的实现. 抽象方法必须用abstract关键字进行修饰。

在一些体系结构的顶端类中,有些功能没必要实现,

抽象类:
*使用abstract修饰的类就是抽象类,一个类中如果包含抽象方法,那么这个类必定是抽象类,反之不一定。
特点:抽象类不能创建对象,其他功能于正常类相同。

程序员都是来继承这些抽象类并 覆盖抽象方法,实现具体功能

多态

·父类引用指向子类对象,从而产生多种形态 :

Animal dog = new Dog(); 
​
Animal cat = new Cat();

同一种事物,在不同时刻表现不同状态;

二者存在直接或者间接的继承关系时,父类引·用指向子类的对象,即形成多态

当编译期类型是父类,

运行期类型是子类时,

被称为父类引用指向子类对象

class Animal{ ……
}
class Cat extends Animal{ ……
}
class Dog extends Animal { ……
}
Animal c = new Cat() //Animal 的引用指向Cat的对象
Animal d = new Dog() //Animal 的引用指向Dog的对象

向上转型

class Animal{
​
     void eat(){ 
             }
}
class Cat extends Animal{
​
      void eat() {
      
System.out.println("狗吃骨头");
     }
}

Animal x=new Cat()

//向上造型,Cat对象提升到Animal对象 x.eat()

//在编译奇迹只能调用父类中定义的方法, 如果子类重写了父类方法,那么运行时调用子类重写的方法

多态性的好处:

提高代码的扩展性

//方法的形式参数类型是父类类型,而传递的实际参数可以是任意子类的对象
method(Animal animal){
animal .eat();
}

用父类型表示任意的子类类型对象,利于程序扩展

多态环境下对成员方法的调用

class Animal{
void show() {
System.out.println(“Anmial");
}
}
class Cat extends Animal{
void show() {
System.out.println(“cat");
}
}……. Animal x = new Cat()
x.show() 

//调用的是子类中的方法; 简单的说:编译看左边,运行看右边

但是,对于静态,编译·运行都看左边

(静态方法不存在重写)

一旦转为父类类型,就不能调用子类中特有的方法了;

可以向下转型

instanceof关键字

final

用于修饰类,方法,参数,和属性 r5(常量)

类:不能被定义为抽象类或是接口,不可被继承

方法:子类里不可以重写

参数:参数值在方法中不可被修改

属性:定义时就必须直接赋值或者在构造方法中进行赋值,

并且后期都不能修改

常量一般建议全部使用大写字母,多个字母之间用下划线联系

接口

从本质上讲,接口是一种特殊的抽象类,这种抽象类中包含抽象方法。

例:

USB接口本身没有实现任何功能

USB接口规定了数据传输的要求

USB接口可以被多种USB设备实现

面向接口编程:

关心实现类有何能力,而不关心实现细节

面向接口的约定而不考虑接口的具体实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值