程序开发思路---【建议】永远不要去继承一个普通类;
1.抽象类该如何去使用呢?
子类去分别实现父类的抽象方法,实现不同的功能;
abstract class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public void say(){
System.out.println(this.getContent());
}
//抽象方法
public abstract String getContent();
}
//工人
class Worker extends Person{
private float salary;
public Worker(String name,int age,float salary){
super(name,age);
this.salary=salary;
}
public void setSalary(float salary){
this.salary=salary;
}
public float getSalary(){
return this.salary;
}
public String getContent(){
return "工人说:姓名:"+super.getName()+";年龄:"+super.getAge()+";工资:"+this.getSalary();
}
}
//学生
class Student extends Person{
private float score;
public Student(String name,int age,float score){
super(name,age);
this.score=score;
}
public void setScore(float score){
this.score=score;
}
public float getScore(){
return this.score;
}
public String getContent(){
return "学生说:姓名:"+super.getName()+";年龄:"+super.getAge()+"成绩:"+this.getScore();
}
}
public class Demo{
public static void main(String args[]){
Person p=null;
// p=new Worker();
// p.say();
p=new Student("张三",20,100);
p.say();
}
}
2.接口的使用:
将方法名称暴露给用户,通过对象的多态性,由子类为接口对象实例化;
接口使用的一个很好的例子:
例子思路:定义一个接口---》定义个接受接口类型参数的类----》定义实现接口的几个类;
interface USB{
public void start();
public void stop();
}
class PC{
public static void plugin(USB u){
u.start();
u.stop();
}
}
class MP3 implements USB{
public void start(){
System.out.println("MP3开始工作了");
}
public void stop(){
System.out.println("MP3停止工作了");
}
}
class UDisk implements USB{
public void start(){
System.out.println("UDisk开始工作了");
}
public void stop(){
System.out.println("UDisk停止工作了");
}
}
public class Demo{
public static void main(String args[]){
PC.plugin(new MP3());
PC.plugin(new UDisk());
}
}
抽象类与接口在使用上如此相似,那该怎选谁呢?
一般优先选择 接口;
3.抽象类和接口的相同点和不同点:(注:一个接口可以继承多个接口的,抽象类可以接口,而接口是一种特殊的抽象类)
相同点:都不能直接实例化,通过多态性,可由其子类实现;
不同点:
抽象类:包括一般方法、抽象方法、变量和常量
可以有构造方法(因为抽象类毕竟有非静态变量和非抽象方法);
抽象类可以实现多个接口;
继承时,单继承会有局限性;
接口:包括常量和抽象方法;
不能有构造方法;(构造方法的作用是初始化变量的,而接口没有变量)
接口不能继承抽象类;
解决了单继承的局限性;
如果非要把抽象类和接口作进一步的比较,则可以根据一个设计模式进行解释:
观察一个特点:
接口中的都是抽象方法,则子类必须全部覆写接口中的全部抽象方法,那么如果
现在子类不希望全部都覆写呢?该如何去做?
接口-->抽象类-->子类即如下:
adapter:适配器设计模式
接口可以进一步扩展-->工厂设计模式(简单工厂模式)
看到接口接口----(联想到)-->工厂设计模式
个人见解:关于java程序从编译到执行的整个流程:
首先有个*.java类型的文件通过javac命令被编译,这时生产*.class文件,次时程序是不占内存的;
然后通过java命令来执行*.class文件时jvm就开始解释该文件,从main方法进入,一行行的解释,当遇到静态
方法和静态属性时 为其分配内存空间,如果是非静态的方法和非静态的属性是不分配内存空间的,
当解释到构造方法时,这时为非静态方法和非静态变量分配内存空间;
内存空间分为:
栈内存:存放非静态变量和引用类型变量;
堆内存:存放引用类型的对象;
代码区:存放方法;
全局数值区:存放静态变量;