public class A {
public int a;
private String b;
public void a1() {
System.out.println("a111111");
}
}
public class B extends A{ B类继承A类
}
B b = new B();
b.a = 1;
//b.b = "abc"; 注意访问权限
b.a1();
1:类之间有is-a的关系才能继承,不能随便继承,有is-a的关系时可以继承,目的:代码复用
2:java是单一继承,一个子类只能继承一个父类,一个父类可以有多个子类。但是接口可以多继承。
3:创建子类对象时,注意执行过程:先执行父类静态代码块,再执行子类静态代码块,再执行父类构造器,最后执行子类构造器
B b = new B();//创建子类对象
理应先执行B的构造器,在子类构造器中第一句话默认有super()这条命令,可以通过super(实参)的 语法调用父类有参构造器
4:可以使用向上转型的语法:创建子类对象赋值给父类对象,该对象称之为向上转型的对象,可以调用父类的属性和方法,也能调用子类重写后的方法,目的:多态,根据不同的语法,可是实现调用不同的方法。
目的:来定义项目的功能规范:定义统一的方法名、参数、返回值。
接口的定义:
public interface A {}
特点:
1:接口中全是抽象方法,默认都是用public abstract修饰
2:接口不能创建对象,必须由子类来实现(implements,与继承的理解完全一样)该接口,实现类必须重写父接口的所有抽象方法,如果没有重写所有的抽象方法,那么实现类也必须定义为抽象类。
3:接口不能创建对象,可以创建实现类的对象或者向上转型的对象,调用子父类的属性或者方法。
4:接口不能有构造器,所有的属性默认全是用public static final修饰
可以修饰类、属性、方法
修饰类:最终类:不能被继承 public final class A{}
修饰属性:最终属性、常量:必须有初值,还不能被改值,通常变量名全大写。 public final int a = 1;
修饰方法:最终方法,不能被方法重写。 public final int a1(){}
基本类型 引用类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
实际应用中基本类型会自动装箱成引用类型,引用类型也会自动拆箱成基本数据类型
int a = 1;
Integer b = 1;
Integer b1 = a;
int c = b;
引用类型有属性和方法:
String s1 = "123";
int a = Integer.MAX_VALUE; //获得int最大值
int b = Integer.MIN_VALUE; //获得int最小值
int c = Integer.parseInt(s1); //将纯数字类型的字符串转换成int类型
String s1 = "123.1";
float f1 = Float.MAX_VALUE;
float f2 = Float.MIN_VALUE;
float f3 = Float.parseFloat(s1);
System.out.println(f1);
System.out.println(f2);
System.out.println(f3);
方法有条件的情况下自己调用自己。
注意:先进后出
int i=0;
int sum = 0;
public int t1(){
i++;
sum+=i;
if(i<=99) {
t1();
}
return sum;
}
作业1:自定义一个文件对象,File f1 = new File("g:\\aaa");输出该文件下所有的文件
作业2:自定义一个文件对象,File f1 = new File("g:\\aaa");将该文件下所有的文件及目复制到j:\\aaa下(文件的复制还没将,但是需要先将文件夹目录结构会创建出来)
g:\aaa\1.txt
g:\aaa\bbb\2.txt
g:\aaa\bbb\ccc\3.txt
↓
j:\aaa\
j:\aaa\bbb\
j:\aaa\bbb\ccc\
作业3:"g:\\aaa\\1.png"->复制到"g:\\bbb\\1.png"
附加:将g:\\aaa中所有内容复制到"g:\\bbb"
操作文件:类比较多,与集合的学习方法一样,归类理解
流:水流,电流,要强调方向与内容是什么?想象成管道。都在操作文件的内容。
字节流:流的内容是字节:一个字符(char)占2字节(B),1个字节(B)占8位(b)
输出流:从内存到硬盘,写入硬盘
输入流:从硬盘到内存,读取文件
OutputStream:父类抽象类:通过构造器会创建一个新文件,覆盖老文件
FileOutputStream:文件字节输出流,
public void write(int a); 一次写一个字节,写入文件
public void write(byte[] a); 一次写一个字节数组,写入文件
public void write(byte[] a,int b,int c);一次写一个字节数组,从下标b开始写c个长度
InputStream:父类抽象类
FileInputStream:文件字节输入流
public int read(); 一次读取一个字节,读取不到返回-1
一次读取b.length个字节,读取到的内容存入数组,返回实际读取到的长度,读取不到返回-1
public int read(byte[] b)
一次读取c个字节,读取到的内容存入数组,从下标a开始存,返回实际读取到的长度,读取不到返回-1
public int read(byte[] b,int a,int c)
对象流:
FileOutputStream fos = new FileOutputStream(f1);
//对象输出流:可以写对象,会创建文件对象并序列化文件
ObjectOutputStream oos = new ObjectOutputStream(fos);
//对象流在写对象时,该对象必须实现序列化接口(Serializable)
oos.writeObject(e1);
FileInputStream fis = new FileInputStream(f1);
ObjectInputStream ois = new ObjectInputStream(fis);
Emp obj = (Emp)ois.readObject();
System.out.println(obj);
序列化:Serializable:该接口只是一个标识,空接口,
只要将一个对象通过内存保存在硬盘上,只要经过该过程,该对象必须实现序列化接口:序列化的过程:就是将该对象所在堆内存块中的内容打碎成字节数据。
反序列化:从读取硬盘上的内容,反序列化(将字节数组重组的过程)成对象
注意:一个项目中需要序列化的对象可能不一只一个类对象,序列化与反序列化就需要一个常量充当加密与解密的密钥。通过该常量密钥保证序列化与反序列化的结果保证一致。该常量密钥可以自定义。
字符流:流的内容是字符(只能操作纯文本文档(字符串))
输出流:从内存到硬盘
输入流:从硬盘到内存
Reader:父类抽象类:
FileReader
public int read(); 一次读取一个字符,读取不到返回-1
public int read(char[] c); 一次读取一个字符数组,读取不到返回-1
一次读取length个字符,读取到的内容存在数组的index下标,返回实际读取到的长度,读取不到返回-1
public int read(char[] c,int index,int length);
Writer:父类抽象类:
FileWriter:
public void write(int c) 一次写一个字符,写入文件
public void write(char[] c) 一次写一个字符数组,写入文件
一次写一个字符数组,从下标位index开始写length个长度
public void write(char[] c,int index,int length)
public void write(String a) 一次写一个字符串
BufferedWriter:缓冲字符流:针对Writer子类进行优化,
public void write(String a) 一次写一个字符串
public void newLine() 换行
BufferedReader:缓冲字符流:针对Reader子类进行优化,
public String readLine() 一次读取一行,读取不到返回null
数据转换流:重点在于将将字节流转成字符流,不在于读写内容
OutputStreamWriter
InputStreamReader
File f1 = new File("g:\\aaa\\1.txt");
FileOutputStream fos = new FileOutputStream(f1);
//数据转换流:将字节流转成字符流
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);
FileInputStream fis = new FileInputStream(f1);
//数据转换流:将字节流转成字符流
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
sql注入:在执行sql语句时,sql语句的参数包含了sql语句的关键字,会产生sql注入,会影响sql数据。
要执行的sql:
String sql = "select * from card where cnum='"+cnum+"' and cpwd='"+cpwd+"'";
键盘输入账号随便,密码:' or 1='1
结果:select * from card where cnum='abc' and cpwd='' or 1='1'
防止sql注入:就是使用Statement对象的子类:PreparedStatement方式sql注入