欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java第5章作业:面向对象(中)面向对象的特征

程序员文章站 2024-03-02 12:05:04
...

本章主要知识结构如下:
面向对象的特征(三点):

  1. 封装
  2. 继承
  3. 多态

第一题:Java的访问控制修饰符有哪些?各有什么访问权限?请对照第7页ppt的表格分别写程序验证。

Java中的访问控制符有public, protected, private以及默认四种。

第7页的表格如下:
Java第5章作业:面向对象(中)面向对象的特征
表格中第一列表示类的属性或方法前面的修饰符,ABCD代表不同级别的类,如下图:
Java第5章作业:面向对象(中)面向对象的特征

从表格中可以看出,类前修饰符有两个,分别是public与缺省。若为缺省,则该类无法被包外的类所访问,仅可以被包中的类访问,若为public则可以被包外的类访问。

下面用一个例子来展示类前修饰符为public时,不同包与相同包内的类的访问情况。

  1. 首先在com.resource包中定义一个SomeVar类,其含有3种修饰符修饰的变量。
    package com.resource;
    
    public class SomeVar {
        public String varPublic = "Public";
        protected String varProtected = "Protected";
        private String varPrivate = "Private";
    }
    
  2. 然后com.resource包中建立SamePack类,
    package com.resource;
    
    public class SamePack {
        public static void main(String[] args){
            SomeVar sv = new SomeVar();
            System.out.println(sv.varPublic); // 无报错
            System.out.println(sv.varProtected); // 无报错
            System.out.println(sv.varPrivate); // The field SomeVar.varPrivate is not visible
        }
    }
    
    这里会在引用varPrivate变量时报错,表明private修饰的变量无法被包内其他的类访问,只能被本类访问。
  3. com.run包内建立RunVar类,
    package com.run;
    import com.resource.SomeVar;
    
    public class RunVar {
        public static void main(String[] args){
            SomeVar sv = new SomeVar();
            System.out.println(sv.varPublic); // 无报错
            System.out.println(sv.varProtected); // The field SomeVar.varProtected is not visible
            System.out.println(sv.varPrivate); // The field SomeVar.varPrivate is not visible
        }
    }
    
    由于RunVar类与SomeVar类不在同一个包内,所以其不能访问SomeVar类的varProtectedvarPrivate属性。

第二题:子类对于从父类继承的哪些属性与方法是可见的?请分别写程序进行验证。

子类继承了父类的所有属性和方法, 但只有public、protected的属性和方法在子类中是可见的,private修饰的属性和方法仅对本类(父类)课件。

下面用一个例子来说明:

class FatherPlane{
    public String namePub = "Public name";
    protected String namePro = "Protected name";
    private String namePri = "Private name";
}

class SonPlane extends FatherPlane{
	public void setName(String name_){
        this.namePri = "new private"; // The field FatherPlane.namePri is not visible
    }
}

public class RunPlane{
    public static void main(String args[]) {
        SonPlane sp = new SonPlane();
        System.out.println(sp.namePub); // 无报错
        System.out.println(sp.namePro); // 无报错
        System.out.println(sp.namePri); // The field FatherPlane.namePri is not visible

    }
}

第三题:什么是组合?有什么作用?请举例说明。

组合的概念:组合就是在一个类里面使用已经定义好的类对象的引用,并通过发消息的形式调用该对象的属性和方法。

组合的作用:组合不会破坏旧类的封装,整体类与局部类之间松耦合,独立性强,非常灵活,也无需担心继承所带来的一系列权限问题。

举例如下:

class Int{
   int value=10;
   void changeValue(int v){
      this.value = v;
   }
}

class NewInt{
   Int a = new Int(); // 在NewInt类中调用Int类的对象引用,则为组合
   void changeValue(int v){
      a.changeValue(v);
      System.out.println("Changing value......"+a.value);

   }
}

第四题:什么是重载?有什么作用?请举例说明。

重载(overload)的概念:指的是同一个类中参数个数和类型不同方法名相同的多个方法,返回类型可以相同也可以不同。。

**重载的作用:**重载可以使得同一个方法处理不同类型的参数并返回不同类型的值,虽然参数不同但这些同名方法所实现的作用是相同的,是实现多态的非常重要的机制。

举例如下:

public class Test {
   public int test(){
       System.out.println("test1");
       return 1;
   }

   public void test(int a){
       System.out.println("test2 "+a);
   }   

   public String test(int a, String s){
       System.out.println("test3 "+a+' '+s);
       return "return test3";
   }   

   public static void main(String[] args){
       Test t = new Test();
       System.out.println(t.test());
       t.test(1);
       System.out.println(t.test(1,"test3"));
   }
}

第五题:什么是覆盖?有什么作用?请举例说明。

**覆盖的概念:**覆盖指的是子类对父类中已经定义好的方法进行了重新定义,方法名、返回值类型和形式参数都不能改变!

**覆盖的作用:**使得子类能够灵活的根据自己的需要修改父类中所定义的方法,而无需修改父类中的实现。

举例如下:

class Father{
   public void echoHello(){
      System.out.println("Hello from Father!");
   }
}

class Son extends Father{
   public void echoHello(){
      System.out.println("Hello from Son!");
   }
}

public class Test{
   public static void main(String[] args){
      Son s = new Son();
      s.echoHello(); // 输出Hello from Son!
   }
}
相关标签: Java课程作业