java学习笔记(5)

第五章 面向对象基础

一、 题目

1. 什么是对象?如何创建对象?

类是面向对象语言中最重用的一种数据类型,类声明的变量称为对象。
创建一个对象包括对对象的声明和为声明的对象分配内存两个步骤
假设我们在函数中写了如下这个简单的语句:
StringBuffer str = new StringBuffer(”Hello world”);
  别看这个语句简单,其实包含了如下三个步骤:
  首先,newStringBuffer(”Helloworld”)在堆里申请了一堆内存,把创建好的StringBuffer对象放进去。
  其次,StringBufferstr声明了一个指针。这个指针本身是存储在栈上的(因为语句写在函数中),可以用来指向某个StringBuffer类型的对象。或者换一种说法,这个指针可以用来保存某个StringBuffer对象的地址。
  最后,当中这个等于号(赋值符号)把两者关联起来,也就是把刚申请的那一堆内存的地址保存成str的值。

2. 什么是构造方法?构造方法有哪些特点?

构造方法是一个类方法中方法名与类名相同的类方法,它的作用是当使用new关键字创建一个对象时,自动调用并对新建对象进行初始化操作。
构造方法的特点:
1) 构造方法与类名相同
2) 构造方法没有返回值,不定义返回类型
3) 构造方法可以重载,针对参数数量和类型定义多个同名构造方法
4) 构造方法可以继承,子类可以继承父类的构造方法
5) 构造方法不能由编程人员显式地直接调用,它是在对象创建时由new 运算符自动调用的
6) 构造方法只用来对类实例进行初始化,目的在于简化初始化操作
7) 每个类都至少有一个构造方法,如果程序员没有为类定义构造方法,系统会自动为该类生成一个默认的构造方法。
在Java中,对象的创建和初始化是统一的——两者缺一不可。

3. 什么是类的封装?如何对成员变量和方法的访问权限的设置达到数据封装的目的?

所谓封装表现在以下几个方面
1) 在类的定义中设置对对象中的成员变量和方法进行访问的权限。
2) 提供一个统一供其它类引用的方法。
3) 其它对象不能直接修改本对象所拥有的属性和方法。
利用访问控制符(public 、protected 、private、默认)分别声明对象变量和方法的四种访问权限

4. 子类能够继承父类的哪些成员变量和方法?

Java只支持单重继承。子类从父类继承了属性与方法,也可以自己构建父类没有的属性和方法。由于访问控制符的限制,子类的继承又分为两种情况:
1) 子类和父类在同一个包中,此时子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且自然也继承了父类中不是private的方法作为自己的方法,集成的成员变量或方法的访问权限保持不变。
2) 子类和父类不在同一个包中,此时子类只能继承父类中的protected、public访问控制符修饰的成员变量和方法。且此时子类不能继承父类的友好变量和友好方法。
对于子类可以从父类继承的成员变量,只要子类中定义的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量。对于已继承的方法,子类可以通过方法重写来隐藏继承的方法。

5. 编制程序,给定圆的半径和高度,计算圆柱体的体积,利用引用对象方法的形式表示。

见xiti5_5.java

package xiti5;
import java.util.Scanner;

class cylinder{//圆柱类
double r=1,height=1,vol;//成员属性
void cylinder() {//构造方法

}
void set_r(double rs){//成员方法
    r=rs;
}
void set_height(double h){
    height=h;
}
double volume(){
    vol=3.14*r*r*height;
    return vol;
}

}
public class xiti5_5 {
//编制程序,给定圆的半径和高度,计算圆柱体的体积,利用引用对象方法的形式表示。
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner scanner = new Scanner(System.in);
    cylinder cyl=new cylinder();//对象的声明与分配内存
    System.out.println("未修改时圆柱的体积为:"+cyl.volume());//调用方法
    cyl.set_r(10);
    cyl.set_height(10); 
    System.out.println("修改后圆柱的体积为:"+cyl.volume());
}
}

这里写图片描述

6. 补充阅读:

