1、关于抽象类和接口:
类不可以多继承而接口可以;
抽象类和接口都不能被实例化,即不能通过new来实例化抽象类;
抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用;
抽象类只能用来继承;
抽象方法必须被子类实现。
接口中只有:常量、抽象方法
接口可以继承接口(通过extends),可以多继承
二维数组的定义中,第一个括号必须有数值,不能为空,但可为0;
一个子类只能继承一个抽象类,但可以实现多个接口;
抽象类可以有构造方法,接口没有构造方法;
抽象类可以有普通成员变量,接口不能有普通成员变量;
抽象类和接口都可以有静态成员变量,抽象类中的静态成员变量访问权限任意,接口只能是public static final(默认);
抽象类可以没有抽象方法,抽象类可以有普通方法, 接口中都是抽象方法;
抽象类可以有静态方法,接口不能有静态方法;
final关键字可以用于成员变量、本地变量、方法以及类;
final修饰的成员变量必须在声明时被初始化,或者在构造器中初始化,否则就会报编译错误;
不能够对final变量再次赋值;
本地变量必须在声明时赋值;
在匿名类中所有变量都必须是final变量;
final修饰的方法不能被重写;
final修饰的类不能被继承;
没有在声明时初始化的final变量称为空白final变量(blank final variable),他们必须在构造器中初始化,或者调用this进行初始化,不然编译器会报错
方法入参是基本类型时,传递的是值,方法内对传递值进行修改时不会影响调用是的变量;
方法入参是引用类型时,传递的是引用地址,方法内对传递值进行修改时会影响调用时的变量;
package com.javasm.work3;
import java.util.Arrays;
public class TestMethod {
public static void main(String[] args) {
TestMethod method=new TestMethod();
int b = 1;
b = method.test1(b);
System.out.println(b);
int[] arr = {1,2,3};
method.test2(arr);
System.out.println(arr[0]);
System.out.println(arr);
Arrays.sort(arr);
}
/**
* 方法入参是基本数据类型时,传递的是值
* 方法内对传递的值进行修改时不会影响调用时的变量
* @param a
*/
public int test1(int a){
a=2;
return a;
}
/**
* 方法入参是引用数据类型时,传递的是内存地址引用
* 方法内对传递的引用进行修改时会影响调用时的变量
* @param arr1
*/
public void test2(int[] arr1){
System.out.println(arr1);
arr1[0] = 4;
}
}
7、父类的普通方法可以被继承和重写,不多作解释,如果子类继承父类,而且子类没有重写父类的方法,但是子类会有从父类继承过来的方法。
public class StaticTest
{
public static void main(String[] args)
{
M m = new N();
m.output();
}
}
class M
{
public static void output()
{
System.out.println("M");
}
}
class N extends M
{
public static void output()
{
System.out.println("N");
}
}
上面执行的结果是“M”,也就是是M类型的引用调用的,如果修改main方法中的代码:
N n = new N();
n.output();
那么执行的结果是“N”,也就是N类型的引用调用的。
8、 为什么静态成员、静态方法中不能用this和super关键字?
Class A中void method1(){}实际上是这样的--------> void method1(A this)
void method2(int x){}实际上是这样的--------> void method2(A this, intx)
而静态方法与对象无关,根本不能把对象的引用传到方法中,所以不能用this
既然"无需本类的对象即可调用静态方法",而this和super关键字都是用于本类对象的-----调用静态方法无需本类的对象这句话很清楚表明:静态方法中不能用this和super关键字
String type = score<60?"不及格":"及格";
int i = (string=="hello"? 10:-1);
int j = (x>0 ? 1:(x>10 ? 2:-1));//多重嵌套
import static java.lang.Math.PI; //导入Math类的PI属性
12、数组的初始化方式:
静态初始化
int [] a = {1,2,5,7,3}; //静态初始化基本类型数组
User[] b = {
new User(01,"张三"),
new User(02,"李四"),
new User(03,"王五")
}; //静态初始化引用类型数组;
动态初始化
int[] a = new int[2]; //动态初始化数组,先分配空间;
a[0] = 1;//给数组元素赋值;
a[1] = 2;//给数组元素赋值;
默认初始化
int[] a = new int[2]; //默认值:0,0;
boolean[] b = new boolean[2]; //默认值:false,false;
String[] s = new String[2]; //默认值:null,null;
13、java虚拟机的内存可以分为三个区域:
栈stack
堆heap
方法区method area( 位于堆中)
14、当类中定义了有参构造方法,无参构造函数就不再存在,想要使用必须在类中显式声明;
15、继承使用要点:
16、instanceof运算符:
```
运算符 | 符号 | 说明 |
---|---|---|
逻辑与 | &(与) | 两个操作数为true,结果才为true,否则是false |
逻辑或 | !(或) | 两个操作数一个是true,结果就是true |
短路与 | &&(与) | 只要有一个为false,则直接返回false |
短路或 | ||(或) | 只要有一个为true,则直接返回true |
逻辑非 | !(非) | 取反:!false为true,!true为false |
逻辑异或 | ^(异或) | 相同则为false,不同为true |
短路与和短路或采用短路的方式,从左到右计算,如果只通过运算符左边的操作数就能确定该逻辑表达式的值,则不会继续计算运算符右边的操作数,提高效率。
18、递归结构
public class Test22{
public static void main(String[] args) {
long d1 = System.currentTimeMillis();
System.out.printf("%d阶乘的结果:%s%n",10,factorial(10));
long d2 = System.currentTimeMillis();
System.out.printf("递归费时:%s%n",d2-d1); //耗时:32ms
}
/** 求阶乘的方法*/
static long factorial(int n) {
if(n == 1) {//递归头
return 1;
}else{//递归体
return n*factorial(n - 1); //n! = n*(n - 1)!
}
}
}
public class TestPolm {
public static void main(String[] args) {
Animal cat = new Cat();//自动向上转型
animalCry(cat);
Cat cat2 = (Cat)cat; //强制向下转型
}
static void animalCry(Animal a){
a.shut();
}
}
class Animal{
public void shut(){
System.out.println("叫了一下!");
}
}
class Dog extends Animal{//继承条件满足
public void shut(){//方法重写条件满足
System.out.println("汪汪汪");
}
}
class Cat extends Animal{//继承条件满足
public void shut(){//方法重写条件满足
System.out.println("喵喵喵");
}
}
原文:https://www.cnblogs.com/caoleiCoding/p/8947384.html