发新话题

老紫竹JAVA基础培训(3),认识类的访问权限描述符.

我们熟悉一下类的访问权限描述符,public和默认不写的情况。 类没有private类型。
我们先注意一下目录结构,我们建了一个otherpackage子目录,用来存放非同一目录的类


先看我们的主文件
lession3/Lession3.java
package lession3;

// 注意,我们使用了其它package的类,所以需要import进来
// 注意:路径必须为完整的路径
import lession3.otherpackage.PublicClassOtherPackage;

/**
 * 老紫竹JAVA基础培训(3),认识类的访问权限描述符.<br>
 * 原则:<br>
 * public的类,可以被任何类在任何地方访问<br>
 * 默认权限的类(也就是没写任何访问描述符的类)只能在当前package访问,<br>
 * 不能被其它package的类访问。
 * 
 * @author 老紫竹 JAVA世纪网(java2000.net)
 * 
 */
public class Lession3 {

  public static void main(String[] args) {
    // 调用同一package下的public访问权限类
    System.out.println(new PublicClassSamePackage().toString());

    // 调用同一package下的默认访问权限类
    System.out.println(new DefaultClassSamePackage().toString());

    // 调用不同package下的public访问权限类
    System.out.println(new PublicClassOtherPackage().toString());

    // 调用不同package下的默认访问权限类
    // System.out.println(new DefaultClassOtherPackage().toString());
  }
}


同一个目录下面的2个java文件
lession3/PublicClassSamePackage.java
package lession3;

/**
 * 相同package的公开访问权限类。
 * 
 * @author 老紫竹 JAVA世纪网(java2000.net)
 * 
 */
public class PublicClassSamePackage {

  public String toString() {
    return "相同package的公开类";
  }
}



lession3/DefaultClassSamePackage.java
package lession3;

/**
 * 相同package的默认访问权限类。
 * 
 * @author 老紫竹 JAVA世纪网(java2000.net)
 * 
 */
class DefaultClassSamePackage {
  public String toString() {
    return "相同package的默认类";
  }
}



我们的子目录里面的2个不同package的类
lession3/otherpackage/PublicClassOtherPackage.java
package lession3.otherpackage;

/**
 * 其它package的公开访问权限类。
 * 
 * @author 老紫竹 JAVA世纪网(java2000.net)
 * 
 */
public class PublicClassOtherPackage {
  public String toString() {
    return "其它package的公开类";
  }
}


lession3/otherpackage/DefaultClassOtherPackage.java
package lession3.otherpackage;

/**
 * 不同package的默认访问权限类。
 * 
 * @author 老紫竹 JAVA世纪网(java2000.net)
 * 
 */
class DefaultClassOtherPackage {
  public String toString() {
    return " 不同package的默认类";
  }
}


我们先看一下运行结果
相同package的公开类
相同package的默认类
其它package的公开类

下面,我们尝试
1 调用不同package下的默认访问权限类,我们把Lession3.java里面的被注释掉的代码恢复,看看编译错误


2 尝试把前面这个不能访问的类(DefaultClassOtherPackage)改成 public 类,看看编译结果和运行结果

3 尝试把当前package的 PublicClassOtherPackage 的public去掉,看看编译和运行结果

4 尝试在当前package增加其它的类,并在 Lession3里面使用,看看编译和运行结果

5 尝试在otherpackage里面增加其它的类,并在 Lession3里面使用,看看编译和运行结果

6 自己新建一个package,尝试在里增加其它的类,并在 Lession3里面使用(注意import部分必须添加),看看编译和运行结果


总结:
一个类如果想直接访问另一个单独的类,有2种情况
1 和自己在一个package下面,无论其是否为public
2 和自己不在一个package下面,且必须为public

这部分就到这里吧,周末了,我会多写一点。
2008-11-01_062222.gif
2008-11-01_062827.gif
快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP
基本学会,老紫竹大哥,你还能不能讲访问里的protect .private 等,
还有个小问题,
我输入是“java学习者”,“爱好java”
编译结果是:@1fb8ee3 @14318bb
这是什么会事,
天天来,天天学,呵呵
编辑 回复 快速回复 TOP
不好意思,没下一节呀,,现在正在看,呵呵,打扰的
那编译是什么会事呀,呵呵
天天来,天天学,呵呵
编辑 回复 快速回复 TOP
那时因为toString()方法是获取对象信息的方法返回的是对象的信息内容
编辑 回复 快速回复 TOP
那是因为toString()方法是返回对象的相关信息
编辑 回复 快速回复 TOP
访问修饰符的个人理解-private与protected
一:private
private --只有在声明它的类或结构中访问.
例:
public class A
{
private string name="xu";
int age="23"; //默认为private
}
这时就不能在A的外部直接读取name和age的值,只有通过A类中的方法或属性完成。完整示例:
public class A
{
private string name="xu";
int age="23"; //默认为private
public string GetName() //这时的属性或方法就不能再声明为private 或protected了,这样会导致在外部同样不能访问。
{
return name;
}
public int Age
{
get { retunr age;}
}
}
public class B
{
public B()
{
A a1=new A();
//string x=a1.name; 这样就不能访问A的name了
string x=a1.GetName() ; //通过方法来访问。
//int age=a1.age; can not do this;
int age=a1.Age; //通过属性来访问
}
}
二 protected
protected 关键字是一个成员访问修饰符。受保护成员在它的类中可访问并且可由派生类访问。
个人理解为:受保护成员只能在声明它的类中访问(如同private一样)或者通过它的派生类来访问。
如下例:
using System;
class A
{
protected int x = 123;
public int X{get return x;}
}

class B : A
{
static void Main()
{
A a = new A();
B b = new B();

// Error CS1540, because x can only be accessed by
// classes derived from A.
// a.x = 10;
// a.X;----这样就可以读取

// OK, because this class derives from A.
b.x = 10;
}
}
分析:
一:当使用a.x=10时,由于A是基类,因此其下的private x不能外部访问,此时用a.x=10就会报错。
二:为什么用b.x=10就可以呢,这也是外部呀? ^_^:因此,此时,类B是类A的派生类,protected 修饰的如果在派生类中就可以访问。
总结:protected类型的,在外部而非派生类中访问时除非通过方法或属性,否则不可以访问。而在派生类中就可以访问。
private类型的,除非通过方法或属性,否则不可以在外部访问。




3.final修饰符

有时候,你不希望别人坐享其成,通过继承你写的类得到他自己所需要的类,怎么办呢?这个时候你就可以在你的class之前加上final这个修饰府,例如public final class test{……},加上了这个修饰符之后,别人在继承这个类的话就会编译出错,提示他这个类不能构建子类。从这我们可以看出,final修饰符和abstract修饰符是不能同时使用的,因为abstract类可以说是专门用来继承的,而final类则不能用于继承。

那么如果是在方法的前面加上final修饰符有什么作用呢?比如说A类中有个声明为final的方法a(){….},那么B继承A的时候,B就不能覆盖方法a(){….},否则编译出错,提示Cannot override the final method from A。此外,如果一个类声明为final类的话,它里面所有的方法都自动成为final类型的。

自然的,你肯定会问,如果一个域申明为final的时候有什么作用?一个属性声明为final之后,你不能在对它重新进行赋值,否则编译报错,The final field ×× cannot be assigned。另外,请注意,类声明为final的时候,仅仅它的方法自动变为final,而属性则不会。



abstract(抽象)修饰符,可以修饰类和方法

1,abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法。

2,abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,实现部分以";"代替。需要子类继承实现(覆盖)。

注意:有抽象方法的类一定是抽象类。但是抽象类中不一定都是抽象方法,也可以全是具体方法。

abstract修饰符在修饰类时必须放在类名前。

