Java知识梳理02|关键字及部分重点作用详解

Java基础知识点梳理 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了掌握好Android打下基础。 阅读详情

一.Java关键字的概念

  • Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。

在这里插入图片描述

二.部分关键字重点作用详解

1.访问控制

在这里插入图片描述

①包结构

在这里插入图片描述

//Person类 当前类
package keyword.keyfunction;
public class Person {
    public String name="张三";
    protected String age="男";
    private int height=178;
    double weight=70;

    public static void main(String[] args) {
        //public 当前类 √
        System.out.println(new Person().name);

        //protected 当前类 √
        System.out.println(new Person().age);

        //private 当前类 √
        System.out.println(new Person().height);

        //default 当前类 √
        System.out.println(new Person().weight);
    }
}
//Doctor类 同一包内
package keyword.keyfunction;
public class Doctor {
    public static void main(String[] args) {
        //public 同一包内 √
        System.out.println(new Person().name);

        //protected 同一包内 √
        System.out.println(new Person().age);

        //private 同一包内 ×
        //System.out.println(new Person().height);

        //default 同一包内 √
        System.out.println(new Person().weight);
    }
}
//Student类 子孙类(同一包)
package keyword.keyfunction;
public class Student extends Person {
    public static void main(String[] args) {
        //public 子孙类(同一包) √
        System.out.println(new Person().name);

        //protected 子孙类(同一包) √
        System.out.println(new Person().age);

        //private 子孙类(同一包) ×
        //System.out.println(new Person().height);

        //default 子孙类(同一包) √
        System.out.println(new Person().weight);
    }
}
//Teacher类 子孙类(不同包)
package keyword.others;
import keyword.keyfunction.Person;
public class Teacher extends Person {
    public static void main(String[] args) {
        //public 子孙类(不同包) √
        System.out.println(new Person().name);

        //protected 子孙类(不同包) ×
        //System.out.println(new Person().age);

        //private 子孙类(不同包) ×
        //System.out.println(new Person().height);

        //default 子孙类(不同包) ×
        //System.out.println(new Person().weight);
    }
}
//Worker类 其他包
package keyword.others;
import keyword.keyfunction.Person;
public class Worker {
    public static void main(String[] args) {
        //public 其他包 √
        System.out.println(new Person().name);

        //protected 其他包 ×
        //System.out.println(new Person().age);

        //private 其他包 ×
        //System.out.println(new Person().height);

        //default 其他包 ×
        //System.out.println(new Person().weight);
    }
}

2.static

①static 静态变量

  • 在类中,使用static修饰的成员变量,就是静态变量,反之为非静态变量。
  • 静态变量属于类的,可以使用类名来访问,非静态变量是属于对象的,必须使用对象来访问。
public class StaticTest {
    public static String name="张三";
    public static void main(String[] args) {
        //使用类名的形式修改静态变量的值
        StaticTest.name="李四";
        //使用类名来访问
        System.out.println("类名形式修改之后类名访问:"+StaticTest.name);
        StaticTest st=new StaticTest();
        //使用对象来访问
        System.out.println("类名形式修改之后对象名访问:"+st.name);
        //使用对象名的形式修改静态变量的值
        st.name="王五";
        System.out.println("对象名形式修改之后对象名访问:"+st.name);
        System.out.println("对象名形式修改之后类访问:"+st.name);
    }
}
//输出结果:
类名形式修改之后类名访问:李四
类名形式修改之后对象名访问:李四
对象名形式修改之后对象名访问:王五
对象名形式修改之后类访问:王五
静态变量值的问题
  • Java中变量主要分为:局部变量、成员变量,而成员变量又分为实例变量和类变量。
public class StaticTest {
	static int i = 6; // 定义静态成员变量
    int n = 0;	
	public static void main(String[] args) { 
		StaticTest t1 = new StaticTest(); // 创建t1对象
		StaticTest t2 = new StaticTest(); // 创建t2对象
 
        t1.n = 100; // 修改t1的变量n的值100
		t2.i = 60; // 修改t2的变量i的值为60
 
		// 使用第一个对象调用类成员变量
		System.out.println("第一个实例对象变量i:" + t1.i); // 输出60
		System.out.println("第一个实例对象变量n:" + t1.n); // 输出100
 
		// 使用第二个对象调用类成员变量
		System.out.println("第二个实例对象变量i:" + t2.i); // 输出60
		System.out.println("第二个实例对象变量n:" + t2.n); // 输出0
	}
}
//输出结果:
第一个实例对象变量i:60
第一个实例对象变量n:100
第二个实例对象变量i:60
第二个实例对象变量n:0
  • 局部变量:在方法内部声明(定义)的变量,只在这个方法内部有效,出了这个方法就无法使用,可以理解为销毁。
    • 比如代码中的 t1 和 t2 ,只在main方法中可用。
  • 实例变量:成员变量中的实例变量,没有使用static关键字修饰的成员变量,随着对象的创建,会在堆空间分配实例变量空间,进行默认赋值。
    • 如代码中的变量 n 。他在每一个实例化的对象中都是独立的,每个对象修改其值后,只是修改该对象自己的这个变量 n ,其他对象的 n 不受影响。用底层的理解就是,每个对象的变量 n 有独立的内存,他们互不影响。
  • 类变量:成员变量中的类变量,是使用static关键字修饰的成员变量。
    • 如代码中的变量 i 。之所以叫做类变量,是因为这个类只有这一个变量 i ,不管实例化多少个对象,他的 i 只有这一个,所以会出现一个对象修改了 i 的值后,其他对象的 i 也跟着变的现象。用底层的理解就是,所有这个类实例化的对象使用的变量 i ,指向的是同一个内存。

②static 静态方法

  • 在类中,使用static修饰的成员方法,就是静态方法,反之为非静态方法。
  • 静态方法数属于类的,可以使用类名来调用,非静态方法是属于对象的,必须使用对象来调用。
public class StaticTest {
    public static String name="张三";
    public static void sayHello(){
        System.out.println("Hello");
    }
    public static void main(String[] args) {
        //使用类名来访问
        StaticTest.sayHello();
        //使用对象来访问
        StaticTest st=new StaticTest();
        st.sayHello();
    }
}
//输出结果:
Hello
Hello

③其他注意事项

  • 静态方法中可以直接调用同类中的静态变量,但不能直接调用非静态变量。如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。
public static String name="张三";
public int age=18;
public static void sayHello(){
    System.out.println("姓名:"+name);
    
    //静态方法不能直接调用非静态变量
    //System.out.println("年龄:"+age);
    
    StaticTest st=new StaticTest();
    System.out.println("年龄:"+st.age);
}
  • 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量。
public static String name="张三";
public int age=18;
public void originalMethod(){
    System.out.println("姓名:"+name);
    System.out.println("年龄:"+age);
}
  • 静态方法中能直接调用静态方法,不能直接调用非静态方法,需要通过对象来访问非静态方法。而在普通成员方法中,能直接调用静态方法和非静态方法。
public static String name="张三";
public int age=18;
public void run(){
    System.out.println(name+"正在跑步");
}

public void originalMethod(){
    //非静态方法调用普通成员方法
    introduce();
    //非静态方法调用静态方法
    run();
}

public static void introduce(){
    System.out.println("=========");
    System.out.println("姓名:"+name);

    StaticTest st=new StaticTest();
    System.out.println("年龄:"+st.age);


}

public static void main(String[] args) {
    //静态方法调用普通成员方法
    StaticTest st=new StaticTest();
    st.originalMethod();
    //静态方法调用静态方法
    introduce();   
}
//输出结果:
=========
姓名:张三
年龄:18
张三正在跑步
=========
姓名:张三
年龄:18
  • 父类的静态方法可以被子类继承,但是不能被子类重写。
public class Person {
    public static void test() {
    	System.out.println("Person");
    }
}
//编译通过,但不是重写
public class Student extends Person {
    public static void test(){
    	System.out.println("Student");
    }
}
//和非静态方法重写后的效果不一样
public static void main(String[] args) {
    Perosn p = new Student();
    p.test(); //输出Person
    p = new Person();
    p.test(); //输出Perosn
}
  • 父类的非静态方法不能被子类重写为静态方法。同理,父类的静态方法也不能被子类重写为非静态方法。
public class Person {
    public void test() {
    	System.out.println("Person");
    }
}
//编译报错
/*
    public class Student extends Person {
        public static void test(){
            System.out.println("Student");
        }
    }
*/

④匿名代码块和静态代码块

  • 代码块因为没有名字,在程序并不能主动调用这些代码块。
  • 匿名代码块是在创建对象的时候自动执行的,并且在构造器执行之前。同时匿名代码块在每次创建对象的时候都会自动执行。
  • 静态代码块是在类加载完成之后就自动执行,并且只执行一次。
  • 注意:每个类在第一次被使用的时候就会被加载,并且一般只会加载一次。
public class Student {
    {
        System.out.println("匿名代码块");
    }
    static{
        System.out.println("静态代码块");
    }
    public Person(){
        System.out.println("构造器");
    }
    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student();
        Student s3 = new Student();
    }
}
//输出结果:
静态态代码块
匿名代码块
构造器
    
匿名代码块
构造器
    
匿名代码块
构造器
  • 匿名代码块的作用是给对象的成员变量初始化赋值,但是因为构造器也能完成这项工作,所以匿名代码块使用的并不多。
  • 静态代码块的作用是给类中的静态成员变量初始化赋值。
public class Animal {
    public static String name="Jeff";
    public int age;
    static{
        name = "Tom";
        //age="17";
    }
    public Animal(){
        name = "Mike";
        age=18;
    }
    public static void main(String[] args) {
        System.out.println(Animal.name);
        //构造器在创建对象的时候自动执行的
        System.out.println(new Animal().age);
        System.out.println(new Animal().name);
    }
}
//输出结果:
Tom
18
Mike

⑤静态导入

  • 静态导包就是Java包的静态导入,用import static代替import静态导入包是JDK1.5中的新特性。意思是导入这个类里的静态方法。
import static java.lang.Math.random;
import static java.lang.Math.PI;
public class Test {
    public static void main(String[] args) {
        //之前是需要Math.random()调用的
        System.out.println(random());
        System.out.println(PI);
	}
}

3.this

①区分局部变量和成员变量

  • 当局部变量和成员变量重名的时候,在方法中使用this表示成员变量以示区分。
public class Test{
   private int a = 0;
   public void thisTest(int a){
      this.a = a; //左侧this.a表示位置1的成员变量a,右侧的表示局部变量a
   }
}

②return this

  • 首先,区分实例,对象和引用。很多人说c就是Cat类的一个实例,这是非常错误的,c就是引用,不是对象!不是实例!我们new出来的这个东西,真正在内存中的这个东西,相当于一个new Cat()叫做一个对象,叫做一个实例。
Cat c = new Cat();
  • return this就是返回当前所用的对象,其实理解的时候也可以理解成返回当前所用的对象的引用
//实现i多次自增之后打印
public class ThisTest {
    int i = 0;
    //increment()通过this关键字返回当前所用的对象的引用,所以很容易对一个对象执行多次操作
    ThisTest increment(){
        i += 2; 
        return this;//返回当前所用的对象或者实例,相当于返回x引用
    }
    void print(){
        System.out.println("i = " + i);
    }
    public static void main(String args[]){
        ThisTest x = new ThisTest();
        //通过x.increment()计算得到i=2,然后返回当前所用的对象的引用,也就是x,随后又可以进行自增打印操作
        x.increment().increment().print();
        //上面这行代码相当于下面两行代码
        /*
        	ThisTest y = x.increment(); 相当于y引用指向new ThisTest()的内存
        	y.increment().print();
        */
    }
}
//输出结果:
i = 4

③this把当前对象传递给其他方法

  • this的意思是当前所用的对象,其实理解的时候也可以理解成当前所用的对象的引用
/*
	1.首先看main函数,new Person创建一个人类,new Apple()此时new了一块内存空间出来,内存中的flag=0.未削皮。调用Person类的eat方法,然后方法的参数中传入new Apple(),此时Apple apple=new Apple(),其中apple为new Apple()这个对象的引用
	2.再看eat方法,eat方法传递的参数是对象的引用也就是apple,为了将传进来的苹果变成削了皮的苹果,调用Apple的getPeeled方法
	3.Apple的getPeeled方法返回的是Peeler类的peel方法所返回的apple引用,而这个传入的this其实就是apple引用
	4.然后创建新的peeled引用指向new Apple()这块内存,并且内存中的flag已经更改,相当于这个苹果已经削了皮
	注意:其实至始至终都是在操作new Apple()这个对象的apple引用,而所操作的内存空间也就是最开始new出来的那块
*/
//实现人吃削了皮的苹果
class Person{
    public void eat(Apple apple){
        Apple peeled = apple.getPeeled();
        System.out.println("Yummy");
    }
}
class Peeler{
    static Apple peel(Apple apple){
        //....remove peel
        apple.flag=1;//表示削了皮
        return apple;
    }
}
class Apple{
    int flag=0;//表示没削皮
    Apple getPeeled(){
        return Peeler.peel(this);
    }
}
public class ThisTest{
    public static void main(String args[]){
        new Person().eat(new Apple());
    }
}
//输出结果:
Yummy

④this可以用于传递多个参数

  • this传递多个参数,其实就是使用this把自身对象作为参数传递给一个工具方法。
public class ParamTest {
    int param1=1;
    int param2=2;

    static void test(ParamTest paramTest){
        System.out.println(paramTest.param1+" "+paramTest.param2);
    }

    void show(){
        test(this);
    }

    public static void main(String[] args) {
        ParamTest p=new ParamTest();
        p.show();
    }
}
//输出结果:
1 2

⑤在构造器中调用构造器需要使用this

  • 一个类有许多构造函数,有时候想在一个构造函数中调用其他构造函数,以避免代码重复,可以使用this关键字。
public class StructureTest {
    private String name;

    public StructureTest(){
        //调用一个参数的构造器,并且参数的类型是String
        this("Tom");//必须放在第一句
        System.out.println("无参构造函数");
    }

    public StructureTest(String name){
        this.name = name;
        System.out.println("姓名:"+name);
    }

    public static void main(String[] args) {
        StructureTest s=new StructureTest();
    }
}
//输出结果:
姓名:Tom
无参构造函数

⑥其他注意事项

//例子1
package keyword.keyfunction;
public class ThisTest {
    private String name;
    public void test(){
        System.out.println(this);
    }
    public static void main(String[] args) {
        ThisTest t1 = new ThisTest();
        ThisTest t2 = new ThisTest();
        t1.test();
        t2.test();
    }
}
//输出结果:
keyword.keyfunction.ThisTest@12a3a380
keyword.keyfunction.ThisTest@29453f44
    
//例子2
package keyword.keyfunction;
public class ThisTest {

    public ThisTest getThisTest(){
        return this;
    }

    public static void main(String[] args) {
        ThisTest s1 = new ThisTest();
        ThisTest s2 = s1.getThisTest();
        System.out.println(s1 == s2);
    }
}
//输出结果:
true

4.super

①静态方法中不能用this和super关键字

  • this代表的是调用本类的对象,super代表的是调用父类的对象,而静态方法是属于类的,不属于对象,静态方法成功加载后,对象还不一定存在。
public class Father {
    public static String name="father";
}
public class Son extends Father {
    public static String name="son";

    public static void main(String[] args) {
        //System.out.println("Father:"+super.name); 报错
        System.out.println("Son:"+name);
    }
}

②子类重写父类的变量

public class Father {
    protected String name = "father";
}
public class Son extends Father {
    private String name = "son";
    public void test(String name){
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
    }
}
public class Test {
    public static void main(String[] args) {
        new Son().test("other");
    }
}
//输出结果:
other
son
father

③子类重写父类的方法

public class Father {
    protected void print(){
        System.out.println("Father");
    }
}
public class Son extends Father {
	//方法重写的时候,子类的权限修饰符必须要大于或者等于父类的权限修饰符
    public void print(){
        System.out.println("Son");
    }

    public void test(){
        print();
        this.print();
        super.print();
    }
}
public class Test {
    public static void main(String[] args) {
        new Son().test();
    }
}
//输出结果:
Son
Son
Father

④super用来调用父类的构造器

  • 子类构造器中会隐式的调用父类的无参构造器
public class Father {
    public Father() {
        System.out.println("父类无参构造");
    }
}
public class Son extends Father {
    public Son() {
        //super() 隐藏着这句代码
        System.out.println("子类无参构造");
    }
}
public class Test {
    public static void main(String[] args) {
        new Son();
    }
}
//输出结果:
父类无参构造
子类无参构造
  • 父类没有无参构造
//例子1
public class Father {
    public Father(String name) {
        System.out.println("父亲:"+name);
    }
}
public class Son extends Father {
    /* 
     	编译报错,子类构造器中会隐式的调用父类的无参构造器,但是父类中没有无参构造器
        public Son() {
            System.out.println("子类无参构造");
        }
    */
}
//例子2
public class Father {
    public Father(String name) {
        System.out.println("父亲:"+name);
    }
}
public class Son extends Father {
    //编译通过
    public Son() {
        super("张三");
        System.out.println("子类无参构造");
    }
}
//注意:不管是显式还是隐式的父类的构造器,super语句一定要出现在子类构造器中第一行代码。所以this和super不可能同时使用它们调用构造器的功能,因为它们都要出现在第一行代码位置。

⑤super和this的区别

  • this:代表本类对象;super:代表父类对象。

  • this:在非继承的条件下也可以使用;super:只能在继承的条件下才能使用。

  • this:调用本类的构造方法;super:调用的父类的构造方法

5.final

①final修饰类

  • 用final修饰的类不能被继承,没有子类。
public final class Father{
}
//编译报错
public class Son extends Father{
}

②final修饰方法

  • 用final修饰的方法可以被继承,但是不能被子类的重写。
public class Father{
    public final void print(){}
    }
}
//编译报错
public class Son extends Father{
    public void print(){
    }
}
  • 用final修饰的变量表示常量,只能被赋一次值.其实使用final修饰的变量也就成了常量了,因为值不会再变了。

③final修饰局部变量

//例子1
public class FinalTest {
    public void print(){
        final int a;
        a = 1;
        //编译报错,不能再次赋值
        //a = 2;
    }
}

//例子2
public class FinalTest {
    /*
        public void print(final int a) {
            //编译报错,不能再次赋值,传参的时候已经赋过了
            a = 1;
        }
    */
}

④final修饰成员变量

  • final修饰成员变量时,该成员变量必须在创建对象之前进行赋值,否则编译失败。
修饰非静态成员变量
public class FinalTest{
    //编译失败
	//private final int a; final修饰成员变量,该成员变量必须在创建对象之前进行赋值,否则编译失败
    
    //用final修饰成员变量时,只有一次机会,可以给此变量a赋值,有以下几种赋值方法
    //方法1 声明的同时赋值 private final int a=0;
    
    //方法2 匿名代码块中赋值
    /*
    	private final int a;
        {
            a=0;
        }
    */
    
    //方法3 构造器中赋值(类中出现的所有构造器都要写) 代码实现方法3
    private final int a;
    //类中出现的所有构造器都要写
    public FinalTest(int a) {
        this.a = a;
    }
    public FinalTest(){
        int a=3;
        this.a=a;
        /*
        	如果加上这两句就报错了,因为只有一次机会,可以给此变量a赋值
        	int b=4;
        	this.a=b;
        */
    }
    public static void main(String[] args) {
        FinalTest f1=new FinalTest();
        FinalTest f2=new FinalTest(2);
        //这里并不是final修饰的a被赋值多次,而是new了两个内存空间出来,每个内存空间的final修饰的a有且仅被赋值1次
        System.out.println(f1.a+" "+f2.a);
    }
}
//输出结果:
3 2
修饰静态成员变量
public class Person{
	private static final int a;
}

//和非静态成员变量同理,只有一次机会,可以给此变量a赋值,有以下几种赋值方法
//方法1 声明的同时赋值
//方法2 静态代码块中赋值
修饰引用变量
public class FinalTest {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public static void main(String[] args) {
        final FinalTest f=new FinalTest();
        f.setName("张三");
        f.setName("李四");
        System.out.println(f.getName());//输出结果:李四
        
        //编译报错,不能修改引用s指向的内存地址
        //f=new FinalTest();
    }
}

6.abstract

①抽象类和抽象方法的关系

  • 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
  • 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。
  • 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
public abstract class Action{//抽象类
	public abstract void doSomething();//抽象方法
}

7.interface

①接口中的方法和变量

  • 接口中的方法都是抽象方法。接口中的变量都是静态常量(public static final修饰)
public interface Behavior{
    public static final String NAME = "jasper";
	//默认就是public static final修饰的
	int AGE = 18;
    
	public abstract void run();
	//默认就是public abstract修饰的
	void eat();
	public void sleep();
}

②一个类可以实现多个接口

public interface A {
    public abstract void run();
}

public interface B {
    public abstract void sleep();
}
//Student需要实现接口A,B中所有的抽象方法
//否则Student类就要声明为抽象类,因为有抽象方法没实现
public class C implements A,B{
    @Override
    public void run() {
        System.out.println("run");
    }

    @Override
    public void sleep() {
        System.out.println("sleep");
    }
}

public static void main(String[] args) {
    A a=new C();//A只能调用接口A中声明的方法以及Object中的方法
    B b=new C();//B只能调用接口B中声明的方法以及Object中的方法
    a.run();
    b.sleep();
    
    if(a instanceof B){
		((B)a).sleep();
	}
}
//输出结果:
run
sleep
sleep

③一个接口可以继承多个父接口

public interface A{
    public void testA();
}
public interface B{
    public void testB();
}
//接口C把接口A,B中的方法都继承过来了
public interface C extends A,B{
	public void testC();
}

//Student相当于实现了A B C三个接口,需要实现所有的抽象方法
//Student的对象也就同时属于A类型 B类型 C类型
public class Student implements C{
    public void testA(){}
    public void testB(){}
    public void testC(){}
}

public class Teacher{
    
}

public static void main(String[] args) {
    C o = new Student();
    System.out.println(o instanceof A);//true
    System.out.println(o instanceof B);//true
    System.out.println(o instanceof C);//true
    System.out.println(o instanceof Student);//true
    System.out.println(o instanceof Object);//true
    System.out.println(o instanceof Teacher);//false
    //编译报错
    System.out.println(o instanceof String);//String类final修饰
    //System.out.println(o instanceof X);
    //如果o是一个接口类型声明的变量,那么只要X不是一个final修饰的类,该代码就能通过编译,至于其结果
	//是不是true,就要看变量o指向的对象的实际类型,是不是X的子类或者实现类了
}
韩顺平零基础Java(超详细笔记梳理) 07——面向对象编程基础(下):方法重载、可变参数、作用域、构造器、this关键字 受篇幅限制,面向对象的笔记我分成了上下部分,本篇文章是韩顺平老师课程P227-P261(第七章:面向对象编程基础)下半部分重点内容的详细总结,内容为:方法重载(overload);可变参数;作用域;构造器;this关键字的使用 阅读详情

相关推荐

最强Java并发编程详解:知识点梳理,BAT面试题等

本文原创更多内容可以参考: Java 全栈知识体系。如需转载请说明原处。 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解并发理论基础和线程基础,并发关键字等,这些是你理解Java并发框架的基础。@pdai Java 并发 - 知识体系 Java 并发 - 理论基础 多线程的出现是要解决什么问题的? 线程不...

pdai的博客 1187

Java 关键字及其作用(保留字)

java关键字总览表: 除了上述关键字,Java还有以下保留字:true,false,null Java中的名称命名规范: 包名...

weixin_43194330的博客 1615

[捷稀 JCG Q30 Pro 刷机说明] 以刷入openwrt24.10为例

摘要: 本文详细介绍了捷稀JCG Q30 Pro路由器刷入OpenWrt 24.10系统的步骤。通过先刷入OpenWrt 23.05过渡固件,再升级Uboot,最后通过TFTP加载工厂镜像完成刷机。关键步骤包括解锁分区、刷写Uboot、进入恢复模式及配置网络。文章还提供了无线设置、Tailscale内网穿透等进阶命令,并附参考文档和固件下载链接。适用于有一定技术基础的玩家,需注意操作风险,严格按流程执行。

贤时间 7138

Java 内存模型的组成和各部分的作用

1、先了解一下堆(heap)和栈(stack) 堆和栈都是存在于内存中的两块不同区域,他们都是用于存放数据,不同之处只是在于特性不一样。 1)栈 存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。例如: 一种是基本类型(primitive types), 共有8种,即...

qq_32401031的博客 1085

51单片机STC8G1K08驱动ws2812记录

使用51单片机控制17个2812灯,这里选择STC8芯片,最大频率可以达到35M,参考网上的各种文章案例,使用定时器做的时候实测做不到规格书要求的245-345ns,STC8G1K08不带PWM,所以只能使用nop来做,好在单片机在这里只有做编程灯的功能,省略测试过程,下面是程序,使用的是24MHz内部晶振 //设置一个灯珠 void SendOnePix(unsigned char *ptr) { unsigned char i,j; unsigned char temp; fo...

的博客 7320

ESP32S3与ILI9341 LCD屏LVGL移植实战:从零构建嵌入式GUI界面

本文详细介绍了如何在ESP32S3平台上移植LVGL图形库并驱动ILI9341 LCD屏幕,从硬件选型、开发环境配置到显示驱动实现和内存优化。通过实战案例讲解移植过程中的关键步骤和常见问题解决方案,帮助开发者快速构建嵌入式GUI界面。

h9j8k7l6m5n的博客 1097

Java学习总结——Java程序的各部分要素详解

叁——Java程序要素概览 一、感性认知Java程序 1.认识Java程序的框架 (1)大括号、段及主体 将类名称定出之后,就可以开始编写类的内容。左大括号“{”为类的主体开始标记,而整个类的主体至右大括号“}”结束。每个命令语句结束时,都必须以分号“;”做结尾。当某个命令的语句不止一行时,必须以一对大括号“{}”将这些语句包括起来,形成一个程序段(segment)或是块(block)。 ...

原来是松松呀~ 1190

实战指南!基于STM32的智能环境监测系统(代码+硬件设计+云端控制)

