学习总结(第四周)

多态(同类型的对象表现出不同的形态)

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 StudentString 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),现在天也越来越冷,真的不想起来啊,就想在被窝里躺一天,当个摆烂的大学生

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值