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的子文件夹。

 

目录
相关文章
|
5月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
323 1
|
6月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
188 1
|
5月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
487 0
|
5月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
561 8
|
6月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
106 5
|
6月前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
180 5
|
6月前
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
242 3
|
存储 安全 Java
24、使用 Java 官方教程学习:① 类变量和类方法详解;② 深入介绍 main() 方法
24、使用 Java 官方教程学习:① 类变量和类方法详解;② 深入介绍 main() 方法
230 1
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
|
Java 测试技术 C++
【JAVA学习之路 | 进阶篇】File类及常用方法
【JAVA学习之路 | 进阶篇】File类及常用方法