《面向对象分析与设计(第3版)》 Grady booch著
8. Design a class named Fan to represent a fan. The class contains:
Three constants named SLOW, MEDIUM, and FAST with values 1, 2, and 3 to
denote the fan speed.
A private int data field named speed that specifies the speed of the fan (default SLOW).
A private boolean data field named on that specifies whether the fan is on (default false).
A private double data field named radius that specifies the radius of the fan (default 5).
A string data field named color that specifies the color of the fan (default blue).
The accessor and mutator methods for all four data fields.
A no-arg constructor that creates a default fan.
A method named toString() that returns a string description for the fan.
If the fan is on, the method returns the fan speed, color, and radius in
one combined string. If the fan is not on, the method returns fan color
and radius along with the string “fan is off” in one combined string.
Implement the class. Write a test program that creates two Fan objects. Assign maximum speed, radius 10, color yellow, and turn it on to the first object. Assign medium speed, radius 5, color blue, and turn it off to the second object.
Display the objects by invoking their toString() method.

二、论述

随着计算机硬件设备功能的大发展,人们对于语言的应用与改进,使得面向对象的语言应运而生,它令人们可以编写出易维护、易扩展和易复用的程序代码,会更加符合人们的思维习惯。Java便是一个纯的面向对象的编程语言。
面向对象程序设计方法是:
对象 = (算法 + 数据结构)
程序 = (对象 + 对象 + … )
算法与数据结构是一个整体,算法离不开数据结构,算法只能适用于特定的数据结构。

1、面向对象语言的四大特征:抽象、封装、继承、多态。

1.1、抽象:从具体的实例中抽取共同的性质形成一般的概念。

1.2、封装:在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。

所谓封装表现在以下几个方面

在类的定义中设置对对象中的成员变量和方法进行访问的权限。
提供一个统一供其它类引用的方法。
其它对象不能直接修改本对象所拥有的属性和方法。

其主要通过访问控制符(public、 protected 、private 、默认)来实现,具体如下表:
这里写图片描述

1.3、继承:子类的对象拥有其父类的全部属性与服务,称作子类对父类的继承。Java为单继承机制。

类之间的继承关系是现实世界中遗传关系的直接模拟,它表示类之间的内在联系以及对属性和操作的共享,即子类可以沿用父类(被继承类)的某些特征。子类也可以具有自己独立的属性和操作。

子类从父类继承有两个主要的方面:
(1)属性的继承。例如,公司是一个父类,一个公司有名称、地址、经理、雇员等,这些都属于结构方面。
(2)方法的继承。一个父类定义了若干操作,如一个公司要有项目开发、利润创造、经理任命、员工录用等操作,子公司也将继承这些行为。

子类的继承又分为两种情况:
1) 子类和父类在同一个包中,此时子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且自然也继承了父类中不是private的方法作为自己的方法,集成的成员变量或方法的访问权限保持不变。
2) 子类和父类不在同一个包中,此时子类只能继承父类中的protected、public访问控制符修饰的成员变量和方法。且此时子类不能继承父类的友好变量和友好方法。
对于子类可以从父类继承的成员变量,只要子类中定义的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量。对于已继承的方法,子类可以通过方法重写来隐藏继承的方法。

特别是构造方法的继承应遵守以下原则
1)子类可以无条件的继承父类不含参数的构造方法
2)如果子类没有构造方法,则它继承父类无参数的构造方法作为自己的构造方法;如果子类有构造方法,那么在创建子类对象时,则将先执行继承下来的父类的构造方法,然后再执行自己的构造方法
3)对于父类中包含有参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来引用,而且必须是子类构造方法中的第一条语句。

1.4、多态:

狭义定义:由于父类和子类可以有同名的方法,在运行时JVM根据方法的参数个数和类型的不同来查找、决定执行哪个版本的方法,称为多态性。
当然,这只是一种类型的多态,即操作的多态,重载(Overload),表现为有多个操作具有相同的名字,但这些操作所接收的消息类型必须不同。还有一种多态性与继承有关,即重写(Overrride),是指同一个操作被不同类型对象调用时可能产生不同的行为。

2、类与对象

类封装了一类对象的状态和方法,是用来定义对象的模板。类声明的变量称为对象。当使用一个类创建一个对象时,也称给出了这个类的一个实例。

2.1、类与对象的概念与创建
类定义的格式:
[ 类修饰符] class    类名
[ extends      父类名 ]
[ implements      接口名 ] {
    构造方法定义(可隐含);
    成员变量定义;
    方法定义;
}
其中构造方法是一个类方法中方法名与类名相同的类方法,它的作用是当使用new关键字创建一个对象时,自动调用并对新建对象进行初始化操作.


创建类对象一般形式:
类名   对象变量 = new  类名(参数1,参数2,…);
   或者
类名  对象变量;
对象变量 = new 类名(参数1,参数2,…);

