• java学习:OOP入门


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

  • 相关阅读:
    python中的面向对象编程
    python global vs nonlocal (2)
    python3 nonlocal vs global
    poj蚂蚁问题
    C/C++ static vs global
    砝码问题
    Wythoff's game
    C++中的::operator new, ::operator delete
    客户信息表 自我汇总 待确认
    Oracle Savepoint
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/2752860.html
Copyright © 2020-2023  润新知