package str;
import java.util.Arrays;
/**
* String
* 字符串处理
*/
public class Str {
public static void main(String[] args) {
//字符串拆分
String s = "91 27 46 38 50";
String[] a = s.split(" ");//根据字符串中的拆分规律 " " 来拆分,并且拆分完成后的数据是一个数组(这是是将string拆分,因此返回的数据是string数组)
System.out.println(a);//[Ljava.lang.String;@16b98e56 数组地址值
System.out.println(Arrays.toString(a));//[91, 27, 46, 38, 50] 使用Arrays查看数组
Integer ii = 100;
System.out.println(ii.intValue() + 200);
}
}
多态中的转型谷
Demo
package obj;
/**
* 多态中的转型谷
*/
public class Dome {
public static void main(String[] args) {
/**
* 实例化基类
*/
//多态 - 向上转型
Animal c = new Cat();
System.out.println(c.name); // 动物
//System.out.println(c.age); //报错,因为 Animal类中没有age属性
c.skill(); //抓老鼠
System.out.println("-------------------");
//子类正常调用方式
/*Cat c1 = new Cat();
System.out.println(c1.name);//猫
System.out.println(c1.age);//5 不报错,因为 Cat 类中有age属性
c1.skill();//抓老鼠*/
/**
* 以上方法虽然能够调用到子类中的属性
* 但是 是实例化的一个新的对象
*
* 通过转型(向下转型将实例化的 Animal对象的实例转换成子类 )
* Cat a = (Cat)Cat();
*/
//向下转型
Cat a = (Cat) c;//将 Animal对象的实例转换成子类
System.out.println(a.age);//5
}
}
基类
package obj;
public class Animal {
String name = "动物";
public void skill()
{
System.out.println("警惕");
}
}
子类
package obj;
public class Cat extends Animal{
String name = "猫";
byte age = 5;
public void skill() {
System.out.println("抓老鼠");
}
}
Java多态
Demo:
package obj;
/**
* 多态
*/
public class Dome {
public static void main(String[] args) {
/**
* 多态的实现方式:
* 1、类型定义的是基类 Animal
* 2、实例化的是派生类 Cat
* 通过基类调用其中的方法和属性
*
* NOTE:
* 通过基类调用属性,返回的是基类中的属性
* 通过基类调用方法,返回的是子类中重写的方法
*/
//多态
Animal c = new Cat();
System.out.println(c.name); // 动物
//System.out.println(c.age); //报错,因为 Animal类中没有age属性
c.skill(); //抓老鼠
System.out.println("-------------------");
//正常调用方式
Cat c1 = new Cat();
System.out.println(c1.name);//猫
System.out.println(c1.age);//5 不报错,因为 Cat 类中有age属性
c1.skill();//抓老鼠
}
}
基类:
package obj;
public class Animal {
String name = "动物";
public void skill()
{
System.out.println("警惕");
}
}
派生类:
package obj;
public class Cat extends Animal{
String name = "猫";
byte age = 5;
public void skill() {
System.out.println("抓老鼠");
}
}
ArrayList
package gather;
import java.util.ArrayList;
/**
* 集合之ArrayList
* 集合的特点:
* 一种存储空间可变的存储模型,存储的数据容量可以发生改变
* ArrayList<E>
* E:表示集合中存储的元素类型 如创建Study类的集合,则为Study
*/
public class ArrList {
public static void main(String[] arge) {
ArrayList array = new ArrayList<String>();
System.out.println(array);//[] 该集合还没有元素
//添加元素
//ArrayList.add()
array.add("Hello");
array.add(" ");
array.add("Java");
System.out.println(array);//[Hello, , Java]
//指定位置添加元素
array.add(1,"location");
System.out.println(array);//[Hello, location, , Java] 原索引的元素被挤到后一位去了(后面所有索引+1)
//指定不存在的索引添加 - 报错(集合越界)
//array.add(5,"what"); //IndexOutOfBoundsException 和数组一样,产生索引越界 这里是集合越界
//修改指定元素
array.set(1,"王炸");
System.out.println(array);//[Hello, 王炸, , Java]
//查看指定元素
System.out.println(array.get(0));//Hello
//查看集合中的个数
System.out.println(array.size());//4
//删除元素
array.remove(2);
System.out.println(array);//[Hello, 王炸, Java]
}
}
Java中的数组
package array;
/**
* 数组必须初始化后才能使用
* 初始化分为:
* 1、动态初始化
* 初始化时只指定数组长度,由系统为数组分配初始值
* 2、静态初始化
*
* NOTE:
* 定义在局部中的变量为:栈内存
* 存储new出来的内容为:堆内存
* 每个new出来的数据都会有一个地址值,在数据使用完后会在垃圾回收器空闲时回收(非主动销毁)
*/
public class ArrarInit {
public static void main(String[] arge)
{
//动态初始化
int[] arr = new int[3];
//输出数组第一个元素
System.out.println(arr);//I@16b98e56 打印数组,返回的是数组在内存中的内存地址
//静态初始化 定义了3个元素
int[] arrb = {1,2,3};
System.out.println(arrb[0]);
System.out.println(arrb);//I@7ef20235
}
}
IntelliJ IDEA 构建Java项目
IntelliJ IDEA官网现在有免费的社区版,可以直接下载
选择文件->新建->项目
选择Java模块->项目SDK选择Java安装目录
新建项目->输入项目名称->选择项目保存位置
在创建好的项目中点击自动生成的src目录->新建->包
输入包名
点击包->新建->Java类
输入类的文件名
在新建类文件中编写测试代码
点击右键选择运行,省却终端编译操作步骤
运行结果在底部区域查看
Java变量
变量注意:
- 变量名不能重复
- 变量必须初始化(未赋值不能使用)
- 整数类型变量默认数据类型是int,赋值时为防止类型不兼容需要在数值后面加上L(表示转换为long类型)
- 浮点类型变量,默认数据类型是double,赋值时为防止类型不兼容需要在数值后面加上F(表示转换为float类型)
数据类型转换:
1. 自动转换
public class demo1 {
public static void main(String[] arge){
char a = 'a';
int b = a;
System.out.println(b);
}
}
2. 强制转换类型:
public class demo1 {
public static void main(String[] arge){
//强制类型转换
float a = 88.88F;
int z = (int) a;
System.out.println(z);//88
}
}
NOTE:
- 自动转换类型只能由 低数值范围 的数据转换到 高数值范围 的数据
- 强制类型转换可以由高数值范围转换为低数值范围的数据,但是必须指定转换的数据类型
Java数据类型
常量:
- 字符串常量:用双引号括起来的内容
- 整数常量:不带小数点的整数,包括正数和负数
- 小数常量:带小数点的数字
- 字符常量:用单引号括起来的内容
- 布尔常量:true、false
- 空常量: null
基本数据类型:
1. 数值型:
- 整数(byte,short,int,long)
- 浮点数(float,double)
- 字符(char)
2. 非数值型:
布尔(boolean)
引用数据类型:
- 类(class)
- 接口(interface)
- 数组([])
数值型的取值范围:
java学习之运行流程
java 运行流程:
编写源文件 > 转换字节码 > 解释器执行
- 源文件是我们编写代码时的.java文件
- 字节码文件是我们编写玩的.java文件用javac命令编译转换的.class文件
- 解释器执行的是编译完成的.class文件
- 所有的Java程序运行必须经过以上三个步骤(编写、编译、运行)
关于字节码文件:
- 字节码文件(.class)是与任何机器环境和操作系统环境无关的中间文件,它是一种二进制文件,是java源文件编译后产生的目标代码文件
- 编程人员和计算机都无法读懂编译后的字节码文件,必须由Java解释器来解释执行
- java虚拟机(JVM)是运行Java程序的软件环境,而Java解释器是Java虚拟机的一部分,在运行Java程序时,首先会启动JVM,然后由它来负责解释执行Java的字节码程序,并且Java字节码只能运行在JVM之上,这样JVM就可以把Java程序和具体的操作系统环境分离,实现跨平台特性
- Java程序通过JVM实现跨平台,但是JVM不是跨平台,也就是说各个操作系统上的JVM是不同的,例如Linux和Windows上的JVM
用ASCII统计字符串长度
/**统计字符串长度
* @param $str
* @param string $charset
* @return int
*/
function v_strlen($str,$charset='utf-8'){
$n = 0; $p = 0; $c = '';
$len = strlen($str);
if($charset == 'utf-8') {
for($i = 0; $i < $len; $i++) {
$c = ord($str{$i});
if($c > 252) {
$p = 5;
} elseif($c > 248) {
$p = 4;
} elseif($c > 240) {
$p = 3;
} elseif($c > 224) {
$p = 2;
} elseif($c > 192) {
$p = 1;
} else {
$p = 0;
}
$i+=$p;$n++;
}
} else {
for($i = 0; $i < $len; $i++) {
$c = ord($str{$i});
if($c > 127) {
$p = 1;
} else {
$p = 0;
}
$i+=$p;$n++;
}
}
return $n;
}