Java-初级 01

资料来源于各类论坛

Java 复习篇 1

1.基础篇

1.Jvave开发环境

Java应用程序通常被编译为可在任何Java虚拟机(JVM)上运行的字节码

Jdk->Java开发工具包 jre 运行环境 Jvm java虚拟机->转换字节码文件->本地机器码

2.基本数据类型

1.内置

byte -short-int-long float-double boolean char

2.引用

类似CPP的指针->指向了存储的真实地址 -对象 数组

ps:

1.常量-final -指定后无法更改

2.类型转换-大转小-精度丢失--强制转 小转大-自动

3.Jave变量类型

  • 类变量:独立于方法之外的变量,用 static 修饰。-静态存储区-
  • 示例变量:独立于方法之外的变量,不过没有 static 修饰。
  • 局部变量:类的方法中的变量。--堆栈中开辟

什么时候销毁-

4.Java运算符

  • 算术运算符

    +
    -
    *
    /
    ++
    --
  • 关系运算符

    ==
    !=
    >
    <
    >=
    <=
  • 位运算符

    如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即0000 1100
    | 如果相对应位都是 0,则结果为 0,否则为 1 (A | B)得到61,即 0011 1101
    ^ 如果相对应位值相同,则结果为0,否则为1 (A ^ B)得到49,即 0011 0001
    按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 (〜A)得到-61,即1100 0011
    << 按位左移运算符。左操作数按位左移右操作数指定的位数。 A << 2得到240,即 1111 0000
    >> 按位右移运算符。左操作数按位右移右操作数指定的位数。 A >> 2得到15即 1111
    >>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 A>>>2得到15即0000 1111
  • 逻辑运算符

    &&
    | |
  • 赋值运算符

  • 其他运算符

    1.三元运算符

  • variable x = (expression) ? value if true : value if false
    

2.类型比对

String name = "James";
boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真

5.Java输入和输出

System.out.println();
//创建Scanner对象
Scanner input = new Scanner(System.in);

//接受用户的输入
int number = input.nextInt();

6.Java 表达式 语句 代码块

7.Java注释

8. 逻辑控制语句

if -switch

ps-

      int week = 4; 
       String day;
     switch (week) {
            case 1:
                day = "Sunday";
                break;
            default:
                day = "Invalid day";
                break;
        }

9.循环语句

for -for -each -while

for -each

 for (char item: vowels) {
         System.out.println(item);
      }
      //内置迭代器写法

break-跳出循环语句

也就是直接跳出jmp--走到下行代码地址

continue-当前循环跳过语句

10.数组

1.数组

数组是相似类型数据的集合。它是一个容器,用于保存单一类型的数据(值)。例如,您可以创建一个数组,它可以保存100个int类型的值。

data = new Double[10];

2.多维数组

3.数组复制

2.面向对象篇

1.Java类和对象

类--一个抽象的东西--由一些数据类型组成的抽象东西

对象--实例化后在内存中(栈)中开辟的一块空间

2.方法
modifier static returnType nameOfMethod (parameters) {
    // method body
}

方法到底是什么--方法也是抽象的-也只有在程序运行时 转换为字节码文件

call-oxxxxx->这个地址内就存储着我们方法代码转换的字节码文件

3.构造函数

当类的对象被创建时,该构造函数将被自动调用-并且不返回任何值

4.修饰符
  • 访问修饰符
  • 非访问修饰符 static final abstract synchronized -无需锁 transient volatile -无需锁
  • abstract-抽象类和抽象方法定义
5.字符串
String type = "java programming"; 该字符串是String类的实例。--指向了字符串的地址
concat() 将两个字符串连接在一起
equals() 比较两个字符串的值
charAt() 返回存在于指定位置的字符
getBytes() 将字符串转换为字节数组
indexOf() 返回字符串中指定字符的位置
length() 返回指定字符串的大小
replace() 将指定的旧字符替换为指定的新字符
substring() 返回字符串的子字符串
split() 将字符串分成字符串数组
toLowerCase() 将字符串转换为小写
toUpperCase() 将字符串转换为大写
valueOf() 返回指定数据的字符串表示形式
6.this关键字

在Java中,this关键字用于引用方法或构造函数中的当前对象

--this->指向当前对象地址的一个引用-指针

7.final关键字

在Java中,final关键字用于表示常量。它可以与变量,方法和类一起使用。

任何实体(变量,方法或类)一旦被声明final后,只能分配一次。也就是,

  • final变量不能用另一个值重新初始化
  • final方法不能被重写
  • final类不能被继承
8.instanceof关键字

在Java中,instanceof关键字是二进制运算符。它用于检查对象是否是特定类的实例。

9.递归

在Java中,调用自身的方法称为递归方法。并且,此过程称为递归。

递归优点-简单

缺点--疯狂开堆栈--又疯狂置空

3.面向对象下

1.继承 方法重写 super关键字 抽象类和方法

方法重写--重写覆盖

抽象类是无法实例化的类 abstract-抽象方法

继承抽象类的类 必须实习抽象方法

2.接口

interface-接口声明

-implements -实现实现接口类的方法

接口可以继承其他接口

3.多态-方法重载

同一实体(方法,运算符或对象)在不同情况下的行为会有所不同。

多态在汇编中来看-call-函数
这个call是动态计算的-

这也就是动态绑定

在程序执行期间确定将要调用的方法。因此,方法重写是运行时多态。

方法重载
在Java类中,如果参数不同,则可以使用相同的名称创建方法。

也就是编译器。根据参数判断-对呀call

也就是编译阶段把对应call写进去

在方法重写的情况下,方法应该在不同的类中。然而,在方法重载的情况下,方法应该在同一个类中。

方法重写在运行时执行,而方法重载在编译时执行。

向上 子转父 安全
向下 父转子
看范围把

向上 子转父 安全 指针范围调控
向下 父转子 指针范围扩大。访问到不能访问

4.封装

。封装是指将字段和方法绑定在单个类中。

5.嵌套类

另一个类中定义一个类

6.嵌套静态类

//静态嵌套类的对象创建
Animal.Mammal mammal = new Animal.Mammal();

7.Java 匿名类

class outerClass {

//定义匿名类
object1 = new Type(parameterList) {
     //匿名类的主体
};
interface Polygon {
   public void display();
}

class AnonymousDemo {
   public void createClass() {

      //匿名类实现接口
      Polygon p1 = new Polygon() {
         public void display() {
            System.out.println("匿名类的内部。");
         }
      };
      p1.display();
   }
}

class Main {
   public static void main(String[] args) {
      AnonymousDemo an = new AnonymousDemo();
      an.createClass();
   }
}

一个类可以包含另一个称为嵌套类的类。可以在不提供任何名称的情况下创建嵌套类。

没有任何名称的嵌套类称为匿名类。

必须在另一个类中定义一个匿名类。因此,它也被称为匿名内部类

8.单例模式

它确保只创建一个类的实例。

设计模式就像我们的代码库一样,其中包含世界各地程序员共享的各种编码技术。

class Database {
   private static Database dbObject;

   private Database() {      
   }

   public static Database getInstance() {

      //创建对象(如果尚未创建)
      if(dbObject == null) {
         dbObject = new Database();
      }

       //返回单例对象
       return dbObject;
   }

   public void getConnection() {
       System.out.println("现在已经连接到数据库。");
   }
}

class Main {
   public static void main(String[] args) {
      Database db1;

      //引用Database的唯一对象
      db1= Database.getInstance();
      
      db1.getConnection();
   }
}

单例模式
确保只有一个实例化的对象
也就是需要静态方法 返回已经实例好的对象

返回的对象就可以调用该调用的了

9.枚举

enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}

class Size {
public final static int SMALL = 1;
public final static int MEDIUM = 2;
public final static int LARGE = 3;
public final static int EXTRALARGE = 4;
}

代码多用枚举

10.反射

反射允许我们在运行时检查和操作类、接口、构造函数、方法和字段。

Java中有一个名为Class的类,该类在运行时保留有关对象和类的所有信息。

Class对象描述了特定类的属性。该对象用于执行反射。

class 反射-

Class.forName("Dog");
Dog d1 = new Dog()
Class c1 = d1.getClass();
Class c1 = Dog.class;
1.反射作用
1.获取接口 -

我们可以使用Class的getInterfaces()方法来收集类实现的接口的信息。此方法返回一个接口数组

Class obj = d1.getClass();
        
          //查找由Dog实现的接口
          Class[] objInterface = obj.getInterfaces();
          for(Class c : objInterface) {

              //打印接口名称
              System.out.println("Interface Name: " + c.getName());
          }
      }
2.获取超类和访问修饰符

获取超类和访问修饰符
类Class的方法getSuperclass()可用于获取有关特定类的超类的信息。

而且,Class提供了一种getModifier()方法,该方法以整数形式返回class的修饰符。

//找到Dog的超类
           Class superClass = obj.getSuperclass();
           System.out.println("Superclass: " + superClass.getName());
       }
3.反射字段,方法和构造函数

该软件包java.lang.reflect提供了可用于操作类成员的类。例如,

方法类 - 提供有关类中方法的信息

字段类 - 提供有关类中字段的信息

构造函数类 - 提供有关类中构造函数的信息

Java 反射与字段
我们可以使用Field类提供的各种方法检查和修改类的不同字段。

getFields() - 返回该类及其超类的所有公共字段

getDeclaredFields() - 返回类的所有字段

getModifier() - 以整数形式返回字段的修饰符

set(classObject,value) - 使用指定的值设置字段的值

get(classObject) - 获取字段的值

setAccessible(boolean) - 使私有字段可访问

注意:如果我们知道字段名称,则可以使用

getField("fieldName") - 从类返回名称为fieldName的公共字段。

getDeclaredField("fieldName") - 从类返回名称为fieldName的字段。

示例:访问私有字段
import java.lang.Class;
import java.lang.reflect.*;

class Dog {
 private String color;
}

class ReflectionDemo {
public static void main(String[] args) {
   try {
      Dog d1 = new Dog();
      //创建类Class对象
      Class obj = d1.getClass();

      //访问私有字段
      Field field2 = obj.getDeclaredField("color");
     
      //使私有字段可访问
      field2.setAccessible(true);
      //设置color值
      field2.set(d1, "brown");
      // get the value of type converting in String
      String colorValue = (String)field2.get(d1);
      System.out.println("color: " + colorValue);

      //获取color的访问修饰符
      int mod2 = field2.getModifiers();
      String modifier2 = Modifier.toString(mod2);
      System.out.println("modifier: " + modifier2);
   }
   catch(Exception e) {
      e.printStackTrace();
   }
 }
}
输出结果

color: brown
modifier: private
5.反射 方法

Java 反射与方法
像字段一样,我们可以使用Method类提供的各种方法来检查类的不同方法。

getMethods() - 返回该类及其超类的所有公共方法

getDeclaredMethod() - 返回该类的所有方法

getName() - 返回方法的名称

getModifiers() - 以整数形式返回方法的访问修饰符

getReturnType() - 返回方法的返回类型

示例:方法反射
import java.lang.Class;
import java.lang.reflect.*;

class Dog {
   public void display() {
      System.out.println("I am a dog.");
   }

   protected void eat() {
      System.out.println("I eat dog food.");
   }

   private void makeSound() {
      System.out.println("Bark Bark");
   }

}

class ReflectionDemo {
   public static void main(String[] args) {
      try {
          Dog d1 = new Dog();

          //创建一个Class对象
          Class obj = d1.getClass();
          
          //使用getDeclaredMethod()获取所有方法
          Method[] methods = obj.getDeclaredMethods();

          //获取方法的名称
          for(Method m : methods) {
               
             System.out.println("方法名称: " + m.getName());
              
             //获取方法的访问修饰符
             int modifier = m.getModifiers();
             System.out.println("修饰符: " + Modifier.toString(modifier));
              
             //获取方法的返回类型
             System.out.println("Return Types: " + m.getReturnType());
             System.out.println(" ");
          }
       }
       catch(Exception e) {
           e.printStackTrace();
       }
   }
}
输出结果

方法名称: display
修饰符: public
Return type: void

方法名称: eat
修饰符: protected
返回类型: void

方法名称: makeSound
修饰符: private
返回类型: void
6.Java 反射与构造函数

我们还可以使用Constructor类提供的各种方法检查类的不同构造函数。

getConstructors() - 返回该类的所有公共构造函数以及该类的超类

getDeclaredConstructor() -返回所有构造函数

getName() - 返回构造函数的名称

getModifiers() - 以整数形式返回构造函数的访问修饰符

getParameterCount() - 返回构造函数的参数数量

示例:构造函数反射

示例:构造函数反射
import java.lang.Class;
import java.lang.reflect.*;

class Dog {

   public Dog() {
      
   }
   public Dog(int age) {
      
   }

   private Dog(String sound, String type) {
      
   }
}

class ReflectionDemo {
   public static void main(String[] args) {
      try {
           Dog d1 = new Dog();
           Class obj = d1.getClass();

           //使用getDeclaredConstructor()获取一个类中的所有构造函数
           Constructor[] constructors = obj.getDeclaredConstructors();

           for(Constructor c : constructors) {
               //获取构造函数的名称
               System.out.println("构造函数名称: " + c.getName());

               //获取构造函数的访问修饰符
               int modifier = c.getModifiers();
               System.out.println("修饰符: " + Modifier.toString(modifier));

               //获取构造函数中的参数数量
               System.out.println("参数个数: " + c.getParameterCount());
          }
       }
       catch(Exception e) {
           e.printStackTrace();
       }
    }
}
输出结果

构造函数名称: Dog
修饰符: public
参数个数: 0

构造函数名称: Dog
修饰符: public
参数个数: 1

构造函数名称: Dog
修饰符: private
参数个数: 2

11.包

package pkg1[.pkg2[.pkg3…]];

那么它的路径应该是 net/java/util/Something.java 这样保存的。 package(包) 的作用是把不同的 java 程序分类保存,更方便的被其他 java 程序调用。

也就是命名空间 这样变量可以重名

以下是一些 Java 中的包:

java.lang-打包基础的类

java.io-包含输入输出功能的函数

开发者可以自己把一组类和接口等打包,并定义自己的包。而且在实际开发中这样做是值得提倡的,当你自己完成类的实现之后,将相关的类分组,可以让其他的编程者更容易地确定哪些类、接口、枚举和注释等是相关的。

由于包创建了新的命名空间(namespace),所以不会跟其他包中的任何名字产生命名冲突。使用包这种机制,更容易实现访问控制,并且让定位相关类更加简单。

import 关键字
为了能够使用某一个包的成员,我们需要在 Java 程序中明确导入该包。使用 "import" 语句可完成此功能。

3.异常处理

1.异常认识

Java中的异常层次结构

Throwable-根类

Error

Error表示不可恢复的情况,例如Java虚拟机(JVM)内存不足,内存泄漏,堆栈溢出错误,库不兼容,无限递归等

Exception

程序可以捕获并处理异常

当方法内发生异常时,它将创建一个对象。该对象称为异常对象。

它包含有关异常的信息,例如异常的名称和说明以及发生异常时的程序状态。

2.异常处理
try {
  // 代码
} catch (ExceptionType e) { 
  // 捕获块
} finally {
  //finally块
}
3.异常抛出

1.异常层层抛出 throws

accessModifier returnType methodName() throws ExceptionType1, ExceptionType2 … {
  // code
}
import java.io.*;
class Main {
  public static void findFile() throws IOException {
    //可能产生IOException的代码
    File newFile=new File("test.txt");
    FileInputStream stream=new FileInputStream(newFile);
  }

  public static void main(String[] args) {
    try{
      findFile();//内部异常抛出 MAIN捕获
    } catch(IOException e){
      System.out.println(e);
    }
  }
}
2.自动抛出异常
throw throwableObject;
class Main {
  public static void divideByZero() {
    throw new ArithmeticException("试图除以0");
  }

  public static void main(String[] args) {
    divideByZero();
  }
}
import java.io.*;
class Main {
  public static void findFile() throws IOException {
    throw new IOException("文件未找到");
  }

  public static void main(String[] args) {
    try {
      findFile();
      System.out.println("try块中的其余代码");
    } catch (IOException e) {
      System.out.println(e.getMessage());
    }
  }
}
3.try with resources

--释放资源还是自己操作-- 省

try(new的东西)-当有异常自动给你释放掉

4.注解

---Java注解是我们程序源代码的元数据(有关数据的数据)。

它们向编译器提供关于程序的附加信息,但不是程序本身的一部分

@AnnotationName
@AnnotationName(elementName = "elementValue")
@AnnotationName(element1 = "value1", element2 = "value2")
List<@NonNull String> newList;

该声明指定String类型的非空值的列表。

5.日志-Logging-省

Java允许我们通过日志记录过程来创建和捕获日志消息和文件。

在Java中,日志记录需要框架和API。Java在java.util.logging程序包中具有内置的日志记录框架。

我们还可以将第三方框架(如Log4j,Logback等)用于日志记录。

6.断言

Java中的断言通过测试我们认为是正确的代码来帮助检测错误。

使用assert关键字进行断言

-默认关闭需要启用-

启用断言且条件为时true,程序将正常执行。

但是,如果在启用断言时条件计算为false, JVM会抛出AssertionError,程序会立即停止。

class Main {
  public static void main(String args[]) {
    String[] weekends = {"Friday", "Saturday", "Sunday"};
    assert weekends.length==2 : "There are only 2 weekends in a week";
    System.out.println("There are " + weekends.length + "  weekends in a week");
  }
}

总结

匿名 -反射-

posted @   逆向狗  阅读(7)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示