`
u010708662
  • 浏览: 8811 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

菜鸟的学习之路(3) —java 面向对象程序设计的封装、继承和多态

 
阅读更多

Java语言不同于c语言,Java是面向对象的,而c语言是面向过程的,就因为面向对象语言所特有的——封装(Encapsulation)、继承(Inheritence)和多态(Polymorphism)

. 封装

1. 什么是封装?将属性和方法放在一个类中就构成了封装。

如何定义类:

注意:一个java源文件中,可以有多个类,但是只能有一public类,也可以多个类都不是public类。

修饰符 class 类的名字

{

// 类的属性

修饰符 类型 变量名 ;

//类的方法

修饰符 返回类型 方法名称 (参数1,参数2...)

{

// 方法体

}

}

注意:方法的定义不能嵌套 ,也就是在一个方法里不能再加入另一个方法。方法只能定义在类中。方法的返回值类型必须与return后的变量类型一样。

使用void的return可以不使用,也可以使用,但是使用时return后不能有任何值或变量。

方法的参数,不论是原生数据类型还是引用数据类型都是统一的传值。

2.对属性的封装:

把属性进行私有化,提供方法进行属性的控制。

具体实现步骤:

(1).对属性的可见性进行进行访问的限制(修饰符)。

(2).为每个属性创建set和get方法,用于对属性的访问。

修饰符:

(1). public 公共的,最高访问级别,类的public成员所有类的成员都可以访问。

(2).protected 受保护的,类的protected成员只能被该类的成员以及其子类的成员,还可以被同一个包中他 类的成员访问

(3).private 私有的,不对外公开的,类的private成员只能被该类的成员访问,访问的级别最低。

(4).包类型(就是什么都不写) 类的成员什么修饰符都没有,只有类本身的成员和当前包下类的成员可以访问。

访问修饰符 本类 同包其他类 不同包子类 不同包非子类
public 可以 可以 可以 可以
protected 可以 可以 可以 不可以
private 可以 可以 不可以 不可以
包类型 可以 不可以 不可以 不可以

set和get方法例:

private int age ;

publicvoid setAge(int a)

{

age = a;

}

publicint getAge()

{

return age;

}

3.如何生成对象: 使用 new 关键字,还需要构造方法。

构造方法的定义:

(a).构造方法名必须与类名完全相同。

(b).构造方法没有返回值,也不能是void类型。

(c).如果一个类中没有构造方法,那么java编译器会自动为类添加一个无参数无方法体的构造方法(默认构造方法)。

(d).如果在定义一个类时,为该类声明了构造方法,则java编译器不会再为该类添加构造方法。

(e).不能显式的调用构造方法,只能通过new 关键字隐式的调用。意思也就是不想其他方法一样直接调用

new 关键字在生成对象时完成的事情:

(a).为对象开辟内存空间。

(b).调用类的构造方法。

(c).将生成的对象的地址返回,赋给引用类型变量。

格式: 类名 变量名 = new 类名();

例:

public classStudent

{

public static void main(String[] args)

{

Student student = new Student() ;

Student student1 = new Student() ;

}

public voidname()

{

System.out.println("我叫王五");

}

}

4. 方法的调用需要通过对象来调用。

调用方式: 对象变量.方法名(参数);

例: student.name();

5.方法的重载(Overload):

表示多个方法名相同,但方法的参数个数和参数类型不同。

注意:方法的返回值类型对方法重载没有影响。

例子:

public int add(int a){
return a;

}

public double add(int a){

return a;

}

这两个方法构不成重载。

构造方法的重载:只需要看参数的不同就可以。

public class Student

{

private int age ;

private String name ;

public Student(int age){

this.age = age ;

}

public Student(int age ,String name)

{

this(age); //this()可以再这个构造方法中调用另一个构造方法。必须放在开头。

this.name = name ;

}

}

this是指当前对象,而且this关键字必须放在非静态(也就是static)方法里面,有三种用法:
1.使用this关键字引用成员变量
2.使用this关键字在自身构造方法内部引用其它构造方法
3.使用this关键字代表自身类的对象使用this关键字引用成员方法

4.使用this关键字引用成员方法

二.继承:

java是单继承机制,不像c++多继承。也就是一个类只能有一个父类(也叫基类),需要使用extends关键字

从本个例子可以看出: 当生成子类的对象时,java虚拟机会先调用父类的不带参数的构造方法,生成父类的对象,然后调用子类的构造方法,生成子类的对象。意思也就是要想得到子类的对象就必须先有父类的对象。用通俗语言来讲就是没有父亲怎么会有儿子呢!

假如继承很多层的,那会不断地往上去调用父类的构造方法,这样就叫构造方法链。

1 .前面讲解了this的用法,可以调用本类其他的构造方法,而想要去调用父类的其他构造方法则就需要super关键字。

super:表示对父类对象的引用。

使用要求:就像前面那个例子,在输出语句的前面隐式就会有一条super()语句,是默认的带有super(),如果子类使用super()显式的调用父类的某个构造方法,那么执行时就会按照super()的所对应的构造方法去执行,而不会再去调用午餐的构造方法,使用方式与this()的用法一样。而且super()也必须放在所有语句的开头执行。

2.关于继承的三个要点:

(1).父类有的属性和方法,子类也有。(不包括private修饰符)

(2).父类没有的,子类也可以添加。

(3).父类有的,子类可以修改(方法的重写)。

注意 :父类的构造方法不能被继承。方法和属性可以被继承。当父类没有不带参数的构造方法时,就需要用super()来显式的调用构造方法。

3.方法的重写:

是指父类中有的方法,在子类中进行覆写,然后与父类的返回值、方法名称、参数完全一致。这样就构成了方法的重写。

当进行的重写,如果想调用父类的方法,就必须这样调用:super.方法名(); 这个语句就不需要放在第一句了。

4.当一个类没有显式的指定父类,那么这个类就会继承java.lang.Object类(是JDK提供的一个类,是所有类的直接或间接的父类)

三.多态:

1.多态就是:父类型的引用可以指向子类。(通俗来讲就是奔驰是车,奔驰就是子类,而车就是父类)

给大家看一个多态的例子:

从这个例子中可以看出父类的方法,在子类中进行了重写。把一个子类的对象传给了父类的引用,然后调用speak(),调用的是子类的speak()。

当我们把父类中的speak()方法注释掉,在进行编译,就会出现错误,会提示说找不到speak()方法,因为上转型对象只能调用子类从父类那里继承和重写的方法,而不能使用自己新添加的方法。

2.一共有两种强制类型转换:

(1).向上类型转换:就是子类型转换为了父类型。不需要显式类型转换(也就是强制类型转换)。

格式:

父类 名字1 = new 子类();

父类 名字2 = 名字1;

(2).向下类型转换:就是将父类型转换为子类型。需要显式类型转换,即强制类型转换。

格式:

父类 名字1 = new 子类();

子类 名字2 =(子类) 名字1;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics