java基础知识
文章目录
打开CMD的方式
1.Win + R 输入cmd
2.Win + S 输入cmd
3.按住shift键 同时点击鼠标右键,打开powershell 窗口
常见的DOS命令
#盘符切换 D:
#查看目录下的所有文件 dir
#切换目录 cd (charge directory) 同盘进入目录
cd /d D: 实现跨盘跳转
cd.. 实现返回上一级目录
#清理屏幕 cls (clear screen)
#退出终端 exit
#查看IP地址 ipconfig
#打开记事本 notepad
#打开计算机 calc
#打开画图 mspaint
#获取网站的iP地址 ping
#鼠标右键可以直接将 剪切板的内容 复制到 cmd 窗口
#创建文件夹 md test //表示创建一个名为test的文件夹
#删除文件夹 rd test //表示删除一个名为test的文件夹
#创建文件 cd> a.txt // 表示再当前目录下创建一个a.txt文件
#删除文件 del a.txt //表示删除当前目录下的a.txt文件
JDK,JRE,JVM
JDK : Java Development Kit
JRE : Java Runtime Environment
JVM : Java Virtual Machine
java架构
删除JDK
引用
- 删除java jdk 安装目录 ,可以到环境变量javahome中查看.
- 删除JJAVA _HOME 环境变量
- 删除PATH下有关于Java的环境变量
- 再DOS窗口中用 java -version 命令检查
java程序运行机制
java 兼具以下两种特性
- 编译型 如 C / C++ javac 将.java文件 -> 到.class文件 的过程是编译
- 解释型 如java javaScript
程序运行机制
标识符
javadoc
- 编写java 程序时可以使用/** */ 注释来书写Javadoc文档。
- 找到对应Java 源文件所在目录,打开cmd
- 在cmd中输入
javadoc -encoding UTF-8 -charset UTF-8 文件名.java
命令执行 - 之后会在目录中生成index.html网页文件,打开就是在个java文件所在的包的说明文档
java 数据类型
-
基本数据类型
一共八大基本数据类型:int byte short long float bouble char bealen
-
引用数据类型
一些类和一些构造器
Java选择结构
之前学过java 基础语法,我就记一些不牢的知识点
switch语句
从Java SE 7开始,java 支持 switch case 的字符串比较
string name = "微风";
switch(name){//()中的表达式可以是字符串
case "2001":
case "微风":
default :
}
java方法的可变传参
/*
当我们在写方法时,有时是不能确定要传什么参数,或是几个参数的
不知道要传的有几个同样类型的参数时,可以用以下方法:(类似于传一个数组
注意:一个方法最多只能有一个可变参数,并且要放在参数列表的最后面
*/
public static void main(String[] args){
int[4] num = {1,3,4,56,6};
test(num);
}
public static void test(int... i){//这里相当于传了一个int 类型的数组i
println(i[0]);//输出传入方法的第一个参数
println(i.length);//输出传入的参数的个数
}
基础数据结构
数组
//静态初始化 只声明 不赋值
//方法1
int[] nums = new int[10];//声明一个元素个数为10的数组
//方法2
int nums[10];
//方法3
int[] nums;//在栈中开辟空间存储,
nums = new int[10];//在堆中开一整块空间,用于存放10个int类型
int len = nums.length;//可以获取数组长度
//动态初始化 再声明的同时赋值
int[] nums = {1,2,3};
//默认初始化
//由于数组是一种引用类,其每一个元素都是类的实例变量,因此数组一经分配空间,就会按照示例变量的方式隐式初始化
//默认每个元素被初始化为零
面向对象思想:抽象
继承
IDEA中的两个快捷键:
ctrl + insert
可以自动构造,有参无参构造函数
ctrl + h
可以打开当前类的父子关系树状图
this();
可以调用本类的构造函数
super()
可以调用父类的构造函数
调用构造子类的构造函数是回默认隐式地调用父类的无参构造函数,但是在实际运用中,一般是显式调用父类的有参构造函数
函数重写
函数重写对于静态和非静态函数有很大的区别
-
对于静态函数
class A{ public static void test(){ System.out.println("A=>test()"); } } class B extends A{ public static void test(){ System.out.println("B=>test()"); } } class Application{ public static void main(){ A a = new A(); a.test(); B b = new A(); b.test(); //输出为A=>test() B=>test() //原因:static 方法在静态方法区中 a 和 b 调用的是类的方法 } }
-
对于动态函数
class B{ public static void test(){ System.out.println("A=>test()"); } } class A extends B{ public void test(){ System.out.println("B=>test()"); } } class Application{ public void main(){ A a = new A(); a.test(); B b = new A();//此时A类强制转换为B类,但是非静态方法test()已经被重写了.调用时仍然会调用子类A的方法 b.test(); //输出为A=>test() A=>test() //原因: a 和 b 调用的是对象的方法 } }
函数重写总结:
-
只用非静态方法才能重写成功,并且,子类重写父类的方法时,方法名 和 参数列表 要相同
-
修饰符范围可以扩大,但不能缩小,public > protected > default(缺省) > private
-
抛出的异常可以缩小,但是不能放大
多态
多态:同一方法可以根据发生对象的不同而产生不同的行为。
preson s = new student();
父类的引用指向子类,子类继承父类的全部方法- 对象能执行哪些方法,看的是s 到底是哪个类型,父类虽然指向子类,但是不能调用子类的方法
- 转换 子类->父类 可以隐式地转,父类 -> 子类 需要显式的强制转换,而且要有父子关系的类之间才可以转换,要不然会抛出异常ClassCastException
- static 方法属于类,final 常量,在常量池中的 ,private
instanceof
System.out.println(Person instanceof Student)
可以判断Person 类与 Student 之间是否有父子关系
多态总结
- 父类指向子类的对象
- 把子类转换为父类,向上转型,会丢失一些方法和属性
- 把父类转为子类,向下转型,强制转换
- 方便方法的调用,减少代码的重复
static 关键字
static 修饰属性,修饰方法
class Student{
private static int age;
// 静态变量,在静态方法区中,又叫类变量,可以直接用类名调用Student.age
//非静态方法和静态方法都可以直接访问静态方法
// 因为静态方法在 类 加载的时候就会分配内存空间,被加载到静态方法区中
//而静态方法不能直接调用非静态方法
// 因为可能在调用非静态方法的时候,该方法还没有被加载,非静态方法是在对象被创建的时候分配内存空间的
private double score;//静态变量
public static void go(){
System.out.println("go");
}
public void run(){
System.out.println("run");
}
}
静态代码块
public class Demo01 {
public static void main(String[] args) {
Student s = new Student();
}
}
class Student{
{
System.out.println("匿名代码块");//第二执行,且每次创建对象时都会执行
}
static{
System.out.println("静态代码块");//第一执行,且只执行一次
}
public Student() {
System.out.println("构造方法");//第三执行,且每次创建对象时都会执行
}
}
静态导入包
import static java.lang.Math.random;
import static java.lang.Math.PI;
public class Demo01 {
public static void main(String[] args) {
System.out.println(random());//原本是不能直接调用random()方法,要用Math.random()
System.out.println(random());
System.out.println(PI);
}
}
abstract修饰字
public abstract class Action {
//抽象类,可以有一些抽象方法,这些方法不用抽象类自己实现,一般由子类实现,除非子类也为抽象类
public abstract void doSomething();//抽象方法没有方法体
}
- 抽象类不能
new
出来 - 抽象类中可以有正常的方法,但是抽象方法一定要存放在抽象类中
- 一般通过
extends
继承起作用
接口 interface
package Demo03;
//接口1
//接口中也可以定义属性
public static final int AGE;
public interface TimeService {
void timer();
}
package Demo03;
//接口2
public interface UserService {
public abstract void run();//接口中的方法默认是public abstract
void add();
void delete();
void updata();
}
package Demo03;
//接口1,接口2的实现类
//注意:实现一个接口就要实现这个类的全部abstract 抽线方法
//而且一个文件中只能有一个public 类(包括正常类,抽象类)
//可以利用接口实现多继承
public class UserServiceImpl implements UserService,TimeService{
@Override
public void run() {
}
@Override
public void timer() {
}
@Override
public void add() {
}
@Override
public void delete() {
}
@Override
public void updata() {
}
}
接口的作用
- 约束
- 定义一些方法,有不同的实现
public abstract
定义抽象方法public static final
用于声明接口中的常量- 接口不能被实例化,接口中没有构造方法
implements
可以实现多个接口- 要实现一个接口必须要实现接口中的所有方法
内部类
非静态内部类
package Demo04;
public class Outer {
private int id = 10;
private void out(){
System.out.println("This is a external class method");
}
public class Inner{//定义一个内部类
public void in(){
System.out.println("This is a inner class method");
}
//通过内部类获取外部类中的私有属性
public void GetID(){
System.out.println(id);
}
}
}
package Demo04;
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
//通过这个外部类来实例化内部类
Outer.Inner inner = outer.new Inner();
//确定对象类型 对象名 = 已实列化外部类.内部类构造方法
inner.in();
inner.GetID();
}
}
静态内部类
package Demo04;
public class Outer {
private int id = 10;
private void out(){
System.out.println("This is a external class method");
}
public static class Inner{//定义一个静态内部类,外部类被加载时就会被加载
public void in(){
System.out.println("This is a inner class method");
}
//不能通过内部类获取外部类中的私有属性
//public void GetID(){
// System.out.println(id);
//}
}
}
局部内部类
package Demo04;
public class Outer {
private int id = 10;
private void out(){
class Inner{
//局部内部类
}
System.out.println("This is a external class method");
}
}
匿名内部类
public class HelloWorldAnonymousClasses {
/*
包含两个方法的HelloWorld接口
*/
interface HelloWorld {
public void greet();
public void greetSomeone(String someone);
}
public void sayHello() {
// 2、匿名类实现HelloWorld接口
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde";
public void greet() {
greetSomeone("tout le monde");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
}
}
异常(Exception)
java 会把error 和 exception 当成一种对象来处理
Exception 与 error 的区别:
error是灾难性的致命的的错误,是程序无法控制和处理的,当error 产生式是,java的虚拟机(JVM)会直接选择终止线程。
Exception 通常情况下是可以被程序处理的,并且在程序中要尽可能地处理这些异常。
异常捕获
用try catch finally
语法来捕获异常
package Demo05;
public class test01 {
public static void main(String[] args) {
try {//用try 捕获异常后程序不会停止,会继续向下运行
new test01().test(1,0);
}catch (ArithmeticException e){
e.printStackTrace();
}
}
public void test (int a,int b) throws ArithmeticException{
if(b == 0){
throw new ArithmeticException();
}
}
}
Tips :IDEA 快捷键 ctrl + alt + t 可以快速生成一些代码,将选中地代码直接包裹住。
e.preintStackTrace()
可以打印异常
可以用 throw Exception
主动在方法里抛出一些异常
package Demo05;
public class test01 {
public static void main(String[] args) {
new test01().test(1,0);
}
public void test(int a,int b){
if(b == 0){//可以用 `throw Exception` 主动在方法 里 抛出一些异常
throw new ArithmeticException();
}
}
}
可以用 throws Exception
主动在方法上抛出一些异常
package Demo05;
public class test01 {
public static void main(String[] args) {
new test01().test(1,0);
}
public void test (int a,int b) throws ArithmeticException{
if(b == 0){//可以用 `throw Exception` 主动在方法 里 抛出一些异常
throw new ArithmeticException();
}
}
}
自定义异常
-
自己写一个自定义类,继承Exception
package Demo06; public class MyExcetion extends Exception{ private int detail; public MyExcetion(int a){ this.detail = a; } @Override public String toString() {//打印异常信息时,会自动调用该方法 return "MyExcetion{" + "detail=" + detail + '}'; } }
-
假设一个会抛出异常的方法
-
用
try catch
语句包裹住可能抛出异常的方法public class test { public static void main(String[] args) { try{ test(11); } catch (MyExcetion e) { System.out.println("MyException=>" + e);//会调用toString()方法 } } static void test(int a) throws MyExcetion { if(a > 10){ throw new MyExcetion(a); } else{ System.out.println("Ok"); } } }