创建一个对象包括对对象的声明和为声明的对象分配内存两个步骤,

实例变量与类变量的区别在于,类变量(静态变量:static修饰)是与类相关联的数据变量,所有成员共用,其中一个成员改变其值就会影响到其他成员,类似于操作系统中的共享资源。实例变量仅仅是和相应的对象关联的变量,不同对象的实例变量互不相同。另外,前者可以通过类名和对象访问,后者仅能通过对象访问。

变量类型基本有:
static: 静态变量(类变量);相对于实例变量
final: 常量
transient: 暂时性变量,用于对象存档,用于对象的串行化,见对象的串行化一节
volatile: 贡献变量,用于并发线程的共享

◇ 方法声明
方法声明包括方法名、返回类型和外部参数。其中参数的类型可以是简单数据类型,也可以是复合数据类型(又称引用数据类型)。

2.2、参数传值

这个有点晕乎,只晓得方法中参数变量的值是调用者指定值一个副本,方法中改变该值并不影响其原值,必须引入引用来改变原来的值。
对于简单数据类型来说,java实现的是值传递,方法接收参数的值,但不能改变这些参数的值。如果要改变参数的值,则用引用数据类型,因为引用数据类型传递给方法的是数据在内存中的地址,方法中对数据的操作可以改变数据的值。
从大神那摘录的:
1、对象是按引用传递的
2、Java 应用程序有且仅有的一种参数传递机制,即按值传递
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本写的没错

对String类型的疑惑没有解决。
三句话总结一下:
1.对象就是传引用
2.原始类型就是传值
3.String等immutable类型因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待。可以认为是传值。

2.3、对象的组合

我们可以在一个新类的定义中使用其他对象。这就是组合(composition)。组合是在Java中实现程序复(reusibility)的基本手段之一。
类似于函数的嵌套,用某一对象作为自身对象的一个成员,即对象中嵌套一对象作为其成员。
详情见大佬博客:
java对象间的关系(依赖,关联,组合,聚合)

3、关键字

3.1、static

static关键字可以用来声明类变量和类方法(静态方法)。与这两者相对的分别是实例变量和实例方法。
(1)类变量和实例变量:类变量可以通过类名访问,而且类声明的对象共享类变量。
(2)类方法和实例方法:类方法可以通过类名访问,而且类声明的对象共享类方法。见图片的例子:
这里写图片描述

大佬博客直通车:Java关键字final、static、abstract使用总结:
http://blog.csdn.net/u013842976/article/details/51362565
Java修饰符 abstract,static,final 的区别详解:
http://www.jb51.net/article/41430.htm

3.2、this、super

当在一个类中要明确指出使用对象自己的的变量或函数时就应该加上this引用。简而言之,类似于多态的不同参数作为辨别标准,当实例成员变量的名字和局部变量的名字相同时,必须加上this加以区分。this不可出现在类方法中,因为类方法可以通过类名直接调用,这时,可能还没有任何对象产生。
1)当其出现在类的构造方法中时,代表使用该构造方法所创建的对象;
2)当出现在实例方法时,代表正在调用该方法的当前对象。
例如:

class A{
    int x;
    static int y;
    void f(){
        x=100;
        y=200;
    }
}//
其中A类的实例方法f中出现了this,this代表使用f的当前对象。所以,this.x表示当前对象的变量x,当变量调用方法f时,将100赋值给该变量x。

相应的,子类可以隐藏从父类继承的成员变量和方法,如果在子类中想使用被子类隐藏的成员变量或方法,就可以使用关键字super。
1)使用super调用父类的构造方法,super必须是子类构造方法中的头一条语句。
2)使用super操作被隐藏的成员变量和方法,被隐藏的方法分配的入口地址只对super可见。

这里写图片描述

简而言之,this指的是当前对象的引用,super是当前对象里面的父对象的引用。
详情见大佬博客:
http://lavasoft.blog.51cto.com/62575/18886/

http://blog.csdn.net/yu422560654/article/details/7299518

3.3、final

final可以修饰类、成员变量和方法中的局部变量。
1)final类
final类不能被继承,即不能有子类。
2)final方法
用final修饰父类中的一个方法,则该方法不允许子类重写,即不允许子类隐藏可以继承的final方法,常用来终止继承。
3)常量
被final修饰的成员变量或局部变量就是常量。常量在声明时没有默认值,所以在声明常量时必须指定该常量的值,而且不能发生变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李霁明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值