本文详细介绍了基于STM32的智能环境监测系统的设计与实现,包括硬件选型、电路设计、软件架构和云端控制。系统通过DHT11温湿度传感器和MQ-2烟雾传感器实时监测环境数据,STM32F103C8T6主控芯片处理数据并通过ESP8266上传至中国移动物联网平台,支持手机APP远程监控。项目成本低、稳定性高,适合智能家居和环境监测应用。

weixin_29194817的博客 433

java程序各个组成部分

一.数据 1.标识符和关键字 标识符:http://baike.baidu.com/view/6216763.htm 关键字:http://baike.baidu.com/view/1849120.htm 记: 1.Java标识符由数字,字母和下划线(_),美元符号($)组成。在Java中是区分大小写的。而且还要求首位不能是数字。最重要的是,Java关键字不能当作Java标识符。

一知半解 1758

光学仿真案例(1) 铌酸锂非线性波导仿真模拟 FDTD仿真

在过去几年里,许多集成光子学应用往往需要多个相干可调谐光源,而且从外部激光器引入额外的光输入增加了芯片封装的复杂性,如果使用基于III-V族、氮化硅(SiN)或铌酸锂(LNO)的集成光源又大大增加了制造复杂性和成本。然而,通过非线性谐波相互作用产生的光源不需要额外的制造工艺来产生增益、反馈和外部电路,即可支持许多应用。在下面的案例中,演示了一种基于Luo[1]的铌酸锂波导频率转换集成系统。该案例主要仿真了利用温度调制实现高效相位匹配的铌酸锂纳米光子波导的二次谐波产生。

q895235273的博客 4145

如何在 DevOps 管道中实现 AI?

AI与DevOps的融合(AIOps)正在重塑软件开发生命周期。本文系统阐述了AI在DevOps中的五大应用场景:智能监控、自动化测试、安全防护、CI/CD优化和事件管理,并提出了六步实施框架:痛点识别、工具选型、流程集成、智能监控、MLOps和治理合规。通过Netflix、Google等企业的实践案例,验证了AI在提升部署效率(降低40%故障率)、缩短问题解决时间(MTTR减少60%)方面的显著价值,同时指出数据质量、模型偏差等实施挑战。研究表明,战略性地

介绍AWS Azure GCP devops Terraform 等技术 497

Java基础知识点梳理(详细)

Java基础知识点全面梳理(详细)

程序员小辰的代码小窝 9万+

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的危险物品检测系统(深度学习模型+PySide6界面+训练数据集+Python代码)

随着公共安全需求的日益增长,危险物品检测技术在社会安防、交通安检等领域发挥着重要作用。本文介绍了一个基于YOLO系列深度学习框架的危险物品检测系统,集成了YOLOv8、YOLOv7、YOLOv6和YOLOv5四种先进的物体检测算法。系统采用PySide6开发了用户友好的图形界面,提供了完整的训练代码、预训练模型和数据集构建方案。实验结果表明,该系统在危险物品检测任务上实现了高精度和高实时性,为实际应用提供了可靠的技术支持。

YOLO 156

Java 并发编程知识点梳理

AbstractOwnableSynchonizer 为抽象类,可以由线程以独占方式拥有的同步器。此类为创建锁和相关同步器(伴随着所有权的概念)提供了基础。AbstractOwnableSynchronizer 类本身不管理或使用此信息。但是,子类和工具可以使用适当维护的值帮助控制和监视访问以及提供诊断。AbstractQueuedLongSynchronizer 为抽象类,以 long 形式维护同步状态的一个 AbstractQueuedSynchronizer 版本。

qq_24907431的博客 1642

MGC3130 3D手势识别传感器原理图设计,已量产(交互传感器)

最近在落地一款互动艺术装置的控制模块,选了 Microchip 的 MGC3130 做核心 —— 这颗芯片算是 GestIC® 近场传感技术的 “熟面孔” 了,把 3D 手势识别、运动跟踪的信号处理都集成在一颗芯片里,0-10cm 的检测距离刚好适配桌面级互动场景,挥挥手就能控设备的体验,放在艺术装置里确实很出效果。今天扒一下实际跑通的原理图,聊聊每个模块的设计思路。

不脱发的程序猿 371

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java并发编程详解-知识点梳理

知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解并发理论基础和线程基础,并发关键字等,这些是你理解Java并发框架的基础。@pdai Java 并发 - 知识体系 Java 并发 - 理论基础 多线程的出现是要解决什么问题的? 线程不安全是指什么?举例说明 并发出现线程不安全的本质什么?可见性,原子性和有序性。 Java是怎么解决并发问题的?3个

