Java——关于面向对象的理解

 

目录

 

面向对象概述

         

对象的创建

属性和方法                ​

​​​​初始化

方法重载与方法重写

this和super的比较

面向对象的三大特性


面向对象概述

           Java是一种面向对象的高级编程语言,更符合人们的思考习惯,可以将复杂的业务逻辑简单化,增强代码的复用性。面向对象具有抽象、封装、继承、多态等特性。

           类即是一系列对象的抽象,类似于一本菜谱的封面,可以告诉你里边记录的全部都是菜谱,每一个菜谱都类似于一个对象。Java等大多数语言使用class来定义类,用来展现里边的对象的某一部分共性。      

           以下代码可以定义一个类:         

         [修饰符] [static] [final] [abstract] [strictfp] class 类名 [extends 父类名] [implements 接口名] {

                                                [类体;]

            }

            注释:[]代表可以忽略。

            对于以上修饰类的关键字的作用可以点这个链接了解详情。

            当声明了一个类,就可以使用new来创建这个对象。如下代码:

ClassName classname = new ClassName();

对象的创建

           这里只讨论通过new关键字创建的对象

                  在Java中,尽管一切都看作是对象, 但是你操纵的却是一个对象的 引用(reference) 。在这里有一个很形象的比喻: 你可以把车钥匙和车看作是一组对象引用和对象的组合。当你想要开车的时候, 你首先需要拿出车钥匙点击开锁的选项, 停车时, 你需要点 击加锁来锁车。车钥匙相当于就是引用, 车就是对象, 由车钥匙来驱动车的加锁和开锁。并且, 即使没有车 的存在, 车钥匙也是一个独立存在的实体, 也就是说, 你有一个对象引用, 但你不一定需要一个对象与之 关联, 也就是
                                           Car CarKey;
                  这里创建的只是引用, 而并非对象, 但是如果你想要使用这个引用时, 会返回一个异常, 告诉你需要一个对象来和这个引用进行行关联。一种安全的做法是, 在创建对象引用时同时把一个对象赋给它。
                        Car CarKey = new Car();
                   在 Java 中, 一旦创建了一个引用, 就希望它能与一个新的对象进行关联, 通常使用 new 操作符来实 现这一目的。

属性和方法

           属性和方法是类最基本的要素。

           类的属性也称为字段、域或成员变量,不过习惯上将它称为属性。类的属性是变量。如男人这个类中有年龄这个属性,年龄即是变量

            定义属性的语法如下:

                   [修饰符] 属性类型 属性名 [=默认值];

                   如:   private int age [= 30];

             修饰符可省略(省略,即为默认default),也可是访问控制符public、protected、private及static、final。其中三个访问控制符public、protected和private只能使用其中之一, static和final则可组合起来修饰属性。

             属性类型可以是Java允许的任何数据类型,包括基本类型(int、float等)和引用类型(类、数组、接口等)。

             类方法又称静态方法,是使用static修饰的类中方法。实质就是函数,表示做某些事情的方式。

             与之相对应有实例方法,即没有用static修饰的方法。

             方法的基本组成有方法名称、参数、返回值和方法体。​​​​​

             静态方法和实例方法的区别主要体现在两个方面:

             在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
             静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

                  

             构造方法是Java中一种很特殊的方法(与类同名),也称作构造函数,在 Java 中, 通过 提供这个构造器, 来确保每个对象都被初始化。构造方法只 能在对象的创建时期调用一次, 保证了对象初 始化的进行。构造方法比较特殊, 它没有参数类型和返回值, 它的名称要和类名保持一 致, 并且构造方法可 以有多个, 下面是一个构造方法的示例

class Apple { 
int sum;
String color;

public Apple(){}
public Apple(int sum){}
public Apple(String color){}
public Apple(int sum ,String color){}
}

             上面定义了一个 Apple 类, 这个 Apple 类没有参数类型和返回值, 并且有多个以 Apple 同名 的方法, 而且各个 Apple 的参数列                                       表都不一样, 这其实是一种多态的体现。定义完成构造方法以后,就能创建Apple对象了。

class createApple{
    public static void main(String[] args) {
        Apple apple1 = new Apple();
        Apple apple2 = new Apple(1);
        Apple apple3 = new Apple("red"); 
        Apple apple4 = new Apple(2,"color");
    }
}

             上述代码中不加参数的即为默认构造方法,如果类中没有任何构造方法,则JVM会自动生成一个构造方法。
             通过上述的探讨,总结一下定义类的相关语法:

