多态(同类型的对象表现出不同的形态)
1. 表现方式
父类类型 对象名称=子类对象
Fu f=new Zi
2. 前提
- 有继承/实现关系
- 有父类引用指向子类对象
- 需要有方法重写
3.调用成员的特点
变量调用 :编译看左边,运行也看左边
方法调用:编译看左边,运行看右边
编译看左边
java编译代码的时候,会看左边的父类中有没有这个变量(方法)如果有,编译成功 ,反之编译失败
运行看左边
Java运行代码的时候,实际获取的就是左边父类中成员变量的值
运行看右边
java运行代码的时候,实际运行的子类中的方法
Animal a=new Dog();
理解:用a去调用变量和方法,而a是父类,所以默认从父亲中去找
成员变量:在子类的对象中,会把父类的成员变量也继承
成员方法:如果子类对 方法重写,那么在虚方法表中会把父类进行覆盖
4.多态的优势和弊端
1)优势
- 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
eg:Person p =new Student ();
p.work();
在需要改变时,只需要改变 new Student()
- 定义为方法时,使用父类作为参数,可以接收所有子类对象,体现多态的扩展性和便利
2)弊端
- 不能使用子类特有的功能(因为编译时需要看父类是否有,若没有直接编译失败)
解决方法:引用数据类型转换
解决方法:引用数据类型转换
包括自动类型转换和强制类型转换
eg:Person p=new Student();
Student s=(Student) p;
强制类型转换可以转换成真正的子类类型,从而调用子类独有的功能
转换类型与真实对象类型不一致会报错
public class 多态中强制类型的转换
{
public static void main(String[]args)
{
Animal a=new dog();
System.out.println(a.name);
a.show();
dog d=(dog)a;
d.eat();
}
}
class Animal
{
String name="动物";
public void show()
{
System.out.println("动物show");
}
}
class dog extends Animal
{
String name="狗";
public void show()
{
System.out.println("狗show");
}
public void eat()
{
System.out.println("狗吃骨头");
}
}
5.instanceof 关键字(判断变量是不是类名的类型)
1)格式
变量名 instanceof 类名
eg: Animal a=new Dog();
if (a instanceof Dog){…}
6.代码练习(继承,多态综合)
public class Test01
{
public static void main(String []args)
{
/*Person p0=new Person ("老王",30);//赋值
Dog d=new Dog (2,"黑");//将参数的值传递给形参,再传递给父类Animal
p0.keepPet(d,"骨头");
Person p1=new Person ("老刘",30);
Cat c=new Cat(2,"白");
p1.keepPet(c,"鱼");*/
//优化
Person p=new Person ("老王",30);//赋值
Dog d=new Dog (2,"黑");//将参数的值传递给形参,再传递给父类Animal
Cat c=new Cat(2,"白");
p.keepPet(d,"骨头");
p.keepPet(c,"鱼");
Person p1=new Person ("老刘",30);
p1.keepPet(c,"鱼");
p1.keepPet(d,"骨头");
}
}
class Animal
{
private int age;
private String color;
public Animal(int age,String color)
{
this.age=age;
this.color=color;
}
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return age;
}
public void setColor(String color)
{
this.color=color;
}
public String getColor()
{
return color;
}
public void eat(String sth)
{
System.out.println("动物在吃"+sth);
}
}
class Dog extends Animal
{
public Dog(int age,String color)
{
super(age,color);
}
public void eat(String sth)//方法重写
{
System.out.println(getAge()+"岁的"+getColor()+"颜色的狗两只前腿死死的抱着"+sth+"猛吃");
}
public void lookhome()
{
System.out.println("狗看家");
}
}
class Cat extends Animal
{
public Cat(int age,String color)
{
super(age,color);
}
public void eat(String sth)//方法重写
{
System.out.println(getAge()+"岁的"+getColor()+"颜色的猫眯着眼睛侧着头吃"+sth);
}
public void catchMouse()
{
System.out.println("逮老鼠");
}
}
class Person
{
private String name;
private int age;
public Person (){}
public Person(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
/*public void keepPet(Dog dog,String sth)
{
System.out.println("年龄为"+age+"岁的"+name+"养了一只"+dog.getColor()+"颜色的"+dog.getAge()+"岁的狗");
dog.eat(sth);
}
public void keepPet(Cat cat,String sth)
{
System.out.println("年龄为"+age+"岁的"+name+"养了一只"+cat.getColor()+"颜色的"+cat.getAge()+"岁的猫");
cat.eat(sth);
}*/
//用多态进行优化
public void keepPet(Animal a,String sth)
{
if(a instanceof Dog )
{
Dog d=(Dog)a;
System.out.println("年龄为"+age+"岁的"+name+"养了一只"+d.getColor()+"颜色的"+d.getAge()+"岁的狗");
d.eat(sth);
}else if(a instanceof Cat )
{
Cat c=(Cat)a;
System.out.println("年龄为"+age+"岁的"+name+"养了一只"+c.getColor()+"颜色的"+c.getAge()+"岁的猫");
c.eat(sth);
}
}
}
抽象类和抽象方法
1. 抽象类和抽象方法
2.格式
3.注意事项
解释:
不能实例化:即不能创建对象
可有构造方法:虽然不能创建对象,但子类可通过构造方法调用super(),将值传递给父类的成员变量,给父类成员变量进行初始化,子类再继承过来就是自己对象的属性
public abstract class person //代码片段
{
public Person(String name,int age)
{
this .name=name;
this.age=age;
}
}
public class Student extends Person
{
public Student(String name,int age)
{
super (name,age);
}
}
4. 代码练习
public class test
{
public static void main(String []args)
{
frog f=new frog("小绿",1);
System.out.println(f.getName()+","+f.getAge());
f.eat();
f.drink();
}
}
abstract class Animal
{
private String name;
private int age;
public Animal(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public void drink()
{
System.out.println("动物在喝水");
}
public abstract void eat();
}
class frog extends Animal
{
public frog(String name,int age)
{
super(name,age);
}
public void eat()
{
System.out.println("青蛙吃虫子");
}
}
接口
1.定义和使用
2.接口中成员的特点
3.接口和类之间的关系
4.代码练习
public class test
{
public static void main(String []args)
{
frog f=new frog("小绿",1);
System.out.println(f.getName()+","+f.getAge());
f.eat();
f.swim();
}
}
abstract class Animal
{
private String name;
private int age;
public Animal(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public abstract void eat();
}
class frog extends Animal implements swim
{
public frog(String name,int age)
{
super(name,age);
}
public void swim()
{
System.out.println("青蛙在蛙泳");
}
public void eat()
{
System.out.println("青蛙吃虫子");
}
}
interface swim
{
public abstract void swim();
}
权限修饰符
1. 分类
基本API
1.object
是java中的顶级父类。所有类都直接或间接的继承于Object
- Object类中的toString方法返回的是地址值,若要打印一个对象,想要看到属性的话,可以重写toString方法
public class Objectdemo {
public static void main(String[]args) {
Student s=new Student("zhangsan",18);
String str=s.toString();
System.out.println(str);
}
}
public class Student {
private String name;
private int age;
public Student (String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()//通过重写tostring方法来显示对象的属性,若不重写打印出来的为地址值
{
return name+","+age;
}
}
Object中的equals方法比较的是地址值,而String中的equals方法比较的是内容,因为String对Object中的equals方法进行了重写
public class ObjectStringdemo {
public static void main(String[]args)
{
String str="abc";
StringBuilder sb=new StringBuilder("abc");
//因为equals方法是被str调用,则equals方法要看String类型中的
//而string类型中equals比较的是内容,但在比较之前会先判断参数(sb)类型是否为String
//若不是则直接返回false
System.out.println(str.equals(sb));//false
//因为equals方法是被sb调用,则equals方法要看StringBuilder类型中的,StringBuilder类型中没有重写该方法
//则会调用Object中的equals方法
//而Object类型中equals比较的是地址值
System.out.println(sb.equals(str));//false
}
}
2.Date
对象不能直接进行比较,需要引入变量进行赋值
import java.util.Date;
import java.util.Random;
public class Datedemo {
public static void main(String[]args)
{ //算一年后的时间
Date d1=new Date(0L);
long time=d1.getTime();
System.out.println(d1);
System.out.println(time);
time=time+1000L*60*60*24*365;
d1.setTime(time);
System.out.println(d1);
//比较前后时间大小(对象不能直接进行比较,需要引入变量进行赋值)
System.out.println();
Random r=new Random();
Date d2=new Date(Math.abs(r.nextInt()));
long t1=d2.getTime();
Date d3=new Date(Math.abs(r.nextInt()));
long t2=d3.getTime();
d2.setTime(t1);
d2.setTime(t2);
System.out.println(d1);
System.out.println(d2);
if(t1>t2) {
System.out.println("前一个时间大");
}else {System.out.println("后一个时间大");}
}
}
3.SimpleDateFormat
1)作用
2)构造方法和成员方法
3)代码练习
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateSimpleDateformatdemo {
public static void main(String[]args) throws ParseException
{
Date d=new Date(0L);
SimpleDateFormat sdf =new SimpleDateFormat ();
String str=sdf.format(d);
System.out.println(str);
SimpleDateFormat sdf1 =new SimpleDateFormat ("y年M月d日 HH:mm:ss E ");
String str1=sdf1.format(d);
System.out.println(str1);
//解析
String str2="2023/11/11 11:11:11";
SimpleDateFormat sdf2=new SimpleDateFormat("y/M/d H:m:s");
Date d1=sdf2.parse(str2);
System.out.println(d1);
}
}
4.Calendar
1)定义
2)方法
3)代码练习
import java.util.Calendar;
import java.util.Date;
public class Calendardemo {
public static void main(String[]args)
{
Calendar c=Calendar.getInstance();
System.out.println(c);
Date d=new Date(0L);
c.setTime(d);
System.out.println(c);
int y=c.get(Calendar.YEAR);
int m=c.get(Calendar.MONTH)+1;
int d1=c.get(Calendar.DAY_OF_MONTH);
int w=c.get(Calendar.DAY_OF_WEEK);
System.out.println(y+","+m+","+d1+","+getWeek(w));
}
public static String getWeek(int w)
{
String []arr= {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
return arr[w];
}
}
5.Math
本周总结
又一周过去了,感觉自己学到了很多东西,但是回过头来才发现才把第一次学习计划的东西学完,第二次学习计划也就开了个头,但是下周就要考核了,还是有点紧张的,自己的学习进度已经落下了很多,只能说尽量往前赶进度吧,但是也不能太过于急,不然基础就很不牢固了(虽然本来就不牢固O(∩_∩)O),现在天也越来越冷,真的不想起来啊,就想在被窝里躺一天,当个摆烂的大学生