java简介
java语言的特性
搭建java环境
第一个java程序
public class Helloworld{
public static void main(String[] args){
System.out.println("Hello world"); //println自带换行
System.out.print("Hello");
System.out.print("world");
}
}
一个源文件中最多只能有一个public类,其他类的个数不限,若源文件包含一个public类,那文件名必须按该类名命名
Java方法由一条条语句构成,每个语句以“;”结束。
注释
//
/*注释内容*/
JAVA命名规则
每一个应用程序都必须包含一个main()方法
含有main()方法的类称为主类
一个java程序是由若干个类组成的,
包名的命名规则
包名中的字母一律小写
不能有数字
公司的域名的倒写 + 项目名 + 模块名
www.mi.com
com.mi.test.testadd
声明成员(全局)变量和局部变量
变量的声明 : 数据类型 变量名
或 数据类型 变量名=值
String类型
数据类型转换
自动类型转换 (隐式转换)
满足的条件 : 小类型转大类型,小范围转大范围
基本数据数据类型自动转换规律
byte - short - int - long - float - double
char - int - long - float - double
char在一定条件下可以和byte类型相互转换
public class test {
public static void main(String[] args) {
// 小类型转大类型
// byte转int
byte a=2;
int b;
b=a;
System.out.println(b);
}
}
强制类型转换 (显式转换)
数据类型1 变量的名字 = (数据类型1) 变量的名字
double d=3.14d;
int i (int)d;
Java 的浮点型常量默认为double型,声明float型常量,须后加‘f’或‘F’。
转义字符
\` 单引号字符
\\ 反斜杠字符
\t 垂直制表符,将光标移到下一个制表符的位置
\r 回车
\n 换行
Math类
Math是lang包下的类,里面定义了很多方法来实现常用的数学运算
Math类中的方法都是静态的
Math类中的方法
abs() : 求绝对值
sqrt() : 求平方根
pow() : 求乘方
random() : 获得0-1之间的随机数
public class test {
public static void main(String[] args) {
System.out.println("求绝对值" + Math.abs(-10));
System.out.println("求平方根" + Math.sqrt(9));
System.out.println("求2的3次方" + Math.pow(2,3));
System.out.println("获得0-100之间的随机数" + Math.random()*100);
}
}
声明常量
final 数据类型=常量名称=值
例如 final double PI=3.1415926D
算数运算符
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
+ | 正号 | +2 | 2 |
- | 负号 | a=3,-a | -3 |
+ | 加 | 2+2 | 4 |
- | 减 | 5-3 | 2 |
* | 乘 | ||
/ | 除 | ||
% | 取余 | ||
++ | 自增(前) | a=2;b=++a | a=3;b=3 |
++ | 自增(后) | a=2;b=a++ | a=3;b=2 |
– | 自减(前) | a=2;b=–a | a=1;b=1 |
– | 自减(后) | a=2;b=a– | a=1;b=2 |
+ | 字符串相加 |
逻辑运算符
运算符 | 运算 | 范例 | 结果 | 运算解释 |
---|---|---|---|---|
& | 与 | 都为真才真 | ||
&& | 与 | 都为真才真 | ||
| | 或 | 有一真就真 | ||
|| | 或 | 有一真就真 | ||
^ | xor异或 | false^true | true | 双方不同则为真 |
! | not非 | !true | false | 取反 |
3
x>3 & x<6
布尔表达式1?表达式2:表达式3;
示例 : System.out.println((4<5)?"a":"b");
if-else-if
格式
if(条件1){
条件1成立执行的代码块
}else if(条件2){
条件2成立执行的代码块
}else if(条件3){
条件3成立执行的代码块
}else{
以上条件都不成立执行的代码块
}
Scanner类
import java.util.Scanner;
public class test {
public static void main(String[] args) {
// 根据输入的分数评价优良差
System.out.println("请输入分数:");
// 根据Scanner类生成对应的对象,先导入Scanner类包
Scanner sc = new Scanner(System.in);
// 根据对象调用命令行中输入的方法
int i = sc.nextInt();
if(i<60 && i>=0) {
System.out.println("这次没考好哦,要努力喽!");
}else if(i>=60 && i<80) {
System.out.println("及格了,再接再厉");
}else if(i>=80 && i<90) {
System.out.println("你狠优秀!");
}else if(i>=90 && i<=100) {
System.out.println("太棒了你");
}else {
System.out.println("输入错误!");
}
}
}
switch多分支语句
格式
switch(变量){
case 常量1:
语句1;
break;
case 常量2:
语句2;
break;
… …
case 常量N:
语句N;
break;
default:
语句;
break;
}
public class test {
public static void main(String args[]) {
int i = 1;
switch (i) {
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
break;
default:
System.out.println("default");
break;
}
}
}
switch(表达式)中表达式的返回值必须是下述几种类型之一:
byte,short,char,int,String, 枚举;
case子句中的值必须是常量,且所有case子句中的值应是不同的;
default子句是可任选的,当没有匹配的case时,执行default
break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有break,程序会顺序执行到switch结尾
循环语句
while
public class test{
public static void main(String[] args) {
// 输出1-100数字
int i=1;
while(i<=100) {
System.out.println(i);
i++;
}
}
}
break 循环一旦遇到break,跳出循环
continue 跳转到循环开始的地方
public class test {
public static void main(String[] args) {
// 求1-100之间的偶数和
int i = 1, sum = 0;
while (i <= 100) {
if (i % 2 == 0) {
sum = sum + i;
}
i++;
}
;
System.out.println(sum);
}
}
do … while
格式
do{
语句或语句块;
}while(布尔值测试表达式);
public class test {
public static void main(String[] args) {
int i=1,sum=0;
do {
sum += i;
i++;
}while(i<=10);
System.out.println(sum);
}
}
for
格式
for(初始值;条件;运算法则){
循环体;
}
public class test {
public static void main(String[] args) {
// 循环输出打印1-10
for(int i=1;i<=10;i++) {
System.out.println(i);
}
}
}
public class test {
public static void main(String[] args) {
for(int i=1;i<=6;i++) {
for(int j=i;j<=6;j++) {
System.out.print("*");
}
System.out.println();
}
}
}
******
*****
****
***
**
*
public class test {
public static void main(String[] args) {
// 九九乘法表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "x" + i + "=" + j * i + "\t");
}
System.out.println();
}
}
}
数组的概述
一位数组的创建和使用
一位数组两种声明格式 : 数组元素类型 数组名字[]
、数组元素类型[] 数组名字
public class array {
public static void main(String[] args) {
// 声明一个整型的数组
int arr[];
// 字符串的数组
String str[];
}
}
声明数组后还不能立即给任何元素,需要给数组分配空间
给数组分配空间
格式 : 数组名字 = new 数组元素类型[数组元素的个数]
public class array {
public static void main(String[] args) {
// 声明一个整型的数组
int arr[];
// 字符串的数组
String str[];
// 给数组分配空间
arr = new int[6];
str = new String[4];
}
}
使用ew关键字为数组分配内存时,整型数组中各个元素的初始值都是0
声明的同事为数组分配内存空间
语法结构 : 数组元素类型[] 数组名=new 数组元素类型[元素个数]
、
数组元素类型 数组名[] = new 数组元素类型[元素个数]
int month[] = new int(12)
给数组中的元素赋值
public class array {
public static void main(String[] args) {
// 声明一个整型的数组
int arr[];
// 字符串的数组
String str[];
// 给数组分配空间
arr = new int[6];
str = new String[4];
// 给数组中的元素赋值
System.out.println(arr[0]); // 0
arr[0]=666;
System.out.println(arr[0]); // 666
}
}
初始化一维数组
int arr[] = new int[]{1,3,5,9,7}
、int arr2[]={10,2,55,66}
二维数组的创建和使用
二维数组常用于表示表,表中的信息以行和列的形式组织
二维数组的创建
先声明,然后用new运算符进行内存分配
数组元素类型 数组名[][]
数据类型[][] 数组名 =new 数据类型[m][n] //m:储存了m个数组; n:二维数组中储存的每个数组的大小
int[][] arrs= new int[2][3];
2指arrs存储了2个一维数组
3指arrs中这两个数组,每组大小都是3
二维数组数据
int[][] arrs = {{1,2,3},{4,5},{6}};
二维数组定义方式扩展
数据类型[][] 数组名 =new 数据类型[m][]
int[][] arrs = new int[3][]
数组的基本操作
length 获取长度
public class array {
public static void main(String[] args) {
// 声明一个数组
int arr[]= {1,2,4,9,6};
// 打印数组的长度
System.out.println(arr.length); // 5
}
}
数组排序算法
对数组排序
使用Arrays类的静态方法sort()对数据进行升序排序 : Arrays.sirt(object)
object是指要排序数组名
import java.util.Arrays;
public class array {
public static void main(String[] args) {
// 声明一个数组
int arr[]= {1,80,4,9,6};
// 对数组进行排序
Arrays.sort(arr);
// 对数组进行遍历
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
}
/* 结果
1
4
6
9
80*/
复制数组
使用Arrays类的copyOf()方法与copyOfRange()方法实现对数组的复制
copyOf()方法 :
copyOf(arr,newlength)
arr: 目标数组, newlength:int型常量,指复制后新数组的长度
说明 : 新数组长度>旧时,元素不够用0来凑; 新<旧,截取
import java.util.Arrays;
public class array {
public static void main(String[] args) {
// 声明一个数组
int arr[]= {1,80,4,9,6};
// 复制数组
int arr1[]=Arrays.copyOf(arr, 2);
// 对数组进行遍历
for(int i=0;i<arr1.length;i++) {
System.out.println(arr1[i]);
}
}
}
/*
1
80
*/
copyOfRange() 方法
语法 : copyOfRange(arr,formIndex,toIndex)
arr 目标数组; formIndex:复制数组内元素的起始索引; toIndex: 结束索引(不包含)
import java.util.Arrays;
public class array {
public static void main(String[] args) {
// 声明一个数组
int arr[]= {1,80,4,9,6};
// 复制数组
int arr1[]=Arrays.copyOfRange(arr,1,2);
// 对数组进行遍历
for(int i=0;i<arr1.length;i++) {
System.out.println(arr1[i]);
}
}
}
// 结果 : 80
冒泡
public class maopao {
public static void main(String[] args) {
// 冒泡排序
int arr[] = {12,55,3,22,1,6};
// 外层循环 控制轮次
for(int i=1;i<arr.length;i++) {
// 内层循环, 遍历数组元素,进行对比换位
for(int j=0;j<arr.length-i;j++) {
// 相邻两个数对比,大的放右边
if(arr[j]>arr[j+1]) {
int temp = arr[j]; //设置中间值
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
// 遍历打印查看排序结果
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
}
遍历数组方式二
public class bianli {
public static void main(String[] args) {
// 遍历数组方式二
int arr[] = {12,55,3,22,1,6};
for(int i:arr) { //i是一个变量,用来接收数组中的每一个元素
System.out.println(i);
}
}
}
声明类的语法格式
修饰符 class 类名{
属性声明;
方法声明;
}
说明 : 修饰符 public: 类可以被任意访问
举例
public class Person{
private int age; //声明私有变量变量age
public void showAge(int i){ //声明方法showAge()
age = i;
}
}
类的属性
语法格式
修饰符 类型 属性名=初值;
说明 : 修饰符private:该声明的属性只能由该类的方法访问
修饰符public: 该声明的属性可以被类以外的方法访问
举例
public class Person{
private int age; // 声明private变量age
public String name="lili" // 声明public变量name
}
类的方法
语法格式 :
修饰符 返回值类型 方法名(参数列表){
方法体语句;
}
说明 : 修饰符 : public,private,protected等
返回值类型 : return语句传递返回值. 没有返回值则返回值类型用void
举例 :
public class Person{
private int age;
public int getAge(){ //声明方法getAge
return age;
}
public void setAge(int i){ //声明放大setAge
age = i; // 将参数i的值赋给类的成员变量age
}
}
在java文件中,public修饰的类,只能出现一次
自定义类
// 声明自定义Animal、Car两个类
package com.animal;
// 声明一个自定义类Animal
public class Animal {
// 属性 名字 颜色 体重
public String name;
public String color;
public int weight;
// 方法
public void eat() {
System.out.println("正在吃!");
}
public void study() {
System.out.println("正在学习!");
}
}
// 声明一个车类
class Car{
// 属性 价格
int price;
// 方法
public void run() {
System.out.println("跑!!!");
}
}
// 由于没有程序主入口,因此这两个类无法运行,运行需要先实例化
// 用自定义的类生成对象
package com.animal;
public class test {
public static void main(String[] args) {
// 用new生成类对象.大象
// 格式 : 类名 对象名=new 类名();
Animal elephant = new Animal();
// 调用属性
elephant.name = "盼盼";
elephant.color = "黑白";
elephant.weight = 100;
// 调用方法
elephant.eat();
elephant.study();
System.out.println("名字 :" + elephant.name);
// 实例化车对象
Car car=new Car();
car.price = 999;
car.run();
}
}
权限修饰符
public 对外公开 所有类都可以访问
protected 受保护的 子类及其同一个包中的类可以访问
默认的 没有访问修饰符 只向同一个包中的类公开
private 私有的 只有类本身可以访问,不对外公开
abstract :可以用来修饰类和成员方法,用该修饰符修饰的类表示抽象类,用该修饰符修饰的方法表示抽象方法
面向对象三大特性
封装
public class fz {
public static void main(String[] args) {
// 对Animal实例化对象
Animal a1 = new Animal();
// a1.name = "团团"; 因为是被封装起来的,因此无法被调用
// 可调用的public声明的一个方法
a1.play(); // 结果 : 正在玩
// setter和getter方法提供了私有化成员的对外操作
}
}
// 封装 - 动物类
class Animal{
// 对属性进行封装 - private
private String name;
private int age;
// 对方法部分封装
private void eat() {
System.out.println("正在吃");
}
public void play() {
System.out.println("正在玩");
}
}
setter和getter方法
setter方法格式 :
public void set属性名(数据类型 属性名){
this.属性名 = 属性名;
}
getter方法格式 :
public void get属性名(){
return 属性名;
}
public class fz {
public static void main(String[] args) {
// 对Animal实例化对象
Animal a1 = new Animal();
// setter和getter方法提供了私有化成员的对外操作
// 通过set设置name
a1.setName("国宝"); // 实参
// 通过get获取name
a1.getName();
System.out.println(a1.getName());
//调用方法
a1.getEat();
}
}
// 封装 - 动物类
class Animal{
// 对属性进行封装 - private
private String name;
private int age;
// setter和getter方法提供了私有化成员的对外操作
// 设置set方法
public void setName(String name) {
this.name = name;
}
// 获取getter方法
public String getName() {
return this.name;
}
// 对方法部分封装
private void eat() {
System.out.println("正在吃");
}
public void play() {
System.out.println("正在玩");
}
// 获取eat的方法
public void getEat() {
//自定义方法的调用 eat()
eat();
}
}
继承
多态
成员变量和局部变量
定义位置 :
成员变量 : 在方法之外,类之内
局部变量 : 在方法内部
使用范围 :
成员变量 : 在整个类中都可以访问
局部变量 : 只能在局部变量所在的方法内部访问
public class TestBl {
public static void main(String[] args) {
// 实例化对象Bl
Bl bl=new Bl();
bl.show1();
bl.show2();
}
}
// 声明一个类
class Bl{
// 声明一个全局变量
int a = 6;
// 声明一个方法
public void show1() {
// 声明局部变量
int b = 7;
System.out.println(a);
System.out.println(b);
}
// 声明另一方法
public void show2() {
System.out.println(a);
// System.out.println(b); b是局部变量,在其他方法中无法访问
}
}
使用this关键字将数值赋予类中的成员变量
public void setName(String name){
this.name=name;
}
说明 : this.name 是指这个类中的name成员变量
是一个与类同名的方法,对象的创建就是通过构造方法完成的
每当类要实例化一个对象时,类都会自动调用构造方法
格式
访问修饰符 类名(){
}
其中: public 是构造方法修饰符
特点 :
1.构造方法没有返回值
2.构造方法的名称要与本类的名称相同
构造方法的作用 :一般用来对属性进行赋值 (初始化)
public class TestBl {
public static void main(String[] args) {
// 实例化Person
Person p1 = new Person(); // 调用无参构造方法
p1.study();
p1.setName("*--张三--*");
System.out.println(p1.getName());
// 上面两行代码结果 : 无参构造方法 学习 *--张三--*
Person p2 = new Person("p2"); // 有参构造方法:p2
}
}
// 自定义一个类
class Person{
String name;
// 无参的构造方法
public Person() {
System.out.println("无参构造方法");
}
// 有参构造方法
public Person(String name) {
this.name = name;
System.out.println("有参构造方法:" + this.name);
}
//setter
public void setName(String name) {
this.name = name;
}
//获取name
public String getName() {
return this.name;
}
// 自定义方法
public void study() {
System.out.println("学习");
}
}
package com.test.student;
public class testStudent {
public static void main(String[] args) {
// 用无参构造方法生成对象
Student s1 = new Student();
s1.setName("张三");
s1.setAge(22);
System.out.println("姓名:"+s1.getName() + " 年龄:" + s1.getAge());
// 用有参构造方法生成对象
Student s2 = new Student("李四",18);
System.out.println("姓名:"+s2.getName() + " 年龄:" + s2.getAge());
}
}
/*
创建一个学生类
学生有名字、年龄属性
有吃饭、学习方法
创建两个学生对象
分别通过setter和构造方法时效件属性初始化
最后输出学生的姓名、年龄
*/
class Student {
// 姓名 年齡
private String name;
private int age;
// 无参的构造方法
public Student() {
}
// 有参构造方法,属性初始化
public Student(String name,int age) {
this.name = name;
this.age = age;
}
// 通过setter方法进行赋值
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
// getter方法获取姓名和年龄
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
// 自定义方法
public void eat() {
System.out.println("天天吃");
}
public void study() {
System.out.println("努力学习");
}
}
有参无参setter等构造声明顺序
class 类名 {
属性
无参构造方法
有参构造方法
setter和getter
自定义方法
}
构造方法和普通方法的区别
方法名 :
构造方法 : 构造方法名必须和类名保持一致
普通方法 : 见名知意
返回值 :
构造方法 : 没有返回值.也没有void
普通方法 : 正常的返回值
方法调用 :
构造方法 : 自己不能调用,只能自在创建对象时,由java虚拟机来调用
普通方法 : 方法名(参数列表)
方法体 :
构造方法 : 可以写任意,但一般用来给属性赋值(初始化)
普通方法 : 任意代码都可以
构造方法 :
如果一个都不写,系统会给我们添加一个默认,如果写了,不管是什么构造方法,系统不再添默认的构造方法
子类继承父类的特征和行为,使得子类具有父类的各种属性和方法
java通过extends关键词实现类与类的继承
class 子类名 extends 父类名{}
继承的特点
java一个类只能有一个父类,不可以有多个父类
java支持多层继承(继承体系)
class A{}
class B extends A{}
class C extends B{}
继承的一些说明
1.子类继承父类的所有成员,但父类的私有成员,因权限(private)不能被访问 (通过setter getter访问)
2.构造方法不能被继承,但子类可通过super()关键字访问父类构造方法
继承原则
1.java不允许选择继承,不能为了部分功能而继承
2.继承中类之间体现的是 : "is a" 的关系 (一个子类只能继承一个父类)
public class testAnimal {
public static void main(String[] args) {
// 通过无参构造方法实例化对象
// // 实例化Cat
// Cat cat = new Cat();
// cat.setName("小花");
// String name = cat.getName();
// System.out.println(name);
// cat.eat();
// cat.say();
// // 上边运行结果
// /* 父类的无参构造方法!
// * 小花
// * 吃鱼
// * 喵喵喵
// * */
// 通过有参方法实例化对象
Cat cat = new Cat("喵喵", "黄色");
System.out.println(cat.getName());
cat.eat();
cat.say();
/*
* 结果 父类有参构造方法 喵喵 吃鱼 喵喵喵
*/
}
}
// 声明一个父类Animal
class Animal {
// 属性 name,color
private String name;
private String color;
// 声明无参构造方法
public Animal() {
System.out.println("父类的无参构造方法!");
}
// 声明有参构造方法
public Animal(String name, String color) {
this.name = name;
this.color = color;
System.out.println("父类有参构造方法");
}
// setter getter
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
// 方法 eat say
public void eat() {
}
public void say() {
}
}
// 声明子类
class Cat extends Animal {
// 在子类声明一个无参构造方法去继承父类的无参构造方法
public Cat() {
// super() 是出现在子类的构造方法里面的
super();
}
// 声明有参构造方法
public Cat(String name, String color) {
super(name, color); // 直接调用父类的有参构造方法
}
// 父类方法的重写
public void eat() {
System.out.println("吃鱼");
}
public void say() {
System.out.println("喵喵喵");
}
}
class dog extends Animal {
// 方法重写
public void eat() {
System.out.println("吃骨头");
}
public void say() {
System.out.println("汪汪汪");
}
}
继承中的成员
java支持子类定义相同的成员
成员变量、成员方法可以和父类相同
但当使用对象的成员时,要使用就近原则
1.先找子类成员
2.子类没有找父类成员
3.都没有报错
当子类和父类成员相同却想用父类成员时,需要用supr关键字标明
super关键字
super只能在子类的方式使用,且对当前对象的父类的引用
super(...)调用父类构造方式时,只能在子类的构造函数中使用,且必须是子类构造函数的第一行
this()和super()不能同时出现
多态的条件
1.有继承关系
2.有方法重写(多态的意义)
3.父类引用指向子类对象(多态的核心)
举例
Cat cat = new Cat()
Animal cat = new Cat();
Animal 是父类 Cat是子类
Animal cat = new Cat(); 父类的引用指向子类的对象
抽象类
格式 : abstract class 类名{}
特点 :
抽象方法
在普通方法的访问修饰符上增加abstract
特点 :
抽象类中的成员特点
public class chouXiang {
public static void main(String[] args) {
// 尝试实例化抽象类A
// A a = new A(); // 报错
}
}
// 抽象类A
abstract class A {
// 抽象方法
public abstract void show(); // 不能有方法体
}
// 声明一个子类
class ZiLei extends A {
@Override // 继承抽象类的子类必须重写所有抽象方法
public void show() {
// TODO Auto-generated method stub
}
}
// 抽象类C 继承抽象类A 不用重写抽象方法
abstract class C extends A {
}
package com.test.Animal;
public class testAnimal {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
// 抽象类
abstract class Animal {
public abstract void eat();
public abstract void say();
}
class Cat extends Animal { // 等子类继承抽象类父类的时候,如子类不是抽象类,则强制子类重写父类所有的抽象方法
@Override
public void eat() {
System.out.println("吃鱼");
}
@Override
public void say() {
System.out.println("喵喵喵");
}
}
接口
是一种比抽象类更加抽象的"类结构"
定义的格式 : interface 接口名{}
使用格式 : class 子类 implements 接口名 {}
表示子类实现了这个接口
注意
package com.ts.testinterface;
public class Testinterface {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
// 声明一个接口类A
interface A {
// 抽象常量
public static final int NUM = 5;
int I = 6; // 不写默认public static final
// 抽象方法
public abstract void show();
void test(); // 不写修饰符默认 "public abstract"
}
// 声明接口B
interface B {
void study();
}
/*
* 当一个类既有继承,又有实现接口,要先继承,后实现接口 class 子类 extends 父类 implements 接口{}
*/
// 声明一个类 C 实现接口A
class C implements A, B {
// 必须重写接口的所有抽象方法
@Override
public void show() {
// TODO Auto-generated method stub
}
@Override
public void test() {
// TODO Auto-generated method stub
}
@Override
public void study() {
// TODO Auto-generated method stub
}
}
接口案例
package com.ts.testanimal;
public class TestAnimal {
public static void main(String[] args) {
// 实例化Cat
Cat cat = new Cat();
cat.name = "小花";
cat.eat();
cat.jump();
cat.sleep();
System.out.println(cat.name);
}
}
/*
* 猫狗案例 猫和狗都有自己的名字 可以吃和睡 eat(),sleep() 可以跳jump(),用接口实现
*/
// 跳接口
interface Jump {
void jump();
}
// 抽象父类Animal
abstract class Animal {
// 声明属性name
String name;
// 抽象方法eat()
public abstract void eat();
// 抽象方法sleep()
public abstract void sleep();
}
// 声明子类猫继承父类animal并实现接口Jump
class Cat extends Animal implements Jump {
@Override
public void jump() {
System.out.println("I can jump");
}
@Override
public void eat() {
System.out.println("I like eat fish");
}
@Override
public void sleep() {
System.out.println("呼呼呼");
}
}
// 声明子类狗继承父类animal并实现接口Jump
class Dog extends Animal implements Jump {
@Override
public void jump() {
System.out.println("I can Jump,but not height");
}
@Override
public void eat() {
System.out.println("I like eat bone");
}
@Override
public void sleep() {
System.out.println("呼噜噜");
}
}
抽象类和接口的区别
成员变量 :
抽象类 : 可以有变量,可以有常量
接口 : 只能有常量
成员方法 :
抽象类 : 可以有成员方法,可以有抽象方法
接口 : 只能有抽象方法
构造方法 :
抽象类 : 有构造函数,但不能创建对象
接口 : 没有构造函数
设计原则 :
抽象类 : 抽象类和类之间是继承关系,强调继承
接口 : 接口和类之间实现关系,强调拥有或包含
可以修饰属性和方法
类名.成员
进行访问
public class TestS {
public static void main(String[] args) {
// 实例化TestStatic
TestStatic t1 = new TestStatic();
System.out.println(t1.num); // 666
System.out.println(TestStatic.num); // 666
System.out.println(t1.str); // 非静态属性
t1.show(); // 打印静态方法
TestStatic.show(); // 打印静态方法
t1.test(); // 非静态属性
}
}
class TestStatic {
// 声明一个静态的属性
static int num = 666;
// 声明一个非静态的属性
String str = "非静态属性";
String name;
public void setName(String name) {
this.name = name;
}
// public static void setName1(String name) {
// this.name = name; // 静态方法中不能使用this
// }
// 声明一个非静态的方法
public void test() {
// 声明一个局部变量
// static int i=4; // static不能修饰修饰局部变量
System.out.println("非静态方法");
System.out.println(str); // 非静态方法调用非静态属性
System.out.println(num); // 非静态方法调用静态属性
show(); // 非静态的方法可以调用静态的方法
}
// 声明一个静态的方法
public static void show() {
System.out.println("打印静态方法");
System.out.println(num);
// System.out.println(str); // 静态方法无法调用非静态属性
// test(); // 静态方法不能调用非静态的所有成员
}
}
代码块
代码块 :
局部代码块 : 方法中,限制变量的使用范围
狗仔代码块 : 类中、方法之外,执行任何构造方法之前,都必须先执行构造代码块
静态代码块 : 类中、方法之外,只在类加载的时候执行一次,而且仅仅一次
static的优缺点:
类.属性
static在使用时的注意事项
String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象
java把String类声明为final类,不能被继承
String类对象创建后不能修改,由0或多个字符组成,包含在一对双引号之间
String类对象的创建
字符串声明 : String stringName;
字符串创建 : String stringName = new String(字符串常量)
或 stringName = 字符串常量
public class TestString {
public static void main(String[] args) {
// 声明String对象
String str1 = "你好";
// new对象
String str2 = new String("Hello");
System.out.println(str2); // Hello
}
}
获取字符串长度
str.length();
- 包括字符串对象里面的空格字符串通过toCharArray()
转换为字符数组
String str = "1234数字";
char[] c = str.toCharArray();
for(int i=0;i<c.length;i++){
System.out.println(c[i]);
}
indexOf(String s) - **返回字符串s在指定字符串首次出现的索引位置,若找不到返回-1
语法 : str.indexOF(substr)
str 是任意字符; substr是要搜索的字符串
String str="we are family";
int index1=str.indexOf("a"); // 查找str中a的索引
lastIndexOf(String str)
charAt(int index) 获取指定索引位置的字符
语法 :str.charAt(int index)
str: 任意字符串
index : 整数型,用于指定要返回字符的索引下标
String str = "hello world";
char str2 = str.charAt(4);
substring() - 截取字符串
语法 :str.substring(int beginIndex)
利用字符串下标从指定的索引位置开始截取到字符串结尾
str.substring(int beginIndex,endIndex)
指定截取的开始和结束位置,不包括endIndex
String str = "hello world";
String str2 = str.substring(0,5);
trim() - 去除空格
str.trim()
去除字符串前后的空格,而不是字符串内部的空格replace() - 字符串替换
str.replace(char lodchar,char newchar)
将指定的字符串替换成新的字符串
String str = "hello world";
String str2 = str.replace("l","11"); // 会替换全部
大小写转换
将当前所以的字符串中的字符转换大小写
toLowerCase();
toUpperCase();
String str="asdfg";
System.out.println(str.toUpperCase());
package关键字
package com.study.good
import关键字
import 包名
示例 : import com.study.good
final关键字
在java中,为了考虑安全因素,在设计类的时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会再被扩展,那么就设计为final类.它可以修饰类、方法和变量,表示最终的意思,即用它修饰的类|方法和变量后不可改变
特征 :
final修饰的类不能被继承
// 声明一个final类 Person
final class Person {
}
// 声明Student类并集成Person类
//class Student extends Person {
//} // 无法集继承
final修饰的方法不能被子类重写
class Person {
public final void show() {
}
}
// 声明Student类并集成Person类
class Student extends Person {
// public void show() {
// } // final修饰的方法不能被子类重写
}
final修饰的变量是常量,初始化后不能被修改
final int i=2;
索引下标
```java
String str = "hello world";
char str2 = str.charAt(4);
```
substring() - 截取字符串
语法 :str.substring(int beginIndex)
利用字符串下标从指定的索引位置开始截取到字符串结尾
str.substring(int beginIndex,endIndex)
指定截取的开始和结束位置,不包括endIndex
String str = "hello world";
String str2 = str.substring(0,5);
trim() - 去除空格
str.trim()
去除字符串前后的空格,而不是字符串内部的空格replace() - 字符串替换
str.replace(char lodchar,char newchar)
将指定的字符串替换成新的字符串
String str = "hello world";
String str2 = str.replace("l","11"); // 会替换全部
大小写转换
将当前所以的字符串中的字符转换大小写
toLowerCase();
toUpperCase();
String str="asdfg";
System.out.println(str.toUpperCase());
package关键字
package com.study.good
import关键字
import 包名
示例 : import com.study.good
final关键字
在java中,为了考虑安全因素,在设计类的时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会再被扩展,那么就设计为final类.它可以修饰类、方法和变量,表示最终的意思,即用它修饰的类|方法和变量后不可改变
特征 :
final修饰的类不能被继承
// 声明一个final类 Person
final class Person {
}
// 声明Student类并集成Person类
//class Student extends Person {
//} // 无法集继承
final修饰的方法不能被子类重写
class Person {
public final void show() {
}
}
// 声明Student类并集成Person类
class Student extends Person {
// public void show() {
// } // final修饰的方法不能被子类重写
}
final修饰的变量是常量,初始化后不能被修改
final修饰全局变量时,必须初始化赋值 : final int i=2;
final修饰局部变量时,可以先声明,后赋值 : finalint i; i=2;