java学习第四周

面向对象的多态性
个人总结:
abstract 抽象类不能被实例化,必须被继承,抽象类中可以没有抽象方法,有抽象方法一定是抽象类。抽象方法没有方法体,即大括号{}。

构造方法,静态方法,私有方法,final方法不能被声明为抽象方法。

final 最终类不能被继承,如果用final修饰的变量成员 全局变量要赋初值,(final修饰的局部变量可以不用赋初值,但是调用时无法调用)

instanceof 判断对象是否属于类

接口 interface 接口是一种“标准”,是定义抽象方法和常量值的定义的集合,接口是一种特殊的抽象类,这种抽象类中只能包含常量和方法的定义,没有变量和方法的实现。接口中没有构造方法,而抽象类中有构造方法。接口里面也不能被实例化,接口里面一定是抽象的
[public] interface 接口名称{
}

接口体中常量具有public final static的属性
方法体具有public abstract属性
接口常量一般大写 例如 public final static int SPEED;

extends 继承 可以实现抽象类)子接口可以继承父接口,并且可以继承多个父接口。

implements 实现 (可以实现接口)

对于类来说继承是单继承的,对于接口来说一个类可以实现多个接口。类和接口是实现关系。非抽象子类必须实现接口中定义的所有方法。
例:public class Dog extends Animal implements Fly

java中不允许类的多继承,但允许接口的多继承

在接口中声明方法时,不能使用static ,final, synchronized ,private, pritected 等修饰符。

通过接口实现不相关类的相同行为,通过接口指明多个类需要实现的方法

对象的多态性主要分为两种:
向上转型: 子类对象->父类对象 (程序会自动完成)
格式:
父类 父类对象=子类实例
向上转型后,因为操作的是父类对象,所以无法找到在子类中定义的新方法;但如果子类重写了父类的某个方法,则调用的是重写后的方法。
向下转型:父类对象->子类对象 (必须明确的指明要转型的子类类型)格式:
子类 子类对象=(子类)父类实例
注意:向下转型前先要向上转型。

String类
String代表字符串类型,字符串的内容本身不可改变,字符串存储于“字符串常量池”中。
String的两种实例化方式
a:直接赋值法:
eg: String str=“Hello World”;
b:通过new操作符实例化:
eg: String str=new String(“Hello World”);

由于String类的字符串存储于“字符串常量池”中,并且有两种实例化方式,所以我们应该注意在String类中会遇到的几个陷阱:
1.String str1="hello";
String str2="hello";
System.out.println(str1==str2); //true
System.out.println(str1.equals(str2)); //true
String str3=new String("hello");
System.out.println(str1==str3); //false
System.out.println(str1.equals(str3)); //true

当字符串hello被放入常量池后下一次实例化的对象会先在常量池中查找,如果存在则将其指向该字符串,如果不存在则将新字符串放入常量池中。因此str1.equals(str2)比较的是字符串的内容相等为true,tr1==str2比较的是两对象的地址,都指向常量池中的同一个内容因为结果为true。String str3=new String(“hello”); 是将常量池中的hello复制了一份放在堆内存中,因此str1==str3比较两对象地址,str1指向常量池中,而str3指向堆内存中复制的hello,结果为false。str1.equals(str3)比较的是字符串的内容相等为true
2.public static void main(String[] args) {
String str="hello";
change(str);
System.out.println(str);
}
public static void change(String str){
str="中国";
}

放入常量池中的内容不会改变,因此输出的结果还是hello

3.Person per=new Person("张三");
changePerson(per);
System.out.println(per);
}
public static void changePerson(Person per){
per.setName("李四");

先将张三放入常量池中,per的指向为常量池中的“张三”,之后再将“李四”放入常量池中,改变per的指向,这样可以改变per对象中的内容,但是常量池中的字符串并没有改变。

StringBuffer称为字符串缓冲区,它的工作原理是:预先申请一块内存,存放字符序列,如果字符序列满了,会重新改变缓存区的大小,以容纳更多的字符序列。String类是不可变的,可以用来共享。StringBuffer是可变的,可以对其进行修改,删除,查找,增减等功能。StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值