抽象类与接口
什么是抽象类?
有一些类没有必要实例化,实例化没有意义,它可以封装通用
的业务代码
Animal -- 没有必要实例化
Dog
Cat
Fish ...
抽象类用abstract修饰
抽象方法:用abstract修饰的方法,只有方法的声明,没有方法的实现
在子类中实现抽象方法
一个子类继承抽象类,就必须实现抽象中中声明的所有抽象方法,否则
这个子类也必须声明为抽象类
案例:写Cat类,继承Animal,测试
侧重点在代码重用
什么是接口?
更加纯粹的抽象类,将抽象类中非抽象的因素都剥离了,专注于
顶层设计
接口中只能由两种成员
a. public abstract 修饰的方法
b. public static final 修饰的变量 -->常量
侧重点在设计对象
一个类只能继承一个一般类或者抽象类
但是一个类可以实现多个接口(变相的实现了多继承)
接口可以继承接口,而且是多继承
异常
什么是异常?
程序在运行是发生的错误
异常发生的时候虚拟机(JVM)会将异常信息封装成对象
异常信息: a. 异常消息(对异常简明扼要的描述)
b.异常堆栈信息(异常因果的回溯)
异常的体系结构
Throwable
Error(程序不用处理)
Exception
--运行时异常 RuntimeException,可以处理,也可以不处理
--检查异常(除开运行时异常以外的所有异常),必须处理
异常的处理
抛出:抛给异常发生代码的调用者
捕获:
try{
//异常可能发生的代码
}catch(Exception e){//e是异常的引用
e.printStackTrace();//打印异常堆栈信息
}finally{
//不论异常发生与否,都必须执行的代码
//一般用来释放资源
}
自定义异常(针对具体业务逻辑)
案例:年龄异常案例
java.lang包
包装类型 (统计字符案例)
基本类型 包装类型
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character
案例:从控制台输入一个字符串
"hello123ABC##@@"
统计由多少个大写字母,小写字母,数字,其他字符
char ch = charAt(3)
'a'=<ch<='z'
'A'=<ch<='Z'
'0'=<ch<='9'
else..
Object(equals()方法)
java根类,所有的类都直接或者间接继承于Object类
==比较的是地址值
equals()方法比较是对象的内容
创建一个必须重写从Object继承过来的equals()方法,才能比较
对象的内容
如何重写equals()方法
String类型(indexOf ,lastIndexOf() )
(将输入的多个英文名转换为"Tom"的形式)
tom TOM toM ...
字符串一但创建就不可改变,所有的拼接和修改都是创建新的对象
如果频繁的拼接或修改,会产生大量的中间对象,造成内存溢出
StringBuffer(判断回文,拼接sql)
可变字符串
java.util包
Date
分装了日期于时间的信息
日期:年 月 日
时间:时 分 秒 毫秒
Date date = new Date();//当前系统时间
SimpleDateFormat
格式器:用来定义Date对象的格式
yyyy -- 年
MM -- 月
dd -- 日
HH 24小时制时
hh 12小时制时
mm 分
ss 秒
Calendar (打印日历,打印全年日历)
打印当前月的日历
抽象类
package demo03;
public abstract class Animal {//抽象类
private String name;
private int age;
public Animal(){}
public Animal(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//eat() ---设计为抽象方法
public abstract void eat();
//sleep()..
public abstract void sleep();
}
package demo03;
public class TestAnimal {
public static void main(String[] args) {
//抽象类不能创建对象(实例化)
//抽象类有没有构造方法? 有
//留给子类的构造方法调用
//Animal an = new Animal();
//抽象类可以创建上转型对象
Animal dog = new Dog("旺财",1);
dog.eat();
dog.sleep();
Animal cat = new Cat("花花",2);
cat.eat();
cat.sleep();
}
}
package demo03;
public class Dog extends Animal{
public Dog() {
super();
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("小狗"+getName()+"在啃骨头");
}
@Override
public void sleep() {
System.out.println("小狗"+getName()+"白天在睡觉");
}
}
package demo03;
public class Cat extends Animal {
public Cat() {
super();
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("小猫"+getName()+"在吃东西");
}
@Override
public void sleep() {
System.out.println("小猫"+getName()+"在屋顶上睡觉");
}
}
接口 |多继承
package demo04;
public interface IEat {
// public static final int a = 1 ;
void eat();
}
package demo04;
public interface IFlying {
void flying();
}
package demo04;
public interface ISleep {
void sleep();
}
package demo04;
public interface ISwimming {
void swimming();
}
package demo04;
public interface ISome extends IFlying ,ISwimming,IEat,ISleep{
}
package demo04;
public class Cat implements IEat,ISleep{
private String name;
private int age;
public Cat() {
super();
// TODO Auto-generated constructor stub
}
public Cat(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void eat() {
System.out.println("小猫"+this.name+"在吃鱼");
}
@Override
public void sleep() {
System.out.println("小猫"+this.name+"在屋顶上睡觉");
}
}
package demo04;
public class Bird implements ISome {
@Override
public void flying() {
//xxx
}
@Override
public void swimming() {
// TODO Auto-generated method stub
}
@Override
public void eat() {
// TODO Auto-generated method stub
}
@Override
public void sleep() {
// TODO Auto-generated method stub
}
}
异常 try-catch
package demo05;
public class Demo01 {
public static void main(String[] args) {
test();
//java.lang.ArithmeticException
}
public static void test(){
int a = 10;
a = a/0; //除零异常
}
}
package demo05;
public class Demo02 {
public static void main(String[] args) throws ClassNotFoundException {
try {
//可能发生异常的代码
Class.forName("java.lang.String");
System.out.println("异常后的代码");
} catch (ClassNotFoundException e) {
//处理异常的代码
e.printStackTrace();
throw e;
}
System.out.println("try catch 后的代码");
}
}
自定义异常 try-catch-finally
package demo05;
public class Emp {
private int id;
private String name;
private int age;
private String sex;
private float sal;
private String dept;
public Emp() {
super();
}
public Emp(int id, String name, int age, String sex, float sal, String dept)
throws AgeException {
super();
this.id = id;
this.name = name;
if(age<18 || age>60){
throw new AgeException("合法年龄:18~60");
}
this.age = age;
this.sex = sex;
this.sal = sal;
this.dept = dept;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws AgeException {
if(age<18 || age>60){
throw new AgeException("合法年龄:18~60");
}
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public float getSal() {
return sal;
}
public void setSal(float sal) {
this.sal = sal;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
}
package demo05;
public class TestEmp {
public static void main(String[] args) {
try {
Emp e = new Emp(1,"eric",20,"男",20000,"java开发部");
e.setAge(300);
System.out.println("异常没有发生");
} catch (AgeException e) {
e.printStackTrace();
System.out.println("异常发生了");
}finally{
//不论异常发生与否,都必须执行的代码
//一般用来释放资源
System.out.println("finally");
}
}
}
package demo05;
//здЖЈвхвьГЃ
public class AgeException extends Exception{
public AgeException(String message) {
super(message);
}
}
equals() 重写equals()方法 搜索字符串
package demo06;
public class Demo03 {
//equals()方法
public static void main(String[] args) {
/*
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1==s2);//false --比较地址值
System.out.println(s1.equals(s2));//true --比较对象的内容是否相同*/
Employee e1 = new Employee(1,"eric","男",24,20000,"前端开发部");
Employee e2 = new Employee(1,"eric","男",24,20000,"前端开发部");
System.out.println(e1==e2);//false
System.out.println(e1.equals(e2));//true
}
}
package demo06;
public class Demo04 {
public static void main(String[] args) {
String str = "java是一名面向对象的语言,java语言基于面向对象思想"
+ "通过学习java语言,可以加深对面向对象思想的理解";
//搜索第一个java的位置
int idx = str.indexOf("java",0);
System.out.println(idx);
//搜索第二个java的位置
idx = str.indexOf("java",idx+1);
System.out.println(idx);
//搜索倒数第一个面向对象
int idx2 = str.lastIndexOf("面向对象");
System.out.println(idx2);
//搜索倒数第二个面向对象
idx2 = str.lastIndexOf("面向对象", idx2-1);
System.out.println(idx2);
}
}
package demo06;
import java.util.Arrays;
import java.util.Scanner;
public class Demo05 {
/**
* (将输入的多个英文名转换为"Tom"的形式)
tom TOM toM ...
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] arr = new String[3];
for (int i = 0; i < 3; i++) {
System.out.print("请输入第"+(i+1)+"个英文名:");
arr[i] = sc.nextLine();
}
System.out.println(Arrays.toString(arr));
for (int i = 0; i < arr.length; i++) {
String name = arr[i];
//(name.charAt(0)+"").toUpperCase() 首字符大写
//name.substring(1).toLowerCase(); 其余字符小写
arr[i] = (name.charAt(0)+"").toUpperCase() +name.substring(1).toLowerCase();
}
System.out.println(Arrays.toString(arr));
}
}
package demo06;
public class Employee {
private static final Object Employee = null;
//私有的成员变量
private int id;
private String name;
private String sex;
private int age;
private float salary;
private String dept;
//空参的构造方法
public Employee() {
super();
// TODO Auto-generated constructor stub
}
//有参的构造方法
public Employee(int id, String name, String sex, int age, float salary, String dept) {
super();
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.salary = salary;
this.dept = dept;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
//展示员工信息
public void printInfo(){
System.out.println(id+","+name+","+sex+","+age+","+salary+","+dept);
}
//加薪
public void addSalary(float salary){
this.salary += salary;
}
//重写equals()方法
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Employee other = (Employee) obj;
if (age != other.age)
return false;
if (dept == null) {
if (other.dept != null)
return false;
} else if (!dept.equals(other.dept))
return false;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (Float.floatToIntBits(salary) != Float.floatToIntBits(other.salary))
return false;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return true;
}
/*
@Override
public boolean equals(Object obj) {
if(obj==null){
return false;
}
if(obj==this){
return true;
}
if(!(obj instanceof Employee)){
return false;
}
Employee other = (Employee)obj;
return this.id==other.id && this.name.equals(other.name)
&& this.sex.equals(other.sex) && this.age==other.age
&& this.salary==other.salary && this.dept.equals(other.dept);
}*/
}
包装类型(统计字符数量)/ hashCode() StringBuffer/ pingSQL/打印时间/2018年美式日历
包装类型(统计字符数量)
package demo06;
public class Demo01 {
/**
* 包装类型
*/
public static void main(String[] args) {
//构造方法创建对象
Integer i = new Integer("10");
System.out.println(i);
//可以接受空值
i = null;
//包装类型和基本类型之间可以自由转换
//自动装箱
Integer a = 20;// new Integer(20);
//自动拆箱
int b = new Integer(30);
//可以将字符串解析成数值类型
int num = Integer.parseInt("666");
System.out.println(num);
Integer num2 = Integer.valueOf("888");
System.out.println(num2);
}
}
package demo06;
import java.util.Arrays;
import java.util.Scanner;
public class Demo02 {
/**
* 案例:从控制台输入一个字符串
"hello123ABC##@@"
统计由多少个大写字母,小写字母,数字,其他字符
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个字符串:");
String str = sc.nextLine();
int[] counts = new int[4];
//将字符串str拆成一个字符数组
char[] chs = str.toCharArray();
//System.out.println(Arrays.toString(chs));
for(char c:chs){
if(Character.isUpperCase(c)){//判断是否为大写字母
counts[0]++;
}else if(Character.isLowerCase(c)){//小写字母
counts[1]++;
}else if(Character.isDigit(c)){//数字
counts[2]++;
}else{//其他字符
counts[3]++;
}
}
System.out.println("大写字母:"+counts[0]);
System.out.println("小写字母:"+counts[1]);
System.out.println("数字:"+counts[2]);
System.out.println("其他字符:"+counts[3]);
}
}
hashCode() StringBuffer
package demo06;
public class Demo06 {
public static void main(String[] args) {
/*
String s = "hello";
System.out.println(s.hashCode());
s += "world";
System.out.println(s.hashCode());*/
StringBuffer s = new StringBuffer("hello");
System.out.println(s.hashCode());
System.out.println(s);
s.append("world");
System.out.println(s);
System.out.println(s.hashCode());
}
}
package demo06;
import java.util.Scanner;
public class Demo07 {
/**
* 从控制台输入一个字符串
* 判断它是否是回文
* 上海自来水来自海上
* @param args
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个回文:");
String str = sc.nextLine();
StringBuffer s = new StringBuffer(str);
//反过来再转回字符串
String str2 = s.reverse().toString();
if(str.equals(str2)){
System.out.println("是回文");
}else{
System.out.println("不是回文");
}
}
}
pingSQL
package demo06;
import java.util.Scanner;
public class Demo08 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入姓名:");
String name = sc.nextLine();
System.out.print("请输入年龄:");
String age = sc.nextLine();
String sql = pingSQL(name,age);
System.out.println(sql);
}
private static String pingSQL(String name, String age) {
StringBuffer s = new StringBuffer("select * from emp where 1=1");
if(name!=null && !"".equals(name)){
s.append(" and name like '%"+name+"%'");
}
if(age!=null && !"".equals(age)){
s.append(" and age="+age);
}
return s.toString();
}
}
打印时间
package demo06;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo09 {
public static void main(String[] args) {
Date d = new Date();
//Tue Jul 17 16:37:01 CST 2018
//2018年7月17日 16时37分xx秒
System.out.println(d);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 a HH时mm分ss秒");
String dateStr = sdf.format(d);
System.out.println(dateStr);
}
}
package demo06;
import java.util.Calendar;
public class Demo10 {
public static void main(String[] args) {
//创建一个日历对象
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
System.out.println(year);
int month= cal.get(Calendar.MONTH);
//月:0~11 1月~12月
System.out.println(month);
int date = cal.get(Calendar.DATE);
//1~31
System.out.println(date);
//将2018年修改为2016年
cal.set(Calendar.YEAR, 2016);
//时间偏移方法
//7月-->5月
cal.add(Calendar.MONTH,-2);
//17日-->20日
cal.add(Calendar.DATE, 3);
}
}
打印本月日历
package demo06;
import java.util.Calendar;
public class Demo11 {
/**
* 打印本月日历
* @param args
*/
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
//将时间移动到本月的第一天
cal.set(Calendar.DAY_OF_MONTH, 1);
//本月第一天在所在周是第几天
int start = cal.get(Calendar.DAY_OF_WEEK);
//打印日历头
System.out.println("日\t一\t二\t三\t四\t五\t六");
//System.out.println(start);
for (int i = 1; i <=7*6; i++) {
if(i<start){
System.out.print("\t");
continue;
}
//打印日历
System.out.print(cal.get(Calendar.DATE)+"\t");
//打印7个空一行
if(i%7==0){
System.out.println();
}
//判断是否已经到了本月的最后一天
if(cal.get(Calendar.DATE) == cal.getActualMaximum(Calendar.DAY_OF_MONTH)){
break;
}
//日期的值增加1天
cal.add(Calendar.DATE, 1);
}
}
}
2018年美式日历
package demo06;
import java.util.Calendar;
public class Demo12 {
//打印2018年全年的日历
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2018);
System.out.println("\t\t\t2018年日历\t\t\t");
for (int i = 0; i < 12; i++) {
System.out.println("*************"+(i+1)+"月份***************");
cal.set(Calendar.MONTH,i );
generateCal(cal);
}
}
private static void generateCal(Calendar cal) {
//将时间移动到本月的第一天
cal.set(Calendar.DAY_OF_MONTH, 1);
//本月第一天在所在周是第几天
int start = cal.get(Calendar.DAY_OF_WEEK);
//打印日历头
System.out.println("日\t一\t二\t三\t四\t五\t六");
//System.out.println(start);
for (int i = 1; i <=7*6; i++) {
if(i<start){
System.out.print("\t");
continue;
}
//打印日历
System.out.print(cal.get(Calendar.DATE)+"\t");
//打印7个空一行
if(i%7==0){
System.out.println();
}
//判断是否已经到了本月的最后一天
if(cal.get(Calendar.DATE) == cal.getActualMaximum(Calendar.DAY_OF_MONTH)){
break;
}
//日期的值增加1天
cal.add(Calendar.DATE, 1);
}
System.out.println();
}
}