class 类名称
{
	// 定义属性
	数据类型 属性;      //零到多个属性
	// 定义构造函数
	类名称(参数,…)   //零个到多个构造方法
	{
	}
	// 定义方法
	返回值的数据类型 方法名称(参数1,参数2…) //零到多个方法
	{
    	程序语句 ;
   	 	return 表达式 ;
	}
}

               类中各个成员之间,定义的先后顺序没有任何影响各成员可相互调用static修饰的成员不能访问没有static修饰的成员

              定义一个类后,就可以创建类的实例了,创建类实例通过new关键字完成。如下:

public class Static {
	private int i;	// 属性
	public Static() {}	// 构造方法
	public void f() {	//普通方法
		i++;
	}
	public static void main(String[] args) {
		Static s = new Static();	// 生成Static类的实例s
		System.out.println(s.i);
		s.f();	// 调用f()方法,i++
		System.out.println(s.i);
	}
}

 ​​​​初始化

              初始化包含类的初始化、成员(属性)初始化、构造器初始化、数组初始化等。

              当使用new关键字创建一个对象时,其实是调用了这个对象无参数的构造方法进行的初始化。

              成员的初始化:Java会尽量保证每个变量在使用前都被初始化,有两种初始化,一种是基本数据类型的初始化,和其他对象类型的初始化,String也是一种对象,对象的初始值都是null,也包括基本类型的包装类。另一种是指定数值的初始化。

              构造器初始化:通过一些构造方法进行初始化,不建议使用。

              数组初始化:数组是相同类型的、用同一个标识符名称封装到一起的一个对象或者基本数据类型序列。通过[]定义使用。

              初始化顺序:静态属性初始化,静态方法块初始化,普通属性初始化,普通方法块初始化,构造函数初始化

方法重载与方法重写

                         

                        具体区别可以进入链接查看 

this和super的比较

               this和super都是Java中的关键字, this 表示的当前对象, this 可以调用方法、调用属性和指向对象本身。如果你把 this 理解为指向自身的一个引用, 那么 super 就是指向父类的一个引用。因为两个关键字在构造函数中都需要放在第一行,所以同一个类中super()和this ()不能共存,否则编译时会报异常。

                        

                用类名定义一个变量的时候,定义的应该只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法,那们类里面是否也应该有一个引用来访问自己的属性和方法纳?JAVA提供了一个很好的东西,就是 this 对象,它可以在类里面来引用这个类的属性和方法。

面向对象的三大特性

               三大特性即封装、继承和多态

               封装又称控制访问权限。java中成员的访问权限有四种。如下表

              继承是所有 语言和 Java 语言都不可或缺的一部分。只要创建了一个类, 就隐式的继承自父类, 只不过没有指定。如果你显                                           示指定了父类, 那么你 继承于父类, 而父类继承于 Object 类。

        

             多态指的是同一个行为具有多个不同表现形式。是指一个类实例 (对象) 的相同方法在不同情形下具有不 同表现形式。封装和继                                    承是多态的基础, 也就是说, 多态只是一种表现形式而已。

             多态的实现具有三种充要条件:继承、重写父类方法、父类引用指向子类对象。

                                   

               比如你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒。你一喝,这是剑南春、再喝这是五粮液、再喝这是酒鬼酒….在这里我们可以描述成如下  酒 a = 剑南春    酒 b = 五粮液   酒 c = 酒鬼酒

                这里所表现的的就是多态。剑南春、五粮液、酒鬼酒都是酒的子类,我们只是通过酒这一个父类就能够引用不同的子类,这就是多态——我们只有在运行的时候才会知道引用变量所指向的具体实例对象。

                诚然,要理解多态我们就必须要明白什么是“向上转型”:在上面的喝酒例子中,酒(Wine)是父类,剑南春(JNC)、五粮液                                         (WLY)、酒鬼酒(JGJ)是子类。我们定义如下代码:

                               JNC a = new  JNC();

                 这个代码是实例化了一个剑南春的对象,在进行如下的改造:

                                 Wine a = new JNC();

                 在这里可以这样理解,这里定义了一个Wine 类型的a,它指向JNC对象实例。由于JNC是继承与Wine,所以JNC可以自动向上转型为Wine,所以a是可以指向JNC实例对象的。这样做存在一个非常大的好处,在继承中我们知道子类是父类的扩展,它可以提供比父类更加强大的功能,如果我们定义一个指向子类的父类引用类型,那么它除了能够引用父类的共性外,还可以使用子类强大的功能。但是向上转型存在一些缺憾,那就是它必定会导致一些方法和属性的丢失,而导致我们不能够获取它们。所以父类类型的引用可以调用父类中定义的所有属性和方法,对于只存在与子类中的方法和属性它就望尘莫及了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值