04--面向对象高级部门随记(下--01)

来源:互联网 发布:知乎 回复评论 编辑:程序博客网 时间:2024/05/21 17:40

程序开发思路---【建议】永远不要去继承一个普通类;
1.抽象类该如何去使用呢?
 子类去分别实现父类的抽象方法,实现不同的功能;
  abstract class Person{
   private String name;
   private int age;
   public Person(String name,int age){
    this.name=name;
    this.age=age;
    }
   
   public void setName(String name){
    this.name=name;
    }
   public void setAge(int age){
    this.age=age;
    }
   public String getName(){
    return this.name;
    }
   public int getAge(){
    return this.age;
    }
    
   public void say(){
    System.out.println(this.getContent());
    }
   //抽象方法
   public abstract String getContent();
   }
   
  //工人
  class Worker extends Person{
   private float salary;
   
   public Worker(String name,int age,float salary){
    super(name,age);
    this.salary=salary;
    }
   public void setSalary(float salary){
    this.salary=salary;
    }
   public float getSalary(){
    return this.salary;
    }
   
   public String getContent(){
    return "工人说:姓名:"+super.getName()+";年龄:"+super.getAge()+";工资:"+this.getSalary();
    }
   }
   
  //学生
  class Student extends Person{
    private float score;
    public Student(String name,int age,float score){
     super(name,age);
     this.score=score;
     }
    public void setScore(float score){
     this.score=score;
     }
    public float getScore(){
     return this.score;
     }
    public String getContent(){
    return "学生说:姓名:"+super.getName()+";年龄:"+super.getAge()+"成绩:"+this.getScore();
    }
   }
   
  public class Demo{
   public static void main(String args[]){
    Person p=null;
   // p=new Worker();
   // p.say();
    p=new Student("张三",20,100);
    p.say();  
    } 
   }
 2.接口的使用:
  将方法名称暴露给用户,通过对象的多态性,由子类为接口对象实例化;
  接口使用的一个很好的例子:
  例子思路:定义一个接口---》定义个接受接口类型参数的类----》定义实现接口的几个类;
   interface USB{
    public void start();
    public void stop();
    }
   class PC{
    public static void plugin(USB u){
     u.start();
     u.stop();
     }
    }
   class MP3 implements USB{
    public void start(){
     System.out.println("MP3开始工作了");
     }
    public void stop(){
     System.out.println("MP3停止工作了");
     }
    }
   class UDisk implements USB{
    public void start(){
     System.out.println("UDisk开始工作了");
     }
    public void stop(){
     System.out.println("UDisk停止工作了");
     }
    }
   public class Demo{
    public static void main(String args[]){
      PC.plugin(new MP3());
      PC.plugin(new UDisk());
     }

    }
  抽象类与接口在使用上如此相似,那该怎选谁呢?
  一般优先选择 接口;

 3.抽象类和接口的相同点和不同点:(注:一个接口可以继承多个接口的,抽象类可以接口,而接口是一种特殊的抽象类)
  相同点:都不能直接实例化,通过多态性,可由其子类实现;
  不同点:
   抽象类:包括一般方法、抽象方法、变量和常量
    可以有构造方法(因为抽象类毕竟有非静态变量和非抽象方法);
    抽象类可以实现多个接口;
    继承时,单继承会有局限性;
   接口:包括常量和抽象方法;
         不能有构造方法;(构造方法的作用是初始化变量的,而接口没有变量)
         接口不能继承抽象类;
         解决了单继承的局限性;
  如果非要把抽象类和接口作进一步的比较,则可以根据一个设计模式进行解释:
  观察一个特点:
   接口中的都是抽象方法,则子类必须全部覆写接口中的全部抽象方法,那么如果
   现在子类不希望全部都覆写呢?该如何去做?
   接口-->抽象类-->子类即如下:
   adapter:适配器设计模式

   接口可以进一步扩展-->工厂设计模式(简单工厂模式)
    看到接口接口----(联想到)-->工厂设计模式

个人见解:关于java程序从编译到执行的整个流程:
 首先有个*.java类型的文件通过javac命令被编译,这时生产*.class文件,次时程序是不占内存的;
 然后通过java命令来执行*.class文件时jvm就开始解释该文件,从main方法进入,一行行的解释,当遇到静态
  方法和静态属性时 为其分配内存空间,如果是非静态的方法和非静态的属性是不分配内存空间的,
  当解释到构造方法时,这时为非静态方法和非静态变量分配内存空间;
 
 内存空间分为:
  栈内存:存放非静态变量和引用类型变量;
  堆内存:存放引用类型的对象;
  代码区:存放方法;
  全局数值区:存放静态变量;
   
   

 

原创粉丝点击