abstract修饰方法就是要求其子类覆盖(实现)这个方法。调用时可以以多态方式调用子类覆盖(实现)后的方法,也就是说抽象方法必须在其子类中实现,除非子类本身也是抽象类。

注意:父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现(覆盖)了,子类才有创建对象的实例的能力,否则子类也必须是抽象类。抽象类中可以有构造方法,是子类在构造子类对象时需要调用的父类(抽象类)的构造方法。
举个简单的例子下面有一个抽象类
abstract class E{
public abstract void show();//public abstract 可以省略
}
然后其它类如果继承它通常为了实现它里面的方法
class F extends E{
void show(){
//写具体实现的代码
}
}
最后再主方法里面定义一个父类引用指向子类对象,就会发生多态现象,比如
E e=new F();
e.show();
实际调用了子类里面的show()方法

Java中的this和super的用法

一.1、super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)

2、this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)

3、super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时)

如:super.变量名

super.成员函数据名(实参)

4、this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

二、应用实例

class Point

{ private int x,y;

public Point(int x,int y)

{

this.x=x; //this它代表当前对象名

this.y=y;

}

public void Draw()

{

}

public Point()

{

this(0,0); //this(参数)调用本类中另一种形成的构造函数

}

}

class Circle extends Point

{

private int radius;

public circle(int x0,int y0, int r )

{

super(x0,y0); //super(参数)调用基类中的某一个构造函数

radius=r;

}

public void Draw()

{

super.Draw(); //super它引用当前对象的直接父类中的成员

drawCircle();

}}

编辑 回复 快速回复 TOP
public类和默认类的相同包和不同包的用法基本掌握。

但是,我想把lession2和lession3学的内容结合一下,为什么不可以呢?
请指教,我是这样做的。
建一个lession33包,里面有Lession33.java和PublicClassSamePackage.java文件。
Lession33.java文件内容如下:
//////////////////////////////////////////////////////////////////////////////////////
package lession33;
public class Lession33
{
public static void main(String[] args)
{
PublicClassSamePackage lession33 = PublicClassSamePackage();
lession33.pcsp();
}
}
//////////////////////////////////////////////////////////////////////////////////////
PublicClassSamePackage.java文件的内容如下:
//////////////////////////////////////////////////////////////////////////////////////
package lession33;
public class PublicClassSamePackage
{
public void pcsp()
{
System.out.println("相同package中的公开类");
}
}
//////////////////////////////////////////////////////////////////////////////////////
我是想在Lession33.java中调用PublicClassSamePackage.java中的pcsp()方法,为什么不可以呢,如何修正才能正确执行呢?
编辑 回复 快速回复 TOP
你的代码是正确的
可以执行
我试过了
package lession33;

public class lession33 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
PublicClassSamePackage pcsp=new PublicClassSamePackage();
pcsp.pcsp();
}

}

package lession33;

public class PublicClassSamePackage {
public void pcsp()
{
System.out.println("相同package中的公开类");
}
}
编辑 回复 快速回复 TOP
类可以有Private类型的呀!内部类就可以!
爱Java,爱生活!
编辑 回复 快速回复 TOP
lession???
应该是lesson吧!
编辑 回复 快速回复 TOP
今天注册的新人!哈哈!终于找到一个这么好的JAVA学习网了!
编辑 回复 快速回复 TOP
一个类如果想直接访问另一个单独的类,有2种情况
1 和自己在一个package下面,无论其是否为public
2 和自己不在一个package下面,且必须为public
尝试的第2步!!!!我这里怎么不行呀 我把不同package下面的默认类
package lession3.otherpackage;

public class DefaultClassOtherPackage {
public String toString() {
return " 不同package的默认类";
}
}

变成public 还是出现
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
DefaultClassOtherPackage cannot be resolved to a type

at lession3.Lession3.main(Lession3.java:30)
上面的问题 不能访问呀!!!
只要肯学,能努力,就行!!!
编辑 回复 快速回复 TOP
谢谢老紫竹,又学习了一课
编辑 回复 快速回复 TOP
发新话题