this可以调用构造器
class Person{
String name;
int age;
//空参构造器
public Person(){}
//初始化name的构造器
public Person(String name){
this();//调用空参构造器
this.name=name;
}
//初始化name和age的构造器
public Person(String name,int age){
this(name);//调用初始化name的构造器
this.age = age;
}
}
在类的构造器中,可以显式的使用"this(形参列表)"的方式调用本类中指定的其他构造器
但是方法中不能调用本类的构造器
本类中构造器调用构造器,不会创建多个对象
"this(形参列表)"必须声明在当前构造器的首行,这也意味着一个构造器只能调用一个构造器
this.属性
man instanceof Man;
判断man是否是Man类型的实例,如果是返回true,不是返回false
man instanceof Object;//答案是正确的,因为Object是所有类的直接父类或间接父类
break语句用于终止某个语句块的执行
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
label1: { ……
label2: { ……
label3: { ……
break label2;
……
}
}
}
break只能用于switch语句和循环语句中
从数组底层的运行机制来看,没有多维数组。
int[][] arr1 = new int[3][];
arr1[0]= new int[1];
arr1[1] = new int[5];
arr1[2] = new int[3];
如此看来生成的依旧是一维数组,再在一维数组的每个元素赋值上另一个数组的地址值
int[][]arr = new int[][3]; 此种声明方式错误
Arrays.fill()
int[] arr2 = new int[]{1,2,3,4,5,6};
Arrays.fill(arr2,10);
System.out.println(Arrays.toString(arr2));
输出的结果是[10, 10, 10, 10, 10, 10]
Arrays.toString(arr)与arr.toSting的不同(arr为数组)
Arrays.sort():从小打到的排序数组元素
Arrays.binarySearch():查找数组中的元素的索引位置
new Person().walk();
new Person().talk();
因为匿名对象没有名字,所以只能调用一次
格式:
[权限修饰符] [返回值类型] [方法名]([形参类型] ... [形参名]){
......
return [返回值类型];
}
可变形参的个数为[0,+∞),意味着零个可以
public void show(String[] strs){}
public void show(String ... strs){}
采用可变个数形参的方法调用参数的时候和数组的调用一样,也是采用索引的方式
可变个数的形参必须声明在方法参数列表的末尾
可变参数的形参在方法的参数列表中只能有一个
任何一个类都有构造器
Person person = new Person();
如果没有显式的定义一个构造器,系统默认分配一个空参构造器
在编译期间,只能调用父类中声明的方法。
在运行期间,实际执行的是子类重写的方法
多态性的使用前提:
对象的多态性只适用与方法,不适用与属性(属性不论在编译还是运行期间都调用和执行的子类的属性)
父类的方法只在编译期间调用,被成为虚拟方法
多态是运行时行为
父类根据赋给它的不同子类对象,动态的调用属于该子类的该方法,此种方法调用在编译期是无法确定的,只有在方法调用的那一刻,解释运行器才会确定所要调用的具体的方法,这被称为“晚绑定”或“动态绑定
Person man = new Man();
只声明了一个空参构造器
finalize方法:对象在被回收之前会调用finalize方法,我们不要自行的调用该方法,一般都由垃圾回收器自动的调用该方法
equals方法:
基本数据类型变量无法调用该方法,因为基本数据类型不是对象
只能用于引用数据类型
在Object类中定义的equals方法和“==”作用是相同的
public boolean equals(Object obj) {return (this == obj);}
也就是Object中的equals方法作用为比较两个对象的地址值
String、Date、File、包装类等都重写了Object类中的equals方法
toString方法的使用
数值型的包装类有共同的父类Number
Integer i = new Integer("123");//可以
Integer j = new Integer("12a");//不可以
Boolean:
Boolean b = new Boolean(true);//可以
Boolean b2 = new Boolean("true");//可以
Boolean b3 = new Boolean("trUe");//可以
Boolean b4 = new Boolean("TrueTT");//不可以
当布尔包装类中传入的String类型的值时,是忽略大小写的,只要是True就认为是True,知道不是true就是false
boolean b;
Boolean b1;
包装类转化为基本数据类型:
调用包装类Xxx的XxxValue()方法
Integer in1 = new Integer(5);
int in2 = in1.intValue();
其它类型同理
自动装箱
int num1 = 5;
Integer in1 = num1;
boolean flag = true;
Boolean flag1 = flag;
自动拆箱
Integer in1 = new Integer(5);
int num1 = in1;
其它数据类型同理
基本数据类型、包装类—>String类型
int num1 = 5;
float f1 = 5.0;
String str1 = String.valueOf(num1);
String str2 = String.valueOf(f1);
调用String.valueOf(参数)方法即可,其它类型同理
String类型—>基本数据类型、包装类
String str1 = "123";
int num1 = Integer.parseInt(ster1);
调用Xxx.parseInt(传参数)方法即可,其它类型同理
可以定义全局常量
interface TestInterface{
public static final int MAX_SIZE = 500;
int MIN_SIZE = 0;
public abstract void fly();
void flyFly();
}
以上这两种的定义全局常量的方式都是一样的
以上这两种的定义抽象方法的方式都是一样的
不能定义构造器,意味着不能实例化
如果接口的实现类覆盖了接口中是所有方法,则可以该实现类可以进行实例化
接口和接口之间可以继承,而且可以多继承
jdk8之后可以在接口中定义静态方法和默认(default)方法
如果子类继承的父类和实现的接口中声明了同名同参的方法,在子类没有重写该方法的时候,默认调用的是父类的方法
如果子类实现的多个接口中都定义了同名同参的方法,那么实现类要调用时会报错,要解决此问题只能重写该方法了
实现类想要调用实现的接口的默认(default)方法:InterfaceName.super.method();
分为局部内部类(方法内、代码块内、构造器内)、成员内部类(静态、非静态)
//示例代码
public class Person {
String name;
int age;
public void walk(){
System.out.println("我在走路");
}
class Brain{
String BName = name;//Person.this.name;
public void letWalk(){
walk();//Person.this.walk();
}
}
static class Heart{
public void show(){
System.out.println("心脏在跳动")
}
}
}
作为外部类的成员:
如何实例化?
//接上文代码
public class Client{
public static void main(String[] args){
//创建Heart实例(静态的成员内部类)
Person.Heart heart = new Person.Heart();
heart.show();
//创建Brain实例(非静态的成员内部类)
Person p = new Person();
Person.Brain brain = p.new Brain();
brain.letWalk();
}
}
局部内部类的用法1:
public class InnerClassTest{
public Comparable getComparable(){
class MyComparable implements Comparable{
@Override
public int compareTo(Object o) {
return 0;
}
}
return new MyComparable();
}
}
getComparable方法的返回值为Comparable接口类型,就在方法内生成一个实现了Comparable的方法,再返回一个实现了该接口的对象
局部内部类的用法2:
public class InnerClassTest1{
return new Comparable() {
@Override
public int compareTo(Object o) {
return 0;
}
};
}
是匿名对象的匿名子类
局部内部类要注意的点:
public class Person{
public void method(){
int num = 10;
class InnerClass{
num=20;
}
}
}
以上的写法是错误的!!!!
随着对象的创建而加载并执行一次
作用:
可以定义多个
class Person(){
{
i = 6;
}
int i = 5;
System.out.println(i);
}
@Test
public void test1(){
String str = "123";
str = "abc";
try {
int num = Integer.parseInt(str);
System.out.println("test++++++++++++++");
}catch (NumberFormatException e){
System.out.println("test--------------");
}catch(Exception e){
System.out.println(e.getMassage);//打印异常信息
e.printStackTrace();//打印堆栈信息,此方式较常用
}
System.out.println("test结束");
}
test--------------
test结束
在try结构中声明的变量,在出了try结构后,就不再被调用
finally中声明的是一定会被执行的代码,即使catch中出现了异常,try中有return语句,catch中有return语句
@Test
public void testMethod(){
int num = method();
System.out.println(num);
}
public int method(){
try {
int[] arr = new int[10];
System.out.println(arr[10]);
return 1;
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
return 2;
}finally {
System.out.println("+++++++++++++");
}
}
//执行结果
java.lang.ArrayIndexOutOfBoundsException: 10
at java5.ExceptionTest1.method(ExceptionTest1.java:33)
at java5.ExceptionTest1.testMethod(ExceptionTest1.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:134)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:597)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:816)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(ArrayList.java:1259)
at org.testng.TestRunner.privateRun(TestRunner.java:766)
at org.testng.TestRunner.run(TestRunner.java:587)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
at org.testng.SuiteRunner.run(SuiteRunner.java:286)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1187)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1109)
at org.testng.TestNG.runSuites(TestNG.java:1039)
at org.testng.TestNG.run(TestNG.java:1007)
+++++++++++++
at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
2
@Test
public void testMethod(){
int num = method();
System.out.println(num);
}
public int method(){
try {
int[] arr = new int[10];
System.out.println(arr[10]);
return 1;
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
return 2;
}finally {
System.out.println("+++++++++++++");
return 3;
}
}
//运行结果
java.lang.ArrayIndexOutOfBoundsException: 10
at java5.ExceptionTest1.method(ExceptionTest1.java:33)
at java5.ExceptionTest1.testMethod(ExceptionTest1.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:134)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:597)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:816)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(ArrayList.java:1259)
at org.testng.TestRunner.privateRun(TestRunner.java:766)
at org.testng.TestRunner.run(TestRunner.java:587)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
at org.testng.SuiteRunner.run(SuiteRunner.java:286)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1187)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1109)
at org.testng.TestNG.runSuites(TestNG.java:1039)
at org.testng.TestNG.run(TestNG.java:1007)
at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
+++++++++++++
3
使用throws将异常抛出,异常后的代码就不执行了
/*
* 方法重写的规则之一:
* 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
*/
public class OverrideTest {
public static void main(String[] args) {
OverrideTest test = new OverrideTest();
test.display(new SubClass());
}
public void display(SuperClass s){
try {
s.method();//①
} catch (IOException e) {
e.printStackTrace();
}
}
}
class SuperClass{
public void method() throws IOException{
}
}
class SubClass extends SuperClass{
public void method()throws FileNotFoundException{
}
}
父类中的方法没有抛出异常,则子类重写父类的方法也不能抛出异常。如果存在异常,就要用try-catch-finally的方式处理
public class StudentTest {
public static void main(String[] args) {
try {
Student s = new Student();
s.regist(-1001);
System.out.println(s);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
class Student{
private int id;
public void regist(int id) throws Exception {
if(id > 0){
this.id = id;
}else{
throw new Exception("不能输入负数");
}
}
}
public class MyException extends Exception{
static final long serialVersionUID = -3387516993124229958L;
public MyException(String message){
super(message);
}
}
1.要么继承RuntimeException,要么继承Exception
2.提供全局常量:serialVersionUID(相当于唯一标识该类的标记)
public class Client{
public static void main(String[] args){
method(new Person(){
@Override
public void walk(){
System.out.println("匿名子类的匿名对象");
}
});
}
public static void method(Person p){
p.walk();
}
}
class Person{
public void walk(){
System.out.println("走路");
}
}