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的子文件夹。
- TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络
- ASP.NET的路由系统:路由映射
- ASP.NET Core的配置(3): 将配置绑定为对象[上篇]
- ASP.NET的路由系统:URL与物理文件的分离
- 使用Excel分析CloudStack使用记录
- 卷积神经网络初探索
- TensorFlow 深度学习笔记 逻辑回归 实践篇
- 黑客是如何实施暴力破解的?
- Python的初学者你现在可以自己“看”到代码的运行了!
- ASP.NET Core的配置(3): 将配置绑定为对象[下篇]
- TensorFlow 深度学习笔记 从线性分类器到深度神经网络
- 微信版12306来了!用12306微信小程序买票靠谱吗
- 无需写try/catch,也能正常处理异常
- “人工智能毁灭人类”是一种末世恐惧传染病
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释