1. 关于abstract 抽象类:
abstract 定义抽象方法, abstract public void s(); 不能加{} 注意!!!!!!!!
有抽样方法的类,叫抽样类,当你定义一个类继承 有抽样方法的类时,要实现覆盖抽样方法。
注意 在类上 加abstract 如: public abstract class demo4 类中可以有abstract 修饰的方法,也可以没有。
但是 类中可以有abstract 修饰的方法,在类上必须加abstract。
对于修饰class 时(java里的类 private 可以修饰class。
前提是这个class 为 内部类。否则只能是public,不然会报错)
2.关于重载与重写:
重写:重写(覆盖)的规则:
1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.
2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。
3、重写的方法的返回值必须和被重写的方法的返回一致;
4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
简单来说就是重写是在继承父类是,重写父类的方法,要求参数,返回值,与函数名一样
被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写
重载的规则:
1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参 数,不同的参数顺序(参数类型必须不一样);
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
简单来说就是,我在外面new 这个对象时,调用方法能找到唯一的方法,即是我可以 . 出唯一的方法
3.java里的类 只能继承一个类,而可以实现多个接口。
原因:
不允许继承多类,就是为了避免继承多父类,在调用相同方法或者构造函数时赋值同一个成员变量时,凌乱了。
接口没有变量,则没有以上的矛盾。
4.关于精度转换的问题
默认的浮点数都是double 只有在数组后边加上f才是 float的
float f=12.2f;
这是定义一个float类型的数据
按小到大排序(精度排序小到大),除了boolean
byte char short int long float double boolean(false|true)
低精度到高精度不用强转.自动转,
float m;
int s=6;
m=s;
System.out.println(m); 输出6.0
高精度到低精度要强转(会造成精度丢失)
double m=6.186;
int s=(int) m;
System.out.println(s); 输出6
5.关于 switch 里面的break 加与不加的问题。
nt sd=2;
switch (sd) {
case 2 : System.out.println("2");
case 5:
System.out.println("5");
case 1:
System.out.println("1");
} 输出 2 5 1 因为都没加break
nt sd=2;
switch (sd) {
case 2 : System.out.println("2") break;
case 5:
System.out.println("5");
case 1:
System.out.println("1");
} 输出 2 在2 后面加了break
nt sd=5;
switch (sd) {
case 2 : System.out.println("2") break;
case 5:
System.out.println("5");
case 1:
System.out.println("1");
default:
System.out.println("都找不到的时候走这个");
} 输出 5 1 在5出没加break
总结:switch语句 是在找到对应值之前 ,管他有没有加break 都不会执行。当在找到对应值后,看该语句有没有break,有的话就 跳出(相当于跳出循环),如果没有的话,就按顺序执行下面的语句,碰到有break的话,就跳出。
6.关于异常
1、类java.lang.Throwable是所有异常类的基类,它包括两个子类:Exception和Error,Exception类用于描述程序能够捕获的异 常 如ClassNotFoundException。Error类用于指示合理的应用程序不应该试图捕获的严重问题,如虚拟机错误VirtualMachineError
2、自定义异常类可以继承Throwable类或者Exception,而不要继承Error类。自定义异常类之间也可以有继承关系 3、需要为自定义异常类设计构造方法,以方便构造自定义异常对象。 7.关于判断对象1.判断两个对象是否是同一个引用对象则用==,"=="比的是地址.因为如果地址相同,则就是同一个对象 2.obj1.equals(Object obj2),用来判断两个对象是否相等(前面给出的是相等的情况。如果你要不相等的话:!obj1.equals(Object obj2)就OK了)
8.关于值传递与引用传递(重要)
对于像char,int,String,Integer,等基本类型都是值传递
一般像 对象传递到方法都是属于引用传递(除了像new String(),new Integer()等都是值传递)
还有数组比较奇特,是存放在堆空间里面的,数组传递到方法都是 引用传递。如String[],int[],char[]等都是引用传递
例子:
2
public static void main(String[] args) {
char ch = 'a';
String[] m=new String[]{"limian","douyu"};
changechar(ch);
changeString(m);
System.out.println(ch);
System.out.println(m[0]+m[1]);
}
public static void changechar( char ch){
ch= 'g';
}
public static void changeString(String[] s){
s[0]="limiange";
}
输出 a
limiangedouyu
9.关于接口(可以定义方法与属性,属性必须赋值是final的)
1:接口没有提供构造方法
2:接口中的方法默认使用public、abstract修饰
3:接口中的属性默认使用public、static、final修饰 (属性子类不能修改)
10.关于父类中的static 修饰的方法问题
首先要强调,静态方法是不能被覆盖的。
原因:
在子类中,可以定义与父类同名的静态方法,不过并不存在“多态”,严格的说,方法间没有多态就不能称作“覆盖”。所以说,子类的静态方法,并没有覆盖父类的方法。
- package com.ren.staticTest;
- public class StaticExtends {
- public static void main(String[] args) {
- Father son = new Son(); //声明为Father类,son1静态方法和Father类绑定
- son.method();
- son.staticMethod();
- Son son2 = new Son();
- son2.method();
- son2.staticMethod();
- }
- }
- class Father{
- void method(){
- System.out.println("父类方法");
- }
- static void staticMethod(){
- System.out.println("父类静态方法");
- }
- }
- class Son extends Father{
- void method(){
- System.out.println("子类方法");
- }
- static void staticMethod(){
- System.out.println("子类静态方法");
- }
- }
运行结果:
子类方法
父类静态方法
子类方法
子类静态方法
11.关于数组,map,list 赋值与初始化赋值。
int [2] b; 会报错。
int [] b; 不报错
数组不new的时候不能写数组的大小
数组new 的时候要指明大小 ,不然报错
int [] b=new int[6]; 但是当直接赋值的时候不能加数组大小,会报错。
多元数组,要说明第一个的大小
int [][]b=new int[3][];
int [] a={1,3,5,7,2,4}; 赋值
或 int [] b=new int[]{1,3,5,7,2,4}; 不报错
int [] b=new int[5]{1,3,5,7,2,4}; 报错
总结:
声明数组时不能指定其长度(数组中元素的个数),
Java中使用关键字new创建数组对象,格式为:
数组名 = new 数组元素的类型 [数组元素的个数]
list 与map的赋值不同与数组
List<String> nList=new ArrayList<String>(){{add("str01"); add("str02");}};
Map<String,String> m=new HashMap<String, String>(){{put("limian", "douyu"); put("1", "1w");}};
12.关于final类,(final 修饰的对象引用不能变,但是内容可以变)
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句: final StringBuffer a=new StringBuffer("immutable");执行如下语句将报告编译期错误: a=new StringBuffer("");但是,执行如下语句则可以通过编译: a.append(" broken!"); 如:public static void main(String[] args) { int x=0; final int y=1; int[] z={2}; final int [] n={3}; n[0]++; User(x,y,z,n); System.err.println(z[0]); System.err.println(n[0]); System.err.println(x); System.err.println(y); } private static void User(final int x, int y, final int[] z, int[] n) { x++;(报错) y++; y=x; z[0]++; n[0]++; z=n;(报错) }
13.关于在方法里面定义变量
在方法里面 不能用修饰符 修饰变量 ,如果硬要使用 只能使用 final 定义变量并且赋值才可以。
void f(){
final int a=2;(可以通过)
public int a=2;(报错,编译通不过)
int a=2; (可以通过)
}
或者不用修饰符修饰, 直接 int a