抽象类
继承
package demo;
//用到继承,一切不变只是类借过来看做他的类,不混淆
/*super:
* 通过super,可以访问父类构造方法
* 调用构造方法的代码,必须写在子类构造方法的第一行
* 通过super,可以访问父类的属性
* 通过super,可以访问父类的方法
*
*/
public class Demo2 {
public static void main(String[] args) {
Student2 s = new Student2();
//s.setName("d");
//s.setAge(11);
s.say();
}
}
//人类
class Person2 {
//封装对属性私有化
private String name;
private int age;
public String sex;
//无参构造方法Shift+A/t+s
public Person2() {
super();
// TODO Auto-generated constructor stub
}
//实参构造方法Shift+A/t+s
public Person2(String name, int age) {
super();
this.name = name;
this.age = age;
}
//对外提供公开的set get 方法Shift+A/t+s
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void say() {
System.out.println("我是"+name+",我今年"+age);
}
}
//学生的类 用super进行与父类交互
class Student2 extends Person2{
public Student2() {
super("无姓名",1);//构造没有构造没有值
super.sex="男";
super.setName("haha");//子类中super表示自动被创建的父类对象
}
}
测试demo
package demo1;
//抽象类不能创建对象
//抽象类不能使用final声明
//抽象类能有构造方法java虚拟机创建
//抽象类普通类区别:
//1抽象类必须用public或protected修饰(如果private修饰,子类无法继承,无法实现其抽象方法)默认为缺省public
//2抽象类不可以使用new关键字创建对象,但是子类创建时,抽象父类也会被jvm实例化
//3如果一个子类继承抽象方法,那么必须实现其所有的抽象方法。如果有未实现的抽象方法,那么子类也必须定义为abstract类
public class Demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//Student s = new Student();
//s.say();
//Nurse n = new Nurse();
//n.say();
//Person p = new Person();
/*//父类引用指向子类对象
//p对象
Person p = null;
//s对象
Student s = new Student();
p = s;//学生是人,或者理解地址指向学生 p就是指向s 即多态
p.say();//p Person类型但具体指向内容是类的子形态 子形态*/
Student a = new Student();
Nurse b = new Nurse();
Person p1 = a;//学生的人
Person p2 = b;//护士的人
p1.say();//正常
p2.say();//正常
Student a2 = (Student)p1;//学生的人的学生;变回学生,父类变子类强转
//Student a3 = (Student)p2;//护士的人的学生,运行的时候say的时候出错
a2.say();
//a3.say();
}
}
抽象父类
package demo1;
//抽象人类
public abstract class Person {
public Person() {//抽象类的构造方法,jvm生成的
System.out.println("构造方法执行了");
}
int age;//抽象父类可以有确定的
public abstract void say();//抽象类不确定的
}
抽象继承的子类
package demo1;
//子类学生
public class Student extends Person {
public void say() {
System.out.println("学习"+age);
}
}
接口
package interfac;
public class Demo {
public static void main(String[] args) {
/*//接口
Student s = new Student();
s.say();*/
//多态应用
/*Student s= new Student();
say(s);*/
Nurse n = new Nurse();
say(n);
}
//多态应用
public static void say(Person p) {
p.say();//多态传
}
}
Person
package interfac;
//接口
public interface Person {
//public void say();//可以省略public
void say();
//public static final int a = 10;//可以省略public static final
int a = 10;//加粗常量
}
package interfac;
public class Nurse implements Person{
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("后续增加的say,来自护士、");
}
}