java学习笔记2
面向对象基本概念
常见类的引用
Arrays类的使用
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = { 5, 3, 2 };
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
输出为:[2, 3, 5]
Random类
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random random = new Random();
for (int i = 0; i < 10; i++) {
System.out.println(random.nextInt(30));
}
}
}
随机输出小于30的十个整数
报错 The method nextDouble() in the type Random is not applicable for the arguments (double) ,因为在旧版本 Java(比如 Java 8 及之前 )中,Random 类的 nextDouble 方法没有接收 double 类型参数的重载。它默认是生成 [0.0, 1.0) 范围的随机数,若要生成 [0, max) 范围的随机 double 值,需要用公式:random.nextDouble() * max (比如想生成 [0, 30.9) 的数,写成 random.nextDouble() * 30.9 )。从代码历史记录看,你可能写了 random.nextDouble(30.9) ,这在低版本 Java 里不被支持,就会报参数不匹配的错。
三者差异
1.
- String 是引用类型,表示字符串对象。
- 通过new String(...) 创建字符串对象,JVM会在堆内存开辟新空间储存“123”,即使字符串常量池中已有“123”,仍然会额外创建堆对象。
- 字符串内容是不可变的,String 内部用final char[]存储字符,修改字符串实际是创建新对象。
- 实际开发中更常用简写 String str = "123";(直接复用常量池,更高效)
- Integer 是int的包装类(属于引用类型),用于把基本类型int封装成对象,支持泛型,集合等场景。
- 通过 new Integer(...) 在堆内存创建 Integer 对象,将字符串 "12" 解析为 int 值后封装
- Java 5+ 后可通过自动装箱简化(如 Integer x = 12; ),无需手动 new
- 推荐 Integer.valueOf("12"),更高效
int y=12 int 是基本数据类型,直接存储数据,不属于对象。
最佳实践
- 字符串优先用 String str = "123";(复用常量池,避免不必要的 new );
- 包装类优先用 Integer x = Integer.valueOf("12");(复用缓存池,比 new 高效 );
- 基本类型 int 用于纯数值场景,简单直接,性能最优。
ArrayList
ArrayList<String>arraylist=new ArrayList<>();
arraylist.add("1");
arraylist.add("3");
System.out.println(arraylist.get(1));
for (String e : arraylist) {
System.out.println(e);
}
引用类型变量
- 引用类型变量存放的是对象的引用,而不是对象本身。
- 通过引用,可以找到某个对象
String s = new String("123");
String a = new String("123");
System.out.println(s == a);
System.out.println(s.equals(a));
返回的分别为false,true。
因为第三行比较的并不是数值,而是是否指向了同一个对象,要想比较数值,则需要通过s.equals(a)来进行。
方法的参数
封装与模块化
封装
- 访问修饰符
private
1.仅限于对象本身内部访问
2.常用于修饰对象属性
public
1.可以任意访问
2.常用于修饰方法
由于private仅限于对象本身内部访问,为了解决这个限制,则需要通过设置器setter和访问器getter来处理。
public class Person{
private String name;
private int age;
public void SetName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
this 是指向对象本身的引用
public class Main{
public static void main(String[]args){
Person p=new Person;
p.SetName("123")
System.out.println(p.getName());
}
}
模块化
每个对象代码的编写、维护独立于其他对象
对象的初始化
新建对象时的自动初始化
类型 | 初始值 |
---|---|
byte、short、int、long | 0 |
char | 空字符 |
float、double | 0.0 |
Boolean | false |
引用类型 | null |
构造函数
- 创建对象,并且对属性进行初始化
- 构造函数名称和类名相同,且无返回类型
构造函数的重载
- 重名但是参数不同
- new的时候根据传入参数选择对应的构造函数。
构造函数之this
一个构造函数调用另一个构造函数
需要使用this,且放在第一行。
如果类中没有构造函数,则它会自动创建一个无参构造函数
private构造函数
只能在类内部使用
import java.util.Scanner;
public class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public static void main(String[]args){
Scanner sc=new Scanner(System.in);
System.out.println("Please enter your name:");
String name=sc.nextLine();
System.out.println("Please enter your age:");
int age=sc.nextInt();
Person person=new Person(name,age);
System.out.println("Name:"+person.getName()+"Age:"+person.getAge());
sc.close();
}
}
(这段代码OK,不过前两段,,还没试过)。
初始化块
关于cmd新学的一条 假如有一个文件为Person.txt,你要把它改成Person.java
可以在cmd中 ren Person.txt Person.java
这样子就改好了