抽象类和抽象方法
抽象类:使用abstract修饰的类就是抽象类(抽象类就是一种规范,只能用来被子类调用)
1)抽象类中可以包含的内容
1.成员变量(属性)
2.成员方法
3.静态方法
4.构造方法
5.final 修饰的方法
6.抽象方法: 用abstract修饰的方法,不允许有方法体,只能以“:”结尾
2)抽象类使用要点
1.抽象类中构造的方法只能用来被子类调用
2.抽象类只能用来被继承。一个子类继承父类抽象类之后,必须重写父类抽象类中的方法来实现父类中方法的调用 或者该类本身就是一个抽象类
3.抽象类不能实例化,即不能通过new关键字创建对象
4.抽象类中可以没有抽象方法,但有抽象方法的类一定是抽象类
接口
1)定义:接口本质就是一种规范,它比抽象类更加抽象。
接口可看作一种抽象方法,并且该抽象方法中所有的方法都为抽象方法,所有的变量都是常量
2)格式
修饰符 interface 接口名称{
方法定义;(抽象方法) 默认使用public abstract 修饰
常量定义 ; 默认使用public static final 修饰的,可省略
}
编写代码
3)java中类的继承是单继承,而接口可以是多继承, 子接口可以继承多个父接口
public interface 接口名称 extends 父接口1,父接口2.....{
4)接口中不能实例化对象,即不能通过new关键字创建对象
5)类如何实现接口中的方法:
1. 在类中实现接口,用implements关键字,一个类可以实现多个接口
格式:修饰符 class 类名 implements 接口名称1,接口名称2......{
}
2.一个类实现特定的接口,必须实现接口中定义的抽象方法(接口中也只有抽象方法),实现接口中的方法,方法必须重写
6)接口和抽象类的区别
1.抽象类中可以包含普通方法,构造方法和非常量的成员变量。而接口中的方法只能是抽象方法,不能有构造方法,成员变量为常量
2.接口中方法默认使用public abstract修饰,成员变量默认使用public static final 修饰(即常量)
3.抽象类不能多继承,而接口可以多继承
编写代码
运行结果
内部类
1)定义
把一个类放在另一个类的内部定义,称为内部类。
2)内部类的分类
非静态内部类,静态内部类,匿名内部类,局部内部类
内部类可以访问外部类的成员变量,但外部类不能访问内部类的成员变量
3)内部类的作用
1. 内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问。
2. 内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。 但外部类不能访问内部类的内部属性。
3. 接口只是解决了多重继承的部分问题,而内部类使得多重继承的解决方案变得更加完整。
4)内部类的使用场合
1. 由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性。所以,在只为外部类提供服务的情况下可以优先考虑使用内部类。
2. 使用内部类间接实现多继承:每个内部类都能独立地继承一个类或者实现某些接口,所以无论外部类是否已经继承了某个类或者实现了某些接口,对于内部类没有任何影响。
注意:1. 内部类可以使用public、default、protected 、private以及static修饰。而外部顶级类(我们以前接触的类)只能使用public和default修饰。
2. 内部类只是一个编译时概念,一旦我们编译成功,就会成为完全不同的两个类。对于一个名为Outer的外部类和其内部定义的名为Inner的内部类。
编译完成后会出现Outer.class和Outer$Inner.class两个类的字节码文件。所以内部类是相对独立的一种存在,其成员变量/方法名可以和外部类的相同。
String类
1)String类又称作不可变字符序列。String位于java.lang包中,Java程序默认导入java.lang包下的所有类
2)String类常用的方法
编写代码
运行结果
3)常量池
1.全局字符串常量池(String Pool)
全局字符串常量池中存放的内容是在类加载完成后存到String Pool中的,在每个VM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例)。
2. class文件常量池(Class Constant Pool)
class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量(文本字符串、final常量等)和符号引用。
3.运行时常量池(Runtime Constant Pool)
运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。
编写代码:
package com.sxt.ooa03;
public class TestStringChi {
public static void main(String[] args) {
String str1="abc";
String str2="a"+"b"+"c";
String str3=new String("abc");
String str4=str3+" ";
String str5=new String("abc");
System.out.println(str1==str2);//true
System.out.println(str1==str3);//faulse
System.out.println(str1==str4);//
System.out.println(str1==str5);//faulse
System.out.println(str2==str3);//faulse
System.out.println(str2==str4);
System.out.println(str2==str5);//faulse
System.out.println(str3==str4);//faulse
System.out.println(str3==str5);//faulse
System.out.println(str4==str5);//faulse
}
}
运行结果:
4)字符串相等的判断
使用==运算符比较字符串地址是否相等
equals方法用来检测两个字符串内容是否相等
要测试两个字符串除了大小写区别外是否是相等的,需要使用equalsIgnoreCase方法。
编写代码:
运行结果: