java学习:OOP入门

简介: 有c#基础的程序员,学习java其实很容易上手,绝大多数语法基本相同,概念也接近 1、属性 java中没有象c#中的Property概念,只有set,get方法 package jmyang.oop; public class Animal {    private String _name;     public Animal(){        System.

有c#基础的程序员,学习java其实很容易上手,绝大多数语法基本相同,概念也接近

1、属性

java中没有象c#中的Property概念,只有set,get方法

package jmyang.oop;

public class Animal {
    private String _name;

    public Animal(){
        System.out.println("Animal的构造函数被调用!");
    }

    public void eat(){
        System.out.println("Animal的eat方法被调用!");
    }
   
    public String getName(){
        return this._name;
    }
   
    public void setName(String value){
        this._name = value;
    }
}

 

2、继承 extends

package jmyang.oop;

public class Dog extends Animal {
    public Dog() {
        System.out.println("Dog的构造函数被调用!");
    }

    public void eat() {
        System.out.println("Dog的eat方法被调用!");
    }


    public void eat(String food) {
        System.out.println("Dog的eat(String food)方法被调用!");
    }

}

3、接口
package jmyang.oop;

public interface IRun { 
   
    //注:final关键字,可省略
    final int speed = 1;
   
    //注:abstract关键字,可省略
    abstract void Run();
}

实现接口必须在定义类时,使用implements关键字

package jmyang.oop;

public class Dog extends Animal implements IRun {
    public Dog() {
        System.out.println("Dog的构造函数被调用!");
    }

    public void eat() {
        System.out.println("Dog的eat方法被调用!");
    }


    public void eat(String food) {
        System.out.println("Dog的eat(String food)方法被调用!");
    }

    public void Run() {       
        System.out.println("Dog实现了IRun接口的Run方法,速度=" + speed);
    }

}

4、java:final 与 c#:sealed

如果一个类不想被其它类所继承,可以在定义类时,用final关键字修饰,这跟c#中的sealed关键字作用相同.

注:c#中static关键字可以用来修饰类,表示该类不能被继承,而且类中的方法/字段,都必须是static类型,java中没有对应的概念(java中的static也不能用于class定义)

 

6、常量表示法(java:final 与 c#:const)

java中要表示常量 ,只要在定义变量时,加一个final关键字即可,表示该变量不可再被修改,这类似于c#中的const关键字(java中其实也有const关键字,但是目前尚未启用,仅作为保留关键字)


7、重大差异

OOP中,常用“父类”来创建“子类”,即: FatherClass c = new ChildClass();

但是如果FatherClass与ChildClass中都有相同的方法签名时(比如都有MethodSample方法),java与c#中调用该方法的结果完全不同。java中c.MethodSample()调用的是子类的方法,而c#中调用的是父类的方法。

见下面的代码:

c#版本:

using System;

namespace OOPTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Human h = new Chinese();
            h.say();//say() in Human
            Console.Read();
        }
    }


    class Human
    {
        public  void say()
        {
            Console.WriteLine("say() in Human");
        }
    }

    class Chinese : Human
    {
        public void say()
        {
            Console.WriteLine("say() in Chinese");
        }
    }
}

java版:

public class Human {

    public void say(){
        System.out.println("say() in Human");
    }
}
public class Chinese extends Human {

    public void say() {
        System.out.println("say() in Chinese");
    }
}

JApp.main 

public class JApp {

    public static void main(String[] args) {
        Human h = new Chinese();
        h.say();//say() in Chinese
    }
}

其根本原因在于java与c#的理念不同,java认为子类中的同名方法是override行为,是重载,而c#则认为是隐藏父类的方法,是hide行为。当然,要达到java的晚绑定效果,c#其实也能做到,在父类方法里添加virtual,在子类方法里添加override就行了

    class Human
    {
        public virtual void say()
        {
            Console.WriteLine("say() in Human");
        }
    }

    class Chinese : Human
    {
        public override void say()
        {
            Console.WriteLine("say() in Chinese");
        }
    }

 此外,static 方法在java中可被"实例化的对象"调用,而c#中则不允许。

举例:ClassA有一个static方法MethodA,在java中可以这么调用:
ClassA a = new ClassA();
a.MethodA();
ClassA.MethodA();

而c#中只能用ClassA.MethodA();

 

8、java:package与c#:namespace

java中对于文件的组织是以“包package"来进行的,这一点跟c#中的"命名空间namespace"比较接近。不同的是:java中的package与文件夹名称是对应的,而c#中的namespace则不必强制对应。

举例:
java中如果创建一个名为aaa的包,则必然会有一个名为aaa的文件夹,而且所有aaa包里的文件,都放在文件夹aaa下;包aaa下还可以再创建“子”包,比如aaa.bbb,则aaa文件夹下,会再创建一个bbb的子文件夹。

 

目录
相关文章
|
30天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
46 3
|
30天前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
87 43
Java学习十六—掌握注解:让编程更简单
|
9天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
15天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
1月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
32 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
21天前
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
60 5
|
18天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
30 1
|
22天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
24天前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
43 3
|
26天前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。
下一篇
无影云桌面