风水道人 504

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java基础知识梳理

一个Java文件中可以定义多个类,但是最多只能有一个类被public修饰,并且这个类的类名与文件名必须相同。若这个文件中没有public的类(也可以一个也没有),则文件名随便是一个类的名字即可。需要注意的是,当用javac指令编译有多个类的Java文件时,它会给每一个类生成一个对应的.class 文件。定义:成员方法是在类中定义的,不属于类本身,而是属于类的实例(对象)。它们操作对象的状态(属性)。语法访问修饰符 返回类型 方法名(参数列表) {// 方法体调用:通过类的实例(对象)来调用。

m0_72947273的博客 2100

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java-部分知识点梳理及汇总

Java-部分知识点梳理及汇总

qq_52998673的博客 375

JVM16个知识点梳理&JMM重点

文章目录JVM0 面试题0.0 知识点 JVM 0 面试题 1、请你谈谈对JVM的理解 2、java8虚拟机和之前的变化更新? 3、什么是OOM,什么是栈溢出StackOverFlowError?怎么分析 4、JVM的常用调优参数有哪些? 5、内存快照如何抓取,怎么分析Dump文件?知道吗? 6、谈谈JVM中,类加载器你的认识? rt-jar等 7、补充:new一个对象的内存分析 0.0 知识点 1、JVM的位置 2、JVM的体系结构 3、类加载器 作用:加载

ThetaQing的博客 521

Java 语言知识结构梳理

当 Java 提供的异常类不能满足需求时,可以自定义异常类,通常继承 Exception 或 RuntimeException 类。

Toroto5的博客 992

EVA-02模型助力Java面试准备:八股文知识点梳理与模拟问答

本文介绍了如何利用星图GPU平台自动化部署🔴 EVA-02: TEXT RECONSTRUCTION TERMINAL镜像,构建Java面试智能助手。该方案能高效梳理零散的Java八股文知识点,并通过模拟问答进行查漏补缺,帮助开发者系统化准备技术面试,提升复习效率。

weixin_34438187的博客 289

Java中“this”关键字梳理详解

Java中的this区分同名变量:解决实例变量与局部变量或参数的命名冲突。构造器调用:在构造器中调用同一类的其他构造器。传递当前对象:将当前对象作为参数传递给其他方法。方法链调用:通过返回this实现流畅的链式调用。限制:不能在静态方法中使用。通过上述代码示例和场景分析,this的作用和用法应该已经非常清晰。它不仅是Java面向对象编程的核心概念之一,也是编写清晰、可维护代码的重要工具。

cuijiying的博客 1805

MySQL知识点梳理 万字超详解

文章目录MySQL数据库分类SQL分类数据库的基础操作常用数据类型表的操作MySQL表的增删查改(基础)增加操作查询(Retrieve)order by 排序别名去重 distinct条件查询 where分页查询修改update删除 deleteMySQL增删查改(进阶)null约束unique唯一约束DEFAULT:默认值约束PRIMARY KEY:主键约束FOREIGN KEY: 外键约束CHECK约束(了解)数据库表的设计一对一一对多多对多新增聚合查询聚合函数GROUP BY子句HAVING联合查询

weixin_59551524的博客 7894

java知识点梳理-基础部分

梳理java知识点基础部分核心内容,概要记录重点,温故而知新。

风儿甚是喧嚣的博客 306

java关键字梳理

学了将近两年的java,从用java的GUI图形界面编程到利用MVC模式开发项目,其中不乏用到java中各种关键字,于是将java中到各种关键字收集了一下(阐述一下各种关键字到用法,有说的不对的地方希望各位可以评论指出): 1.访问控制 1)private 私有的 private关键字是访问控制修饰符,可以应用于类、方法或字段(在类中声明的变量)。只能在声明private(内部)类

linhao 911

关于java重点知识点

JVM作为java运行的基础,很难相信对于JVM一点都不了解的人可以把java语言吃得很透。jvm不是唯一决定技术能力好坏的面试问题,但是可以佐证java开发能力的高低。 在JVM这个大类中,需要掌握的知识有: JVM内存模型和结构 GC原理,性能调优 调优:Thread Dump, 分析内存结构 class 二进制字节码结构, class loader 体系 , class加载

cfbfvshrhgftuy的博客 2648
上一篇: Java异常|异常体系结构和处理机制
下一篇: Java知识梳理03|内部类详解
I'm Jasper
博客等级 码龄8年 4粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值