java学习
开始学习java啦(悲)
java语法 1.1java的运行方式 Java编译器将准备好的源文件编译成了class文件,真正被执行的应该是class文件。此时将class文件放入到类加载器,放在Jvm中进行。字节码校验器来进行代码的校验,校验完成若没有了错误,此时的解释器便开始工作将我们的程序解释给操作系统从而进行解读.
1.2第一个java程序 1 2 3 4 5 6 7 public class hello { public static void main (String[] args) { System.out.print("hello\n" ); System.out.println("20" ); System.out.println("3.21" ); } }
在这里需要建立一个java文件名为hello.java和public class 后面的hello相同
1.3数据类型
1.4数据强制转换 byte,short,char-》int-》long-》float-》double
代码需要进行处理不能够自动的完成转换。
格式:(范围小的类型)+范围小的变量名=(范围小的类型)+原本范围大的数据
比如int a=100l会报错,因为不能string转换为int
需要使用如下的写法
1 2 3 4 5 int a=(int ) 100a;byte a = (byte ) 200 ;System.out.println(a);
2.1 print和println的区别
print命令不会在末尾添加换行符,会将输出内容连续打印在同一行上。
println命令会在末尾添加换行符,将每个输出内容放在一个新的行上。
2.2常量和变量 使用final 常量=值
包括
(1)字符串常量:凡是用双引号引起来的量:如“ABC” “Hellow” “123”
(2)整数常量:无小数点的数字:如1 -100 0
(3)浮点型:直接写上的数字,有小数点:如2.5 -3.14 0.0
(4)字符常量:凡是用单引号引起来的单个字符:如‘A’ ‘b’ ‘1’ ‘中’
(5)布尔常量:只有量中取值:如 true false
(6)空常量:null 代表没有任何的数组
使用变量
数据类型+变量名=值
2.3变量的作用域 1.类变量
static的关键字+变量类别+变量名称
随着类的出现而出现
2.实例变量
写在类的里面,方法的外面
通过这个类才能使用
3.局部变量
写在方法里面的变量,必须初始化和声明值
以下为实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class hello { static long ctf=114514 ; int web; int study; public static void main (String[] args) { int name1= (int ) 100l ;局部变量 System.out.println(name1); hello hello=new hello (); hello.web=(int )1919810 ; hello.study=996 ; System.out.println(hello.web); System.out.println(ctf); add hc=new add (); System.out.println(hc.yhh); } } class add { int yhh=114 ; }
3.1运算符 算数运算符号 / * - + %(mod)
赋值运算符 =,+=,-=,*=,/=
和c语言类似,但是只有变量才能使用赋值运算符号
关系运算符 <,>,<=,=>,==,!=
结果是一个bool型的结果,只有true和false
逻辑运算符号 &&与,||或,!非
(含义同数电..害…..数电)
&&和||有短路的特点,
&&左边为false时不计算右边,||左边为true是不计算右边
(突然想起select 1 and 0 and 1,果然语言都是相同的)
3.2自增自减 ++,–,同c
3.3 ++a和a++ 区别同c语言里面的++a和a++
4.1scanner 使用之前需要引入对应的类sacnner类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import java.util.*; public class hello { public static void main (String[] args) { Scanner scanner = new Scanner (System.in); String src = scanner.nextLine(); System.out.println("here is the input data " +src); scanner.close(); } } class add { int yhh=114 ; }
4.2判断接下来有无输入 1 2 3 4 if (scanner.hasNext()){ src=scanner.nextLine(); System.out.println("hood " +src); }
4.3流程控制 Java是顺序执行的结构
4.4不同的输入数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import java.util.Scanner;public class ReadDifferentDataTypes { public static void main (String[] args) { Scanner scanner = new Scanner (System.in); System.out.print("请输入一个布尔值:" ); boolean bool = scanner.nextBoolean(); System.out.println("你输入的布尔值是:" + bool); System.out.print("请输入一个整数:" ); int num = scanner.nextInt(); System.out.println("你输入的整数是:" + num); System.out.print("请输入一个字符串:" ); String str = scanner.next(); System.out.println("你输入的字符串是:" + str); scanner.close(); } }
5.1if选择语句 if(关系表达式<或者是布尔表达式>){ 语句体(true就成立执行语句体,false就绕过了语句体,直接输出结束。); }
if的分支选择和扩展同c语言
这里不在赘述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import java.util.Scanner;import javax.swing.plaf.synth.SynthEditorPaneUI;public class hello { public static void main (String[] args) { Scanner scanner = new Scanner (System.in); int src = scanner.next(); if (src>=60 ){ System.out.println(src+" you pass this test" ); }else { System.out.println(src+"sorry you fail" ); } scanner.close(); } }
5.2switch输入 同c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public static void main (String[] args) { char grade = 'c' ; switch (grade){ case 'a' : System.out.println("优" ); break ; case 'b' : System.out.println("良" ); break ; case 'c' : System.out.println("中" ); break ; case 'd' : System.out.println("差" ); break ; default : System.out.println("您的输入有误!" ); } }
5.3循环 循环也类似与c语言,这里不多说
6.1方法的调用和定义 定义方法是
1 2 3 4 修饰符+返回值的类型+方法名字(参数类型,此参数名) { 方法 return 返回值 }
在同一个类之下可以直接调用
在不同的类下需要先使用类的名字和方法然后再调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import java.util.Scanner;import javax.swing.plaf.synth.SynthEditorPaneUI;public class hello { public static void main (String[] args) { Scanner scanner = new Scanner (System.in); for (int i=1 ;i<=5 ;i++){ int src = scanner.nextInt(); a.cheak(src); } scanner.close();} } class a {public static int cheak (int src) { if (src>=60 ){ System.out.println(src+" you pass this test" ); }else { System.out.println(src+"sorry you fail" ); } return 0 ; } }
6.2修饰符区别 public:表示该成员是公共的,可以被任何其他类访问。
static:表示该成员是静态的,属于类而不是类的实例。静态成员被所有类的实例共享,可以通过类名直接访问,无需创建类的实例。
final:表示该成员是不可变的,一旦被定义赋值后就不能再更改。final修饰的变量不能被重新赋值,final修饰的方法不能被重写,final修饰的类不能被继承。
区别:
public和static都是访问修饰符,用于限制成员的访问范围,而final是一个修饰符,用于声明不可变的成员。
public用于声明该成员对所有类可见,static用于声明该成员属于类而不是实例,final用于声明该成员不可更改。
public可以用于类、方法和成员变量,static可以用于方法和成员变量,final可以用于类、方法和成员变量。
综上所述,public和static都用于修饰访问权限和属于类的成员,而final用于声明不可变的成员。
6.3方法的重载 要求
1.方法名字必须要求一样,但是参数名不一样,类型不一样,派列方式不一样
2.如果只是方法的返回值不一样不能完成方法的重载
程序运行的时候汇通过参数去匹配对应的方法然后执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class a {public static int cheak (int src) { if (src>=60 ){ System.out.println(src+" you pass this test" ); }else { System.out.println(src+"sorry you fail" ); } return 0 ; } public static int cheak (int src,int a) { if (src>=a){ System.out.println(src+" you pass this test" ); }else { System.out.println(src+"sorry you fail" ); } return 0 ; } }
在这里存在的不同类里面,根据check函数的不同参数去匹配最终执行的方法
7.1数组 基础定义类似c语言
创建的方法
数据类型[]数组名字=new 数据类型[]{数据元素}
1 int [] arry1=new int []{10 ,20 ,30 ,40 ,50 }
1 2 3 4 5 6 7 8 9 10 public static void main (String[] args) { int [] arr1 = new int []{10 ,20 ,30 ,40 ,50 }; int [] arr2 = {10 ,20 ,30 ,40 ,50 }; int [] arr3; arr3=new int [4 ]; int [] arr4; arr4= new int []{10 ,20 ,30 ,40 ,50 }; }
静态数组指定内容
动态数组指定了长度
数组的建立都会有初始化的过程,为数组中每一个位置赋一个初始值的大小
7.2数组的遍历 同c语言
8.1对象和类定义 对象指:抽象的具体实体
类:抽象的具体类型,对一类事务进行系统的描述,但是不代表具体的某一是事物
8.2类的创建/调用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import java.util.Scanner;public class hello { public static void main (String[] args) { scanner abc=new Scanner (System.in); abc.hasNext() } class a { String b; int c; static boolean d (int c) { return (c >= 100 ); } }
关于 static 静态变量(static variable)是属于类的变量,而非具体实例对象的变量。它的特点是所有对象共享同一个变量副本,当一个对象对该变量进行修改后,其他所有对象访问到的都是已经进行过修改的值。
静态方法(static method)是属于类的方法,而非具体实例对象的方法。它可以直接通过类名调用,不需要先创建一个对象。静态方法通常用于定义一些通用的工具方法或者用于创建实例对象前的初始化操作。
静态变量是固定的,只能在这个类内部修改,不能再外面被修改
也就是说有如果static了一个变量a
如果new了一个对象d,那么d.a的值对外来说一旦进行修改
这个类的实例对象的a值都会发生变化
相当于这个类里面的全局变量
只要是用这个类实例化的对象都会发生改变
以下为示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class hello { public static void main (String[] args) { a studen=new a (); studen.c=12 ; System.out.println(a.c); a studen2=new a (); System.out.println(studen2.c); studen2.c=11 ; System.out.println(studen.c); } } class a { public static int c; }
8.3构造器 创建对象的时候需要使用的方法
new的本质就是在掉用构造方法
如果没有构造器,在new的时候,系统会自动构造一个无参数构造器
类似与php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class Person { private String name; private int age; public Person () { name = "" ; age = 0 ; } public Person (String name, int age) { this .name = name; this .age = age; } public void sayHello () { System.out.println("Hello, my name is " + name + " and I am " + age + " years old." ); } }
9.1封装 把一些类里面相关的较为复杂的结构进行隐藏,只留下简单的对外接口
使用pravite修饰类里面的成员
1 2 3 class a { private String b="szdasd" ;}
这些变量不能在外部被进行修改,只能在类内部才能进行修改,在外部不能被修改也不能被调用
想要调用只能间接调用,这里使用两个函数getxxxx和setxxxx
get函数主要是为了访问相关的数据
不能有参数,必须有返回类型且和对应变量的类型一致
1 2 3 4 5 6 class a { private String b="szdasd" ; public String geta () { return this .b; }}
set函数主要是为了修改相关的值
对于set来说,不能有返回值,参数类型和成员变量对应
1 2 3 4 5 class a { private String b="szdasd" ; public void setb (String b) { this .b=b; }}
9.2继承 继承的本质是
子类实例具有父类的特征和行为,使得子类对象可以具有父类的特征和行为
在java中使用extends关键字可以声明一个类是另一个类继承下来的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 实例如下 import java.util.Scanner;public class hello { public static void main (String[] args) { acm acm = new acm (); ctf ctf=new ctf (); System.out.println(acm.target); System.out.println(acm.name); System.out.println(ctf.name); System.out.println(ctf.target); } } class game { String target="point" ; } class acm extends game { String name="acm is bad" ; } class ctf extends game { String name="ctf is good" ; }
对于调用函数,子类中有就直接调用,没有相关函数就向上寻找在她的父类里面去寻找相关函数,如果找不到就继续向上进行寻找
子类可以继承所有父类的方法
但是private的私有不能被调用或者继承
9.3this和super super代表的是在子类里面调用父类的方法或者是属性
1 2 3 4 5 调用父类的构造方法:当子类需要调用父类的构造方法时,可以使用super()来实现。在子类的构造方法中,使用super()调用父类的构造方法,以便完成父类的初始化操作。 调用父类的成员变量和方法:通过super关键字,子类可以访问并使用父类的成员变量和方法。在子类中,如果有与父类同名的成员变量或方法,使用super关键字可以显式地指明要访问父类的成员。 调用父类的方法,并进行方法重写:子类可以使用super关键字来调用父类的方法,并可以在子类中对父类的方法进行重写。通过使用super关键字,子类可以在重写的方法中调用父类的原始实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 class Parent { String name; Parent(String name) { this .name = name; } void display () { System.out.println("Parent class: " + name); } } class Child extends Parent { String name; Child(String parentName, String childName) { super (parentName); this .name = childName; } @Override void display () { super .display(); System.out.println("Child class: " + name); } } public class Main { public static void main (String[] args) { Child childObj = new Child ("Parent" , "Child" ); childObj.display(); } }
对于this
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class Person { String name; Person(String name) { this .name = name; } void display () { System.out.println("Name: " + this .name); } void sayHello () { System.out.println("Hello, " + this .name + "!" ); } } public class Main { public static void main (String[] args) { Person personObj = new Person ("Alice" ); personObj.display(); personObj.sayHello(); } }
9.4方法的重写 好乱好乱好乱
1.静态方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public class hello { public static void main (String[] args) { b aaa = new b (); aaa.test(); System.out.println(aaa.aa); a bbb = new b (); bbb.test(); System.out.println(bbb.aa); } } class a { String aa; public a () { this .aa="a=>" ; return ; } public static void test () { System.out.println("a=>text" ); } } class b extends a { String aa; public b () { this .aa="b=>" ; return ;} public static void test () { System.out.println("b=>text" ); } }
一句话,数据类型是谁的,就调用谁的静态方法
对于a aaa=ew b();的解释
在这个过程中,首先会调用类 b
的构造方法,然后类 b
继承了类 a
,所以在调用 b
的构造方法之前,也会调用类 a
的构造方法。这是因为构造方法的调用是从最顶层的父类开始逐级向下传递的。
具体的调用顺序是这样的:
调用类 a
的构造方法:类 a
的构造方法中设置了 aa
成员变量为 “a=>”。
然后调用类 b
的构造方法:类 b
的构造方法中设置了 aa
成员变量为 “b=>”。
所以,在创建 b
类的实例时,实际上调用了类 a
和类 b
的构造方法,因此 aaa
对象的 aa
成员变量的值将是 “b=>”,这是因为在构造过程中,最后一次赋值覆盖了之前的赋值。
总之,从父类开始一次次调用构造方法
b aaa = new b();
a bbb = new b();
不论前面是啥,都是从父类到子类向下构造
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 public class hello { public static void main (String[] args) { b aaa = new b (); System.out.println(aaa.aa); a bbb = new b (); System.out.println(bbb.aa); } } class a { String aa; public a () { System.out.print("a=>" ); this .aa="aa" ; return ; } public static void test () { System.out.println("a=>text" ); } } class b extends a { String aa; public b () { System.out.println("b=>" ); this .aa="bb" ; return ;} public static void test () { System.out.println("b=>text" ); } }
2.非静态方法的调用 va中的非静态方法重写是通过子类重新定义一个与父类中方法签名(方法名称和参数列表)相同的方法来实现的。以下是非静态方法重写的要点:
子类中的重写方法必须和父类中被重写的方法具有相同的方法签名,包括方法名称、参数列表以及返回类型。
重写方法不能使用比父类中被重写方法更严格的访问修饰符。子类可以将父类中的方法从 protected 或者 default 访问级别变更为 public,但不能更严格。
重写方法不能抛出比父类中被重写方法更宽泛的异常类型。子类方法可以抛出父类方法中抛出异常的子类异常,或者干脆不抛出异常。
重写方法不能使用 static
或 final
修饰符。static
方法是与类关联的,而非继承关系,而 final
方法无法被子类覆盖。
重写方法应该使用 @Override
注解来标识,这是一种好的编程实践,可以帮助编译器检查是否正确地进行了重写。
下面是一个示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 javaCopy codeclass Animal { void makeSound () { System.out.println("Animal makes a sound" ); } } class Dog extends Animal { @Override void makeSound () { System.out.println("Dog barks" ); } } public class Main { public static void main (String[] args) { Animal animal = new Animal (); Animal dog = new Dog (); animal.makeSound(); dog.makeSound(); } }
在这个示例中,Animal
类有一个非静态方法 makeSound()
,Dog
类继承了 Animal
类并重写了 makeSound()
方法。在 main
方法中,我们可以看到多态性的效果,调用 dog.makeSound()
时会实际调用 Dog
类中的重写方法。
总之,Java中的非静态方法重写允许子类为继承自父类的方法.
而静态方法无法被重写,而是被隐藏,调用时取决于引用类型。
9.5多态 同一个方法可以根据发送对象的不同而采用多种不同的行为方式。一个对象的实际类型是确定的,但可以指向对象的引用类型很多。
首先,子类可以继承父类的属性和方法,子类也可以重写父类的方法,也可以重写父类的方法或者父类的属性。
其次,重写是重要的部分,通过在子类对象定义一个相同名称,相同参数,相同返回类型的函数,就会发生方法重写.前提要求是,父类方法必须是可以继承的。
(即使用public
、protected
或没有访问修饰符)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 class Animal { public void makeSound () { System.out.println("动物发出声音" ); } } class Cat extends Animal { @Override public void makeSound () { System.out.println("猫发出喵喵的声音" ); } } class Dog extends Animal { @Override public void makeSound () { System.out.println("狗发出汪汪的声音" ); } } public class PolymorphismExample { public static void main (String[] args) { Animal animal1 = new Cat (); animal1.makeSound(); Animal animal2 = new Dog (); animal2.makeSound(); } }
9.6 instanceof关键字 可以用来判断两个类之间是否存在父子关系
1.父类引用指向子类的对象。
2.子类转换为父类(向上转型),不用强制转换。
3.父类转换为子类(向下转型),强制转换后会丢失方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 class Animal { void makeSound () { System.out.println("Some sound" ); } } class Dog extends Animal { void makeSound () { System.out.println("Woof!" ); } void fetch () { System.out.println("Fetching the ball" ); } } public class Main { public static void main (String[] args) { Animal animal = new Dog (); animal.makeSound(); if (animal instanceof Dog) { Dog dog = (Dog) animal; dog.makeSound(); dog.fetch(); } else { System.out.println("Animal is not a Dog" ); } Animal anotherAnimal = new Animal (); if (anotherAnimal instanceof Dog) { Dog anotherDog = (Dog) anotherAnimal; } else { System.out.println("Animal is not a Dog" ); } } }
没有向下转型的时候,父类不能调用子类的方法,需要向下转型之后才能调用
而子类可以随意调用父类的方法,比如使用super等方法
9.7status关键字 status是类里面共享的,它类似于全局变量
如果一个类的实例改变了status的值,那么所有这个类的值都会发生变化
类似于都是用指针指向了同一个内存地址,然后修改了这个值之后,所有地址区间上的这个值都变化了,没有加status时,就像结构体一样。是定义了一个变量。
1 2 2.非静态方法可以访问本类中的所有静态方法。 3.静态方法可以调用本类中所有的静态方法。
静态方法在加载的时候是和main函数一起加载的,所以无法调用
而非静态方法来之后,
可以访问本类的所有方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 class MyClass { static void staticMethod1 () { System.out.println("This is a static method 1." ); } static void staticMethod2 () { System.out.println("This is a static method 2." ); } void nonStaticMethod1 () { System.out.println("This is a non-static method 1." ); } void nonStaticMethod2 () { System.out.println("This is a non-static method 2." ); } void callingStaticMethods () { staticMethod1(); staticMethod2(); } static void callingAllMethods () { staticMethod1(); staticMethod2(); } } public class Main { public static void main (String[] args) { MyClass myObj = new MyClass (); myObj.callingStaticMethods(); MyClass.callingAllMethods(); } }
9.8抽象类 抽象类定义;在普通类的结构里面增加抽象方法的组成部分。
抽象方法定义:是指没有方法体的方法
抽象类的主要特点如下:
无法实例化: 你不能直接创建抽象类的对象,因为抽象类本身是不完整的,它可能包含未实现的抽象方法。只能通过创建继承抽象类的具体子类对象来使用抽象类的功能。
可以包含抽象方法: 抽象类可以包含抽象方法,这些方法没有具体的实现。子类继承抽象类后,必须提供这些抽象方法的具体实现。抽象方法在抽象类中用于定义方法的签名和输入输出,但不提供实际的代码实现。
可以包含普通方法: 除了抽象方法外,抽象类也可以包含普通的方法(有具体实现的方法)。这些方法可以在抽象类中提供通用的功能。
用于继承: 抽象类被设计为供其他类继承的基类。子类继承抽象类后,必须实现其中的所有抽象方法,才能成为一个完整的类。
抽象类通常用于定义一组相关的类的通用行为和属性,而不关注具体的实现。通过在抽象类中定义抽象方法,可以强制子类提供自己的实现,从而达到约定接口和代码复用的目的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 abstract class Shape { abstract double calculateArea () ; } class Circle extends Shape { double radius; Circle(double radius) { this .radius = radius; } @Override double calculateArea () { return Math.PI * radius * radius; } } class Rectangle extends Shape { double width; double height; Rectangle(double width, double height) { this .width = width; this .height = height; } @Override double calculateArea () { return width * height; } } public class Main { public static void main (String[] args) { Circle circle = new Circle (5 ); Rectangle rectangle = new Rectangle (4 , 6 ); System.out.println("Circle Area: " + circle.calculateArea()); System.out.println("Rectangle Area: " + rectangle.calculateArea()); } }
9.9接口 使用interface作为接口,是一种特征的约定
有点类似与抽象类、
在这里只包含抽象的方法,并不含有具体的实现方法。在调用的时候需要给出具体的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class hello { public static void main (String[] args) { B cc = new B (); cc.b = "hello" ; cc.out(cc.b); } } interface A { void out (String a) ; } class B implements A { String b; @Override public void out (String b) { System.out.println(b); } }
9.10 内部类 内部类是指 将一个类定义在一个类和一个方法里面
一个java文件里面只能拥有一个public类,但是可以有很多的类
成员内部类 定义在类的内部,内部类可以访问外部类用的属性和方法,但是外部类想要访问成员内部的属性和方法,首先要实例内部化的成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class hello { public static void main (String[] args) { a out=new a (); System.out.println(out.a); a.b in=out.new b (); System.out.println(in.b); } } class a { String a="这是外部类" ; class b { String b="这是内部类" ; } }
静态内部类 多加了一个static的关键字,内部只能访问外部静态成员的变量和方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class Hello { public static void main (String[] args) { a out = new a (); System.out.println(out.a); a.b.bb(); } } class a { String a = "这是外部类" ; static class b { static void bb () { System.out.println("这是内部静态类" ); } } }
匿名内部类 没有名字的类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class AnonymousInnerClassExample { interface Greeting { void greet () ; } public static void main (String[] args) { Greeting anonymousGreeting = new Greeting () { @Override public void greet () { System.out.println("Hello from anonymous class!" ); } }; anonymousGreeting.greet(); } }
局部内部类 仅仅只存在在他所在的代码里面,只能被final修饰
有点像局部变量。
10 异常 关键字:try、catch、final、throw、throws。
try:抛出异常(尝试着去处理什么东西)。
catch:捕获异常。
final:无论有什么异常发生,finally都会被执行(可以运行清理类型等收尾善后性质的语句)。
throw:当程序发生异常而无法处理的时候,会抛出对应的异常对象。
throws:throws用来在类中捕获异常信息,标明方法可能抛出的异常。
参考 1.Java入门级基础教学(史上最详细的整合)_java基础入门_代码贩子、的博客-CSDN博客
2.gpt
3.搜索引擎
4,感谢yjp学长教授