当前位置: 首页 > news >正文

java面向对象解释

继承

public class Animal { 
    private String name;  
    private int id; 
    public Animal(String myName, int myid) { 
        name = myName; 
        id = myid;
    } 
    public void eat(){ 
        System.out.println(name+"正在吃"); 
    }
    public void sleep(){
        System.out.println(name+"正在睡");
    }
    public void introduction() { 
        System.out.println("大家好!我是"         + id + "号" + name + "."); 
    } 
}


//子类
public class Penguin extends Animal { 
    public Penguin(String myName, int myid) { 
        super(myName, myid); 
    } 
}

public class Mouse extends Animal { 
    public Mouse(String myName, int myid) { 
        super(myName, myid); 
    } 
}

重写

class Animal{
   public void move(){
      System.out.println("动物可以移动");
   }
}
 
class Dog extends Animal{
   public void move(){
      System.out.println("狗可以跑和走");
   }
   public void bark(){
      System.out.println("狗可以吠叫");
   }
}
 
public class TestDog{
   public static void main(String args[]){
      Animal a = new Animal(); // Animal 对象
      Animal b = new Dog(); // Dog 对象
 
      a.move();// 执行 Animal 类的方法
      b.move();//执行 Dog 类的方法
      b.bark();
   }
}

重载

public class Overloading {
    public int test(){
        System.out.println("test1");
        return 1;
    }
 
    public void test(int a){
        System.out.println("test2");
    }   
 
    //以下两个参数类型顺序不同
    public String test(int a,String s){
        System.out.println("test3");
        return "returntest3";
    }   
 
    public String test(String s,int a){
        System.out.println("test4");
        return "returntest4";
    }   
 
    public static void main(String[] args){
        Overloading o = new Overloading();
        System.out.println(o.test());
        o.test(1);
        System.out.println(o.test(1,"test3"));
        System.out.println(o.test("test4",1));
    }
}

多态

在这里插入图片描述
一、要有继承; 二、要有重写; 三、父类引用指向子类对象

public class Test {
    public static void main(String[] args) {
      show(new Cat());  // 以 Cat 对象调用 show 方法
      show(new Dog());  // 以 Dog 对象调用 show 方法
                
      Animal a = new Cat();  // 向上转型  
      a.eat();               // 调用的是 Cat 的 eat
      Cat c = (Cat)a;        // 向下转型  
      c.work();        // 调用的是 Cat 的 work
  }  
            
    public static void show(Animal a)  {
      a.eat();  
        // 类型判断
        if (a instanceof Cat)  {  // 猫做的事情 
            Cat c = (Cat)a;  
            c.work();  
        } else if (a instanceof Dog) { // 狗做的事情 
            Dog c = (Dog)a;  
            c.work();  
        }  
    }  
}
 
abstract class Animal {  
    abstract void eat();  
}  
  
class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃鱼");  
    }  
    public void work() {  
        System.out.println("抓老鼠");  
    }  
}  
  
class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨头");  
    }  
    public void work() {  
        System.out.println("看家");  
    }  
}

抽象类

  1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。

  2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

  3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。

  4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。

  5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

封装

public方法是外部类访问该类成员变量的入口。
通常情况下,这些方法被称为getter和setter方法。
因此,任何要访问类中私有成员变量的类都要通过这些getter和setter方法。

接口

Java 抽象类和接口总结

  1. abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个 interface。
  2. 在 abstract class 中可以有自己的数据成员,也可以有非 abstarct 的成员方法,而在 interface 中,只能够有静态的不能被修改的数据成员(也就是必须是 static final 的,不过在 interface 中一般不定义数据成员),所有的成员方法都是 abstract 的。
  3. abstract class 和 interface 所反映出的设计理念不同。其实 abstract class 表示的是 “is-a” 关系,interface 表示的是 “has-a” 关系。
  4. 实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
  5. 接口中定义的变量默认是 public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
  6. 接口中的方法默认都是 public,abstract 类型的。

结论: abstract class 和 interface 是 Java 语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概 念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法

相关文章:

  • 基于SpringBoot+Vue的公益互助系统的设计与实现
  • 不怕问题多,就怕不复盘,超详细复盘步骤呈上,建议收藏
  • 神经网络模式识别方法,神经网络模式识别代码
  • DOM--事件响应链(冒泡目标捕获)
  • 测试人生 | 做了低薪运营6年,妹纸靠什么转行拿下 20W 年薪?
  • 获取Optimism 代币OP的五种方式
  • bugku misc disordered_zip
  • JVM面试常考的4个问题详解
  • 画画用电容笔还是触控笔?电容笔10大品牌排行榜
  • 企业选择快鲸开源scrm系统的7大理由
  • 中国出口商对人民币波动持乐观态度!贬值“不会继续”!
  • Spring5总结
  • 虚拟内存地址和物理内存地址?为什么我们程序里地址连续?为什么需要TLB Translation lookaside buffer
  • js高级属性
  • ISP和IAP介绍
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • CODING 缺陷管理功能正式开始公测
  • HTML-表单
  • Laravel 中的一个后期静态绑定
  • mockjs让前端开发独立于后端
  • SpringCloud集成分布式事务LCN (一)
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 初识 beanstalkd
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 如何选择开源的机器学习框架?
  • ionic入门之数据绑定显示-1
  • PostgreSQL之连接数修改
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​iOS安全加固方法及实现
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # Maven错误Error executing Maven
  • #AngularJS#$sce.trustAsResourceUrl
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (windows2012共享文件夹和防火墙设置
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (三)Honghu Cloud云架构一定时调度平台
  • (十一)手动添加用户和文件的特殊权限
  • (循环依赖问题)学习spring的第九天
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .bat批处理出现中文乱码的情况
  • .NET : 在VS2008中计算代码度量值
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net MVC中使用angularJs刷新页面数据列表
  • .Net 路由处理厉害了
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .Net语言中的StringBuilder:入门到精通
  • .NET中的十进制浮点类型,徐汇区网站设计
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • [20180224]expdp query 写法问题.txt
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [BZOJ] 2044: 三维导弹拦截
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [javaSE] 数据结构(二叉查找树-插入节点)