`
wezly
  • 浏览: 485248 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

关于Java 构造函数和继续特性的回顾

阅读更多

java构造函数

    java类库的设计者们通过提供一种被称为构造函数的特殊方法,来保证每个对象都能得到初始化。Java在对象刚刚创建,用户还来不及得到的时候,自动调用构造函数。这样初始化就有保证了。

   无参数的构造函数(默认的构造函数)用于创建“基本对象”,如果定义的类中没有定义构造函数,那么编译器会自动为你创建一个默认的构造函数。当类中定义了构造函数(不管带不带参数),编译器就不会再自动创建默认的构造函数了。

    当你为同一个类撰写多个构造函数的时候,为避免重复,经常会在一个构造函数里调用另一个构造函数,你可以通过用this关键字来进行这种调用。但是只能调用一次,并且必须放在程序的最前面调用构造函数。

     this关键字只能用于方法内部,它负责返回当前方法所在类的对象的reference

一个子类的构造函数必须调用超类的构造函数,并且作为第一条语句。如果超类有可访问的无参数的构造函数(可以是程序员定义的或系统默认的无参数的构造函数),那么编译器会自动调用这个无参数的构造函数;

如果基类中没有默认的构造函数(也就是无参数的构造函数),或者你要调用的基类构造函数是带参数的,你就必须用super关键字以及合适的参数明确的调用基类的构造函数。

Class Alpha{

Alpha(int n){}

}

class Zeta extends Alpha{

Zeta(){

n=1;//错误,没有Alpha的构造函数被调用

}

private int n;

}

没有无参数的构造函数,所以Zeta的构造函数必须显示的调用Alpha的带参数的构造函数。正确代码为

class Zeta extends Alpha{

Zeta(){

Super(-1); //正确,Alpha的构造函数被调用

n=1; }

private int n; }

 

在创建派生类对象的过程中,基类的构造函数总是先得到调用,这样一级一级的追溯上去,每个基类的构造函数都会被调用。因为构造函数有一个特殊的任务:它要知道对象是不是被正确地创建了。派生类只能访问他自己的成员,它看不到基类的成员(因为它们通常都是private的)。只有基类的构造函数才知道怎样初始化它的成员,同时也只有它才有权限进行初始化。因此“把所有的构造函数都调用一遍”就变得非常重要了,否则对象就没法创建了。这就是为什么编译器会强制每个派生类都要调用基类的构造函数的原因了。如果你不在派生类的构造函数里明确的调用基类的构造函数,那么编译器就会悄悄地调用那个默认的构造函数。如果没有默认构造函数,编译器就会报错。

 

java继承问题

 

 class  Parent

{

    private void test()

    {

       System.out.print("private test");

     }

    public static void main(String[] args)

    {

       Parent p=new Child();

       p.test();

    }

}

class  Child extends Parent

    public void test()

    {

     System.out.print("public test");

    }

 }

输出结果为“private test“。

 private方法对子类隐藏,因此Child类中的test()方法是一个全新的方法。

    如果Parent类中定义的test()方法为非private,那么父类、子类的test方法声明相同,子类的方法重写了父类的方法,重写的结果就是覆盖了父类方法。

    如果如果Parent类中定义的test()方法为非private,并且改写父类、子类中test方法的声明,使其参数类型有所区别,这样子类的方法重载了父类的方法。

 

package com;

public class Cookie {

  public Cookie() {

    System.out.println("Cookie constructor");

  }

  void foo() {

    System.out.println("foo");

  }

}

import com.*;

public class ChocolateChip extends Cookie {

  public ChocolateChip() {

   System.out.println(

     "ChocolateChip constructor");

  }

  public static void main(String[] args) {

    ChocolateChip x = new ChocolateChip();

     x.foo(); // 不能访问foo()方法。

  }

}

继承有一个有趣的特性,就是如果Cookie类里有一个foo()方法,那么所有继承Cookie的类里也都有foo()方法。但是foo()是package权限的,并且也在另一个package里面,因此我们没法用。

将Cookie改为如下代码后,能够访问foo()方法

package com;

public class Cookie {

  public Cookie() {

    System.out.println("Cookie constructor");

  }

protected void foo() {

    System.out.println("foo");

  }

}

继承类除了能访问父类的public成员外,还可以访问父类的protected成员(但是不能访问private成员)。

同一个package里的其它类可以访问这个package的public、protected、package成员。

当你继承一个类时,你也创建了一个新的类,这个新的类不仅包含了已有类的所有成员(尽管private成员已经隐藏起来了,是不能访问的),更重要的是它复制了基类的接口。于是所有能够传给基类的消息也都可以传给派生类。

继承设计方面有一条通用准则:把基类的数据设成private,方法都设成public。

file 1 :

Package p1;

class Alpha{

public Alpha() {}

}

file 2:

package p2;

import p1.*;

class Zeta{

Zeta(){

Alpha a=new Alpha();//错误

}

}

虽然构造函数Alpha有一个公共作用域,但封装它的类只有包作用域。所以,构造函数只有在包p1中可见,封装类Alpha只在包p1中可见。

 

public class Parent {
public int addValue( int a, int b) {
int s;
s = a+b;
return s;
}
}
class Child extends Parent {

public void addValue (){// do something...}

public int addValue( int a ){// do something...}


继承是子类和父类之间的关系,重载是同一类中的同名方法(参数不同)之间的关系。

这个例子,子类继承了父类的 addValue( int a, int b) 方法,就是说子类也有这个方法。

同时子类也声明了两个同名的方法 addValue( int a)和addValue( ),这两个方法则是子类从父类继承来的addValue( int a, int b)方法的重载

当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定

1.如果子类从父类继承时使用的继承限定符是public,那么
(1)父类的public成员成为子类的public成员,允许类以外的代码访问这些成员;
(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;
(3)父类的protected成员成为子类的protected成员,只允许子类成员访问;

2.如果子类从父类继承时使用的继承限定符是private,那么
(1)父类的public成员成为子类的private成员,只允许子类成员访问;
(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;
(3)父类的protected成员成为子类的private成员,只允许子类成员访问;

3.如果子类从父类继承时使用的继承限定符是protected,那么
(1)父类的public成员成为子类的protected成员,只允许子类成员访问;
(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;
(3)父类的public成员成为子类的protected成员,只允许子类成员访问;

分享到:
评论

相关推荐

    【IT十八掌徐培成】Java基础第05天-01.回顾OOP-构造函数.zip

    本教程由知名IT讲师徐培成讲解,聚焦Java基础知识,重点在于第五天的第一课:回顾面向对象编程(OOP)中的构造函数。通过学习这部分内容,开发者能够深入理解构造函数在Java中的作用和使用方式,从而更好地构建和...

    Java API帮助文档中文版1.8版和官方中文1.6版

    这些文档通常包括类、接口、枚举和注解的详细说明,以及它们的方法和构造函数。每个类或接口都有一个概述,描述了其主要用途和行为。此外,每个方法和字段都有详细的注释,解释了其功能、参数、返回值和可能抛出的...

    Java基础练习40题

    这部分可能会要求创建自定义类,理解类的封装、继承和多态性,并使用构造函数、访问修饰符以及方法重写。此外,还可能涉及到集合框架的基础知识,如ArrayList和HashMap的使用。 121-130.rar的题目可能更进阶,涵盖...

    自学考试04747java历年真题

    同时,对于类和对象的理解也至关重要,包括构造函数、对象创建、访问修饰符和成员变量的使用。 异常处理是Java中一个重要的错误处理机制,通过try-catch-finally结构来捕获和处理程序运行时可能出现的问题。历年...

    java_IO.rar

    视频可能涵盖它们的特性、构造函数以及read()和write()方法的使用。 4. **BufferedIO(04_BufferedIO.avi)**:缓冲流(Buffered Stream)提高了IO操作的效率,通过内部缓冲区来减少实际的物理I/O操作。...

    一份Java试题及答案

    2. **类与对象**:Java是面向对象的语言,所以对象的创建、类的构造函数、封装、继承和多态等概念可能会是试题的重点。此外,抽象类、接口和访问修饰符也是考察的常见内容。 3. **异常处理**:Java的异常处理机制是...

    18天java笔记(txt版)

    这份"18天Java笔记"提供了一个快速学习Java的核心内容精华,适合初学者和有一定经验的开发者进行回顾和巩固。txt版的格式使得笔记易于阅读和在不同设备上分享。 Java的基础知识包括语法、数据类型、控制流、类与...

    Java语言实用教程

    - **Java语言的产生**:回顾Java的历史背景和发展历程。 - **Java语言的发展**:讲述Java从最初的版本到现在的演变过程。 - **Java语言的关键特点**:详细介绍Java的面向对象、简单高效、与平台无关等核心特点。 ...

    面向对象Java课件

    2. **类与对象**:讲解如何创建和使用类,对象的实例化,以及构造函数的作用。 3. **封装**:深入探讨访问修饰符,如何封装数据,以及getter和setter方法的使用。 4. **继承**:讲解如何声明和使用继承,super...

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第04章_高级类特性1(共72页).pptx

    本课件主要针对Java基础知识进行讲解,适合初学者自学和有经验的开发者回顾巩固。课程分为14个章节,覆盖了从语言概述到高级特性的全方位内容。 在第4章"高级类特性1"中,我们重点探讨了面向对象编程的一些关键概念...

    java 基础知识总结(经典)

    理解类的定义、属性(成员变量)和方法(成员函数),以及如何通过构造器创建对象。 4. **封装、继承和多态**:封装是隐藏实现细节,提供公共接口;继承允许子类继承父类的属性和方法,多态则实现了不同类之间的...

    JAVA白皮书(英文版)

    - **不再使用函数**:Java中没有纯函数的概念,所有操作都通过对象和方法进行。 - **不再使用多重继承**:只允许单一继承,以简化类层次结构。 - **不再使用goto语句**:去除goto以增强代码的可读性和可维护性。 - *...

    Java语言与面向对象程序设计第10讲(继承与多态)

    面向对象程序设计是Java语言的核心特性之一,它包括三个主要原则:封装、继承和多态。在本讲中,我们将深入探讨其中的继承与多态。 首先,回顾面向对象设计中的基本概念。封装是将数据和操作这些数据的方法捆绑在...

    Java经典复习资料

    深入理解类的构造函数、析构函数,以及如何通过继承和多态来设计可扩展的代码结构至关重要。 3. **异常处理**:Java的异常处理机制是程序健壮性的重要组成部分,涉及try-catch-finally块、throw和throws关键字,...

    2020老杜最新Java零基础视频教程课件

    - 面向对象特性包括类的创建、对象的实例化、方法定义、访问修饰符、构造函数、继承和接口等。 本教程的内容设计既注重理论知识的传授,又强调实践操作的训练,确保学员能够通过实际动手来巩固所学。对于非计算机...

    小贝程序员生活\课件\java\javaclass\twelve lesson.rar

    "小贝程序员生活"可能是讲师或课程系列的名字,而"\java\javaclass"表明内容专注于Java语言的基础和高级特性,特别是关于类的使用。".rar"文件是一种常见的压缩格式,用于将多个文件打包成一个便于传输和存储的文件...

    java思维导图

    2. **面向对象**:类、对象、封装、继承、多态,以及构造函数、访问修饰符的理解。 3. **接口与抽象类**:它们在设计模式中的角色,以及如何使用接口实现多继承。 4. **异常处理**:异常分类、捕获和抛出机制,以及...

    学习JAVA 的笔记

    此外,还将探讨访问修饰符(public, private, protected, default)和构造函数的作用。 **三、集合框架** Java集合框架是管理对象集合的工具,包括List、Set、Queue等接口以及ArrayList、LinkedList、HashSet、...

    Java复习大纲

    - 构造器:理解构造函数的作用和重载构造器的使用。 3. **异常处理** - 异常的分类:检查型异常(checked exceptions)和运行时异常(runtime exceptions)。 - 异常的抛出与捕获:try-catch-finally语句块,...

    Java基础知识复习资料.rar

    - **对象**:是类的实例,通过构造函数创建,可以调用类中定义的方法和访问变量。 - **封装**:是隐藏对象内部实现细节的过程,通过访问修饰符(public、private、protected)来实现。 - **继承**:允许一个类...

Global site tag (gtag.js) - Google Analytics