java初体验and类与对象

本文介绍了Java的基本概念,如面向对象编程与C语言的对比,以及Java的三大特性(封装、继承、多态)和五大原则。还详细讲解了Java的运行环境(JVM),HelloWorld程序示例,输出与输入、运算符、数组操作、类与对象的概念,以及static修饰符的使用。
摘要由CSDN通过智能技术生成

java初步学习(注重与c语言的比较)

关键概念

  1. Java是面向对象(OOP:面向对象的编程)的,而c是面向过程的

    面向对象易于维护,但性能较面向过程要差一些,面向对象耗费材料

    eg.吃饭时面向过程自己买菜做饭,一步一步做出最终的饭菜,做出来因为没有其他原材料没办法更改结果;而面向对象是在餐馆,直接下单要吃的饭菜,就算做好了也可以临时要求老板重做其他饭菜

  2. Java的三大特性与五大原则:

    • 三大特性:封装(隐藏代码细节),继承(后者的前提),多态
    • 五大原则
      • 单一职责原则SRP:类的功能要单一
      • 开放封闭原则OCP:只接受增加细节,不接受修改
      • 里式替换原则LSP:子类能代替父类执行其功能
      • 依赖倒置原则DIP:抽象不依赖于具体,具体应依赖于抽象(高级不应该被低级调用,如类不应被对象调用)
      • 接口分离原则ISP:不同的接口调不同的功能
  3. Java的运行实际上是在JVM(虚拟机)上运行,其跨平台的核心就在于通过不同的虚拟机翻译成不同系统能看懂的语言;

    JRE=JVM+核心库类,是Java的运行环境,有了它Java可以运行但不能开发

    JDK=JRE+运行开发工具,一般初学直接下载JDK即可

基础

第一个Java程序:
public class HelloWorld{
    public static void main(String[] args){
        System.out.print("HelloWorld");
    }
}
//class 后面的 称之为“类名” 
//public class后面的类名 必须和文件名保持一致 
//一个文件可以多个类(class),但是只能有一个 公共类(public class) 
  1. Java的输出与输入

    • 输出:调用System类里的方法System.out.print(),若是println则自动换行;

    • 输入:(1)实例化Scanner类Scanner input = new Scanner(System.in);
      (2)以input引用类的方法input.nextInt()/nextLine()等等,input.equals("需要比较的字符串")可以将读入与预期进行比较,一样则返回1(任意一个字符串都有该种方法)

      `next()` 和`nextLine()`的区别:
      next()不接收空格、回车,并且将空格、回车作为终止符号
      nextLine()接收空格、回车
      
  2. 运算符:>>>无符号右移:无论最高位是0还是1,空缺位都用0填充

  3. 基本数据类型:

    • 定义long类型时需要给数据加上L或l,同理float要加F或f,而double要加D或dlongdouble都是八个字节,没有long long

    • boolean是布尔类型

    • Java里char关键字占两个字节,byte作为单独一个关键字占一个字节,且没有sizeof这样的关键字,但可以调用类里面的常量得知其字长,需要注意char没有提供这种常量

public class test {
    public static void main(String[] args) {
        System.out.println(Integer.SIZE);//32
        System.out.println(Integer.BYTES);//4
    }
}
  1. final代替const的功能,Java里无const

  2. 进制表示:二进制 :0b+数字(eg.0b011表示3);十进制(默认);八进制: 0+数字;十六进制:0x+数字

  3. 产生随机数Math.random()

循环语句

foreach(增强for)可用于遍历数组和集合

数组例子:(自动打印完numbers里面的数据)

public class test {
    public static void main(String[] args) {
        int [] numbers = {10, 20, 30, 40, 50};
        for (int tep : numbers) {//tep的类型应与numbers的类型保持一致
            //若在该处对tep赋值,则无法输出数组内的元素
            System.out.println(tep);
        }
    }
}

数组

需要注意的小细节

两种创建新数组形式:
int [] students = new int[300];//只声明数量不赋值
int students[] = new int[300];//与上一行等价
int[] students = new int[]{97,98,99};//直接初始化
int[] students = {97,98,99};//对上一行的简化
可以这样分开创建与赋值:
int[] test = new int[3];
test = new int[]{0, 1, 2};
排序的库方法:
Arrays.sort(students);
字符串数组:
String[] province = {"陕西", "山西", "四川"};
  • 获取数组长度时使用其属性students.length

探寻数组的一个小测试

笔者想试一试int数组能不能像字符串那样直接打印出全部值

int[] test = new int[30];
test = new int[]{10, 20, 30};
System.out.println(test);
//打印的结果为[I@776ec8df

看着像地址实则不然,Java是一个面向对象的语言,会隐藏底层实现,几乎所有直接寻址都是无果的

直接打印数组名,数组对象会调用其默认的toString方法(Java里的强制转化,这里是转化为String字符串类输出)。对于数组类型,这个默认的toString方法并不会返回数组内容的字符串表示,而是返回数组的类型信息和一个哈希码(由地址算出)的十六进制表示

但我们如果主动使用这个方法,则会打印出数组内的值

System.out.println(Arrays.toString(test));
//打印的结果为[10, 20, 30]

类与对象

  • 类是抽象的,对象是具体的(eg.对象“张三”“李四”属于“人”这个类)

  • 类由静态的属性和动态的方法组成

    • 属性(独有):可以类比c语言中的全局变量,位于方法外面类的里面,会自动进行初始化,int默认为0String默认为NULL

    • 方法(公共):可以理解为函数,同一个类下的方法间也可以互相调用

      public class Person {
          int age;
          String name;
          //Person类的属性
          
          public static void Eat{
              System.out.println("吃饭");
          }
          public void Sleep{
              System.out.println("睡觉");
          }
          //Person类的方法
      }
      

      方法的调用与static修饰间的关系:(不调同级别的不礼貌)

      static方法是类级别的,非static方法则是对象级别的

      同一个类中:

      • 都有static ,或都没有static可直接调用

      • 有static的方法不能直接调用没有static的方法(类不能直接调对象,需要实例化)

      不同类中:

      • 万能方法:引用实例化(可以调所有,将在下面介绍)
      • 直接使用类名.方法() 其中的方法必须是static修饰(类可以直接调类)
  • 在其他类中要使用类的属性和方法需要将类实例化为具体的对象

    假设下面在main里面调用Person

public class Study {
    public void main(String[] args) {
        Person zhangsan = new Person();//实例化:类名 引用名 = new 类名();
        zhangsan.age = 18;
        zhangsan. name = "张三";
        zhangsan.Sleep();
        zhangsan.Eat();//极其不推荐,违背了依赖倒置原则,对象级别的zhangsan直接调用了类级别的static
        //具体调用Person类中的属性和方法时需要用" . ",
    }
}

在上面的例子中,zhangsan就是一个对新对象new Person()的一个引用,当然也可以将zhangsan理解为具体的对象,毕竟Java中一切皆对象

zhangsan这个引用实际上是在栈区,内部保存着新对象的内存地址,而实例化后的对象new Person()则在堆区

Java中没有指针,但实际上这个引用就起着指针的作用

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值