1.关键字final [最终的]
this
super
abstract
A.修饰变量[存值,传值]:
基本数据类型变量: final int A=9; 变量的数值不可以变。
引用数据类型变量: 变量的内存地址不可以变。
final Student stu=new Student();
【补充:】
B.修饰方法:
子类继承后,不可以对final方法进行重写。
C.修饰类:
该类是最终类,没有子类,不可以继承该类。
2.接口 非常重要
为啥需要学习接口?
----解决了java是单继承的。
----因为接口可以多实现。【接口~抽象父类】
如何使用接口?
A.定义一个接口。
public interface Fly {
int A=9;
void fly();
static void eat(){
System.out.println("起飞前,先吃饱!");
}
default void clear(){
System.out.println("起飞前,先清扫!");
}
}
B.使用接口:
实现类 implements 接口名。
补充说明:
接口中的方法,尽量保持单一性,为了防止”接口污染“!
接口和抽象父类:
相同点:
1.接口不能实例化对象。(没有构造方法)
2.接口中大部分都是抽象方法。 程序会自动帮忙添加 public abstract 的。
抽象父类中 也可以有抽象方法。
不同点:
1.关键字不同: interface
abstract class
2.接口中没有变量,全都是public static final 修饰的静态常量。
3.实现接口用到的关键字:implements
继承父类用到的关键字:extends
----继承父类在前,实现接口在后。
4.接口中,还可以写static ,default修饰的,带有方法体的非抽象方法。
5.接口可以多实现, 父类只能单继承。
思考:抽象父类,接口
功能/能力这个方法?
继承父类:当前对象 is 父类
实现接口: 当前对象 has 能力
3.内部类(了解)===当前是为了解决java的单继承问题。
public class Demo1{
static class Demo2{
}
public void show(){
class Demo3{
}
}
}
4.单例模式:
模式 32 经典设计模式! ===工厂模式,代理模式,,,
模式就是一种解决方案。
单例模式解决的问题是:当前类 只能 有且只有 一个对象。
1. 构造方法是private ----
2.本类创建唯一对象
3.本类提供public方法,为外界访问该对象。
5.多态 ----是为了功能的扩展。 118功能,3 2,3
多:多个
态:做事情时候的表现形态。
多态:在做同一件事情的时候,有多个不同的表现形态。
多态发生的前提条件:继承,方法重写,【声明父类new子类】 Animal animal=new Dog():
学习多态的原因?
动物类: Dog Pig ---父类 Animal类 eat()
饲养员类: 喂Dog()---
喂Pig();---
补充:
多态的效果:在编码期,以父类作参数(这样,该方法适合所有的子类对象,扩展性达到最好);
在运行期,会根据实际传入的子类对象,动态调用子类对应的重写方法。
多态也叫“动态绑定”
5.1 多态的两个应用场合:
父类做参数:
父类做返回值类型;
5.2 多态中涉及到的类型转换:
自动类型转换:小类型转大类型
Animal animal=new Dog(); ----只能调用继承父类的,或者是重写父类的。
===如果想调用子类特有的方法,需要对对象进行强制类型转换。
强制类型转换:大类型 转小类型
Dog dog=(Dog)animal;
===为了防止强制类型转换错误,先判断,在转换。
if(animal instanceof Dog){
Dog dog=(Dog)animal;
dog.leapWall();
}
下面的也是笔记,比上面的笔记多了一点东西
package com.jr.biji;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
public class biji {
public static void main(String[] args) {
}
/*
一,关键字final 最终的 属于方法修饰符
1.修饰变量:
基本数据类型变量:final int A=9;变量的值不可以变
引用数据类型:变量的内存地址不可以变
补充:变量{存值,传值}
2,修饰方法:
子类继承后,不可以对final方法进行重写
3.修饰类:
该类是最终类,没有子类,不可以继承该类
二,接口
1,原因:解决java是单继承的,
因为接口可以多实现 【接口≈抽象父类】
2,使用:
1,定义一个接口
int A=0;
该方法,用于实现飞的功能
不需要参数提供,没有返回值
void fly();
static void eat(){
System.out.println("起飞前,先吃");
}
default void clear(){
System.out.println("起飞前,先清扫");
}
2.实现类 implement 接口名
补充:接口中的方法,要尽可能保持单一性,为了避免“接口污染”
3.接口和抽象父类
相同点:
1.接口不能实例化对象,接口没有构造方法(接口不是类,只有类才有构造方法)
2.接口中大部分都是抽象方法,也可以有带方法体的静态方法
抽象父类中,也可以有抽象方法
不同点:
1.关键字不同:
interface
abstract class
2.接口中没有变量,只有public static final 修饰的静态常量
3.实现接口用到的关键字是implement
继承父类用到的关键字是extends
继承父类在前,接口在后,多个接口要用,隔开
4.接口中,除了抽象方法外,还可以写 static,default修饰的带有方法体的非抽象方法
5.接口可以多实现,父类只能单继承
功能/能力这个方法:
继承父类:
接口:
三,内部类(了解)---->当时是为了解决java的单继承问题
一个类里面套另一个类
public class Demo1{
public class Demo2{
demo2是demo1的内部类
}
}
四,单例模式:
模式:就是一种解决方案
32 经典设计模式!---较重要(单例模式,工厂模式,代理模式)
单例模式解决的问题是:当前类只能有且只有一个对象
1.单例模式构造方法是private
2.该单例对象必须由单例类自行创建;
3.单例类对外提供一个访问该单例的全局访问点。简单说就是单例类中有一个静态方法可以获取单例对象。
五,多态----->功能的扩展 多态只能调用重写方法
什么是多态:同一个父类下,不同的子类再做同一行为的时候,有不同的表现形式就是多态
多:多个
态:做事情时候的表现形态
多态:在做同一件事情的时候,有多个不同的表现形态
多态发生的前提条件:
继承父类/实现接口,方法重写之后还要有{声明父类new子类}Animal animal=new Dog();
声明 父类 new 子类
学习多态的原因(多态的作用):
----极大的提高了代码的扩展性
补充:
多态的效果,在编码期,以父类做参数(这样,该方法适合所有的子类对象,扩展性达到最好)
在运行期,会根据实际传入的子类对象,动态调用子类对应的重写方法
多态也叫“动态绑定”
1.多态的两个应用场合(两种表现形式):
父类做参数:---代码的扩展性达到极致
父类做返回值类型:---提高了代码的扩展性,但是没有达到极致
---反射可以解决父类做返回值时,扩展性没有达到极致的问题
2.多态的使用场合:
有两条业务线,其中一条是继承业务线
在第二条业务线中,一种一个方法,是继承线的父类在做参数或者做返回值
方法体中,传入的实际参数调用重写的方法
3.Java中所有的数据类型都会涉及到类型转换
java中数据类型分为两种;基本数据类型:整数:byte 一个字节 short 2个 int4个 long8个
浮点:float4个 double8个
字符:char2个
布尔:boolear 1位
补充:1.Java中boolear 不参与基本数据类型的类型转换
2.byte short char 三者之间不进行类型转换,他们三个都是最小类型
3.基本数据类型,从小到大排列:
(byte shory char)<int<long<float<double
4.从小类型转大类型是自动类型转换
5.大类型转小类型是强制类型转换
小类型 名=(小类型名)大类型
int b=(int)double;
引用数据类型:
1.不是所有的引用类型变量,都可以做数据转换
引用数据类型转换,只有两种:向上类型转换,向下类型转换
1.向上类型转换发生在多态,声明父类 new 子类
----声明父类 new 子类 生成的对象有弊端,不能调用子类特有的行为/能力(方法)
2.向下类型转换:
Dog dog=(Dog)animal; dog可以调用子类特有的方法 dog在之前已经向上转换为父类类型
---隐患:可能会存在向下类型转换错误
---解决:instanceof
if(对象 instanceof 类型){//判断对象是该类型下的吗
}
4.多态中涉及到的类型转换:
1.自动类型转换:小类型转大类型 向上转型
Animal animal=new Dog();---->animal只能调用继承父类的,或者是重写父类的方法
如果想要调用子类特有的方法,需要对对象进行强制类型转换
2.强制类型转换:大类型转小类型 向下转型
Dog dog=(Dog)animal;
为了防止强制类型转换错误,需要先判断,再转换 instanceof 判断该对象是否是这个类下的
if(animal instanceof Dog){
Dog dog=(Dog)animal;
dog.leapWall();
}
六,简单工厂设计模式:
要求:
1,定义一个static方法,通过类名直接调用
2,返回值类型是父类类型,返回的可以是其任意子类类型
3,传入一个字符串类型的参数,工厂根据参数创建对应的子类产品
解决的问题:
解决大量对象创建问题的一个解决方案
七常用类:
1,[Object类]
所有类都直接或间接的继承自Object类,Object类是所有Java类的根基类。
也就意味着所有的Java对象都拥有Object类的属性和方法。
隐式:---Object
显示:extends 类名
包:在java.long下,【该包很特殊,程序会自动帮忙导入该包下的所有类】
构造器:无参构造,Object();
属性:无
方法:
1,toString();---将当前内存对象,转成字符串形式,返回给调用者
return getClass().getName() + "@" + Integer.toHexString(hashCode());
com.jr.date725.Student @ 140e19d
--重写对象时,更希望获得该对象的所有属性信息,而不是内存地址,所以需要重写toString方法
equalst();====在Object类中,原本是比较地址的,开发者希望该方法用于属性值,所以要进行重写。
public boolean equals(Object obj) {
return (this == obj);
}
hashCode();==== equalst()如果确定两个对象是相等的话,那么两个对象的hash值也应该相同,
所以hashCode方法也进行重写。
public int hashCode() {
//return Objects.hash(stuid, stuname, phone);
return stuid+stuname.hashCode()+phone.hashCode();
}
【重点:HashSet 集合 ----去重功能:
去重原理:首先比较两个对象的hash值是否相等,
如果hash值不等,可以存储;
如果hash值相等,在使用equalst()方法比较两个对象的属性是否都相等,
如果属性都相等,不可以存储
如果属性不相等,可以存储。
2,【包装类】
八个基本数据类型,分别有对应的包装类
原因:1,基本数据类型不具备面向对象思想(希望用 对象.方法()来解决问题)
2,集合≈数组 集合只能存储引用数据类型变量
int----Integer;
自动拆装箱: 基本数据--->包装类型==装箱
int a=9;
Integer i=new Integer(9);这个过程为包箱
拆箱:包装类型---->基本数据
XXXXValue();
String---基本类型之间的转换:
int c=Integer.parseInt("123");
基本类型----String类型转换:
Integer i1=new Integer(d);
System.out.println(i1.toString()+4);
System.out.println(d+"");
3,【字符串处理类】
java中准备的字符串处理类一共有三类:
String:不可变的字符串 是final修饰的 final char[]
一个内存地址只对应一个值---不可变 final修饰一个引用数据类型时,表示的是内存地址不可变,但值可变
StringBuffer:可变的字符串,线程安全的字符串,但效率低
StringBuilder:可变的字符串,线程不安全的字符串,但效率高
【可变】指一个内存地址可以对应多个值
【String类】
1,在哪个包下 java.long
2,继承结构,实现结构
3,构造方法有哪些
4,常用的属性有哪些
5,常用的方法有哪些,并且怎么用
All Implemented Interfaces: 已实现的接口:
Serializable , CharSequence , Comparable < String >
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence
concat(String str) 拼接
contains(CharSequence s) 判断元素是否存在。
indexOf(int ch) 根据元素找下标
lastIndexOf
length(); 获得字符串长度的方法。
String A="1234";
String B="5678";
System.out.println(A.compareTo(B));//比较A和B的大小
System.out.println(A.charAt(1));//根据下标返回元素
String C=A.concat("56");//拼接
System.out.println(A.length());//返回字符串的长度
System.out.println(C.length());
System.out.println(A.contains("3"));//判断元素是否存在
System.out.println(A.indexOf(2));//根据元素返回下标
System.out.println();
//lastIndexOf(String str, int fromIndex)
//返回指定子字符串的最后一次出现的字符串中的索引,从指定索引开始向后搜索。
//split(String regex)
//将此字符串分割为给定的 regular expression的匹配。
String [] split=A.split("2");//从2拆分,返回前后两个字符串
System.out.println(Arrays.toString(split));
//substring(int beginIndex) 截取字符串中的一段
//返回一个字符串,该字符串是此字符串的子字符串。
String id="210381";
System.out.println(id.substring(2,4));//前面包含,后面不包含
System.out.println(id.substring(2));//从2开始往后全截
【StringBuffer类】----不管内容怎么改变,地址始终都不变。
StringBuffer stringBuffer=new StringBuffer("asdfg");
StringBuffer stringBuffer1=stringBuffer.append("000");
System.out.println(stringBuffer.length());
System.out.println(stringBuffer==stringBuffer1);
stringBuffer.replace(0,3,"666");
System.out.println(stringBuffer);
[时间日期类]
1.第一阶段:时间日期类
java.util.Date
Date dt=new Date();
//当前系统时间, 西方国家的默认格式。
dt: 2024 -年
CST --时区
15:44:58 时 分 秒
25 ---日
Jul---月
Thu---星期
1,java.util.Date 有无参构造
Date dt=new Date();//当前系统时间,西方国家的默认格式
System.out.println(dt);
System.out.println("年:"+dt.getYear());//弃用,不推荐使用,但也能用 从1900年开始算
System.out.println("月:"+dt.getMonth());//实际月份等于输出月份加一
System.out.println("日:"+dt.getDate());
System.out.println("时:"+dt.getHours());
System.out.println("分:"+dt.getMinutes());
System.out.println("秒:"+dt.getSeconds());
System.out.println("星期:"+dt.getDay());
dt.setYear(124);
dt.setMonth(8);
dt.setDate(1);
System.out.println(dt);
dt=new Date(dt.getTime());
System.out.println(dt);
2,java.sql.Date
java.util.Date 与 java.sql.Date 区别:
1.java.sql.Date 没有无参构造
2.java.util.Date 可以存储和获得 年月日,时分秒
java.sql.Date 只能存储和获得 年月日。
3.java.sql.Date 是子类
java.util.Date 是父类
3,DateFormat 时间的格式化类
Date dt=new Date();
System.out.println(dt);
//希望年月日之间是/,时分秒之间是:
DateFormat df=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//DateFormat抽象类,不能new自己,所以new它的子类SimpleDateFormat
System.out.println(df.format(dt));
2,第二阶段时间:
第一阶段中时间类型的方法已经弃用了
jdk推荐使用Calendar类,进行时间管理
Calendar日历类
public static void test5(){
//1.接收
System.out.println("请输入一个时间(年-月-日)");
String str=new Scanner(System.in).next();
//2.转换:String---calender
java.sql.Date dt=java.sql.Date.valueOf(str);
Calendar calendar=Calendar.getInstance();//calendar 是当前系统时间。
calendar.setTime(dt);//calendar 代表 用户输入的时间。
//3.1 获得输入月份有多少天?
int days=calendar.getActualMaximum(Calendar.DATE);//获得该月份的最大日期。
//3.2 获得输入月份的1号是星期几?
calendar.set(Calendar.DATE,1);
int num=calendar.get(Calendar.DAY_OF_WEEK); //获得的是,本周当中的第几天,而不是星期几。
//4.输入日历:
System.out.println("日\t一\t二\t三\t四\t五\t六\t");
for(int i=1;i<=num-1;i++){
System.out.print("\t");
}
for (int i=1;i<=days;i++){
System.out.print(i+"\t");
calendar.set(Calendar.DATE,i);
if(calendar.get(Calendar.DAY_OF_WEEK)==7){
System.out.println();
}
}
}
【异常处理机制】:处理程序向外报错的
作用:---保证程序不会因为一点小问题就终止,而是还可以正常运行下去
保证程序不终止的两种解决方案:
第一种:这个问题,我能解决
tyr{ 监控异常
}catch{ 捕获异常
}finally{ 善后异常
}
try中代码没有问题,不执行catch块,执行finally
try中代码有问题,执行类型匹配的catch块,执行finally
没有找到类型匹配的catch块,执行finally,程序再终止
第二种:这个问题,我解决不了
声明异常:throws 异常类型
public static void meno2() throws ArrayIndexOutOfBoundsException{
System.out.println("程序第1行");
System.out.println("程序第2行");
System.out.println("程序第3行");
int[] as=new int[10];
System.out.println(as[10]);
int a=0;
System.out.println(9/a);
System.out.println("程序第4行");
System.out.println("程序第5行");
System.out.println("程序第6行");
}
异常处理机制中有五个关键字;try,catch,finally,throws,throw
throw:自己制造一场异常?
原因:提醒调用者重视这个问题,throw new NullPointerException("年龄的合适范围是0-100");
自定义异常类型:
public class AgeException extends Exception {
public AgeException(String info){
super(info);
}
}
*/
}
多态练习:
例一:
里面包含了动物类,和测试类,注意下面代码不要放在同一个类中
//Animal类
package com.jr.date724.duotai.dongwuyuan;
public abstract class Animal {
public abstract void eat();
}
//Bird类
package com.jr.date724.duotai.dongwuyuan;
public class Bird extends Animal {
@Override
public void eat() {
System.out.println("小鸟吃谷子");
}
}
//Breeder类
package com.jr.date724.duotai.dongwuyuan;
public class Breeder {
/*
public void feed(Dog dog){
dog.eat();
}
public void feed(Pig pig){
pig.eat();
}
*/
public void feed(Animal animal){
animal.eat();
if(animal instanceof Dog){
Dog dog=(Dog)animal;
dog.leapWall();
}
}
}
//Dog类
package com.jr.date724.duotai.dongwuyuan;
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("小狗吃骨头");
}
public void leapWall(){
System.out.println("急了");
}
}
//pig类
package com.jr.date724.duotai.dongwuyuan;
public class Pig extends Animal {
@Override
public void eat() {
System.out.println("小猪吃蔬菜");
}
public void jump(){
System.out.println("上树");
}
}
//Test类
package com.jr.date724.duotai.dongwuyuan;
public class Test {
public static void main(String[] args) {
Breeder breeder=new Breeder();
Pig pig=new Pig();
breeder.feed(pig);
breeder.feed(new Dog());
Bird bird=new Bird();
breeder.feed(bird);
Animal animal=new Dog();//向上类型转换,自动类型转换,小类型转大类型会发生自动类型转换 不能调用子类特有的方法
Dog dog2=(Dog) animal;//向下类型转换,强制类型转换
}
}
例二:
披萨制作
//工厂类
package com.jr.date724.duotai.pisaizhizao;
import java.util.Scanner;
public class GongChang{
public GongChang() {
}
public PiSa work(){
Scanner input = new Scanner(System.in);
System.out.println("请选择想要制作的披萨:(1.培根披萨,2海鲜披萨)");
int i = input.nextInt();
PiSa piSa=null;
if(i==1) {
System.out.println("请输入培根克数:");
double keShu = input.nextDouble();
System.out.println("请输入披萨大小:");
int size = input.nextInt();
System.out.println("请输入披萨价格:");
double jiage = input.nextDouble();
piSa = new PeiGen("培根披萨", jiage, size,keShu);
}else{
System.out.println("请输入配料信息:");
String peiLiao = input.next();
System.out.println("请输入披萨大小:");
int size = input.nextInt();
System.out.println("请输入披萨价格:");
double jiage = input.nextDouble();
piSa = new HaiXian("海鲜披萨", jiage, size,peiLiao);
}
return piSa;
}
}
//海鲜配料类
package com.jr.date724.duotai.pisaizhizao;
public class HaiXian extends PiSa{
private String peiliao;
public HaiXian(String name, double jiage, int size, String peiliao) {
super(name, jiage, size);
this.peiliao = peiliao;
}
public HaiXian(String peiliao) {
this.peiliao = peiliao;
}
public HaiXian(String name, double jiage, int size) {
super(name, jiage, size);
}
public HaiXian() {
}
@Override
public void show() {
System.out.println("名称:"+getName());
System.out.println("价格:"+getJiage());
System.out.println("大小:"+getSize());
System.out.println("配料:"+peiliao);
System.out.println("披萨工厂制造了一个海鲜披萨!");
}
}
//培根配料
package com.jr.date724.duotai.pisaizhizao;
public class PeiGen extends PiSa{
private double keshu;
public PeiGen(String name, double jiage, int size) {
super(name, jiage, size);
}
public PeiGen() {
}
public PeiGen(String name, double jiage, int size, double keshu) {
super(name, jiage, size);
this.keshu = keshu;
}
public PeiGen(double keshu) {
this.keshu = keshu;
}
@Override
public void show() {
System.out.println("名称"+getName());
System.out.println("价格:"+getJiage());
System.out.println("大小:"+getSize());
System.out.println("培根克数:"+keshu);
}
}
//披萨类
package com.jr.date724.duotai.pisaizhizao;
public abstract class PiSa {
private String name;
private double jiage;
private int size;
public PiSa(String name, double jiage, int size) {
this.name = name;
this.jiage = jiage;
this.size = size;
}
public PiSa() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getJiage() {
return jiage;
}
public void setJiage(double jiage) {
this.jiage = jiage;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public abstract void show();
}
//Test类
package com.jr.date724.duotai.pisaizhizao;
public class Test {
public static void main(String[] args) {
GongChang gongChang=new GongChang();
PiSa piSa=gongChang.work();
piSa.show();
}
}
接口例题
例一:
//Bird类
package com.jr.date724.jiekou1;
public class Bird implements Fly{
@Override
public void fly() {
System.out.println("通过体能转换为动能,扇动翅膀,飞起来!");
}
}
//注意下面这个是一个接口
package com.jr.date724.jiekou1;
public interface Fly {
int A=0;
/*
该方法,用于实现飞的功能
不需要参数提供,没有返回值
*/
void fly();
static void eat(){
System.out.println("起飞前,先吃");
}
default void clear(){
System.out.println("起飞前,先清扫");
}
}
//Test类
package com.jr.date724.jiekou1;
public class Test{
public static void main(String[] args) {
}
}
例二:
//动物类
package com.jr.date724.jiekou2;
public abstract class DongWu {
private String name;
private String color;
private String leibie;
public DongWu(String color, String name, String leibie) {
this.name = name;
this.color = color;
this.leibie = leibie;
}
public DongWu() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getLeibie() {
return leibie;
}
public void setLeibie(String leibie) {
this.leibie = leibie;
}
public abstract void eat();
public abstract void jiao();
}
//青蛙
package com.jr.date724.jiekou2;
public class QingWa extends DongWu implements YouYong {
public QingWa(String color, String name, String leibie) {
super(color, name, leibie);
}
public QingWa() {
}
@Override
public void eat() {
System.out.println("青蛙是"+getLeibie()+",爱吃昆虫");
}
@Override
public void jiao() {
System.out.println("那只"+getColor()+"的,名叫"+getName()+"的青蛙正在呱呱的叫");
}
@Override
public void youyong() {
System.out.println("虽然不是鱼,但"+getName()+"也是游泳高手");
}
}
//兔子
package com.jr.date724.jiekou2;
public class TuZi extends DongWu{
public TuZi(String color, String name, String leibie) {
super(color, name, leibie);
}
public TuZi() {
}
@Override
public void eat() {
System.out.println("兔子是"+getLeibie()+",爱吃胡萝卜");
}
@Override
public void jiao() {
System.out.println("那只"+getColor()+"的,名字叫"+getName()+"的兔子"+"正在叽叽的叫");
}
}
//注意,下面是一个接口
package com.jr.date724.jiekou2;
public interface YouYong {
void youyong();
}
//Test类
package com.jr.date724.jiekou2;
public class Test {
public static void main(String[] args) {
TuZi tuZi=new TuZi("黑色","美人","哺乳类");
tuZi.jiao();
tuZi.eat();
System.out.println("****************************************************");
QingWa qingWa=new QingWa("绿色","大兵","非哺乳类");
qingWa.jiao();
qingWa.eat();
qingWa.youyong();
}
}