一、背景
#include <stdio.h>
struct Person //人
{
int name;
char* address;
void (*pEat)();
void (*pDrink)();
};
struct Student //学生也是人,所以有一定的重复性
{
int name;
char* address;
void (*pEat)();
void (*pDrink)();
int score; //学生独有的特征,有分数,要上学
void (*goToSchool)();
};
二、继承的概念和实现
-
java继承背后的思想是:基于已存在的类来构建新类。
-
当从已存在类继承时,就重用了他的方法和属性,还可以添加新的方法和属性来定制新类以应对要求。
-
约定:
-
父子类关系通常父类更通用更抽象,子类更特殊更具体
-
在java中,除了object外,所有类都是子类,都只有唯一的父类,即为object。
-
继承的意义:代码重用,体现不同抽象层次
extends关键字
public class Student extends Person{
...
}
class Person {
String name;
String address;
void eat() {
System.out.println("人吃饭");
}
void drink() {
System.out.println("人喝水");
}
}
class Student extends Person{ //可以直接使用Person中的属性了
int score;
void goToSchool() {
System.out.println("学生要上学");
}
}
public class Demo1 {
public static void main(String[] args) {
Person p = new Person();
p.name = "人";
p.eat();
Student s = new Student();
s.name = "学生"; //person中的特征
s.eat(); //person中的方法
}
}
super关键字
super和this关键字的特点类似:super代表的是对父类对象的引用
class Person {
String name;
String address;
void eat() {
System.out.println("人吃饭");
}
void drink() {
System.out.println("人喝水");
}
//Person(){}//解决方法一:无参的构造方法
Person(String name,String address){
this.name = name;
this.address = address;
System.out.println("父类构造方法被调用");
}
}
class Student extends Person{ //可以直接使用Person中的属性了
int score;
void goToSchool() {
System.out.println("学生要上学");
}
/*
Student(){ //如果不写构造方法的话,系统分配类似于这样的无参的构造方法
//如果父类写了构造方法而子类没有“对应的”构造方法,就会出错
//解决方法一:在父类中写一个无参的构造方法;
//解决方法二:应用super关键字,在子类中完成对父类构造方法的引用
}*/ //父类可能有多个构造方法,子类只需要引用一个初始化自己就好
//解决方法二:
Student(String name,String address){ //super重要用法
super(name, address); //调用了父类的构造方法,这个语句必须放在子类构造方法的第一句
System.out.println("子类构造方法被调用");
}
public void eat(){ //因为父类已经有了方法eat,这里权限不能降低,所以加public,后面讲多态会介绍:方法的重写
super.eat(); //调用父类的eat,super是对父类的引用。
//子类中有eat,父类也有同名的方法,如何区分是父类还是子类的eat,用super!
System.out.println("student eat");
}
}
public class Demo {
public static void main(String[] args) {
//Person r = new Person("alin","yezaijia");
//System.out.println("r.name:"+r.name);
//在实例化一个对象的时候,子类的构造方法调用会导致父类的构造方法也被调用:
Student s = new Student("ajie","zaijai");
s.eat();
System.out.println("s.name:"+s.name);
//System.out.println("r.name:"+r.name);
}
}
运行结果:
继承过来的属性和方法的权限研究
class Person {
String name;
private String address; //私有的属性
void eat() {
System.out.println("人吃饭");
}
Person(String name,String address){
this.name = name;
this.address = address;
System.out.println("父类构造方法被调用");
}
public void printname(){
System.out.println("name:"+name);
}
public void printaddr(){
System.out.println("address:"+address);
}
//private void printaddr(){//主函数的s.printaddr就会报错,表明私有方法无法被子类继承
// System.out.println("address:"+address);
//}
}
class Student extends Person{
int score;
void goToSchool() {
System.out.println("学生要上学");
}
Student(String name,String address){
super(name, address); //调用了父类的构造方法
System.out.println("子类构造方法被调用");
}
/*
void setAddress(String address){
this.address = address; //这里提示了address是父类私有的,说明实际上私有属性没有被继承过来
//不给你用,父亲”私藏的“所有东西儿子都是不知道的,继承不到
}
*/
}
public class Test {
public static void main(String[] args) {
Student s = new Student("ajie","zaijia");
s.printname();
s.printaddr();
}
}
方法重写Override
class Person
{
String name;
private String address;
public void printName(){
System.out.println("父类name="+name);
}
private void printAddress(){ //父类的私有方法,想要"重写"这个方法,子类中的方法不能是private
System.out.println("address="+address);
}
}
class Student extends Person
{
int score;
//(1)重写方法必须和被重写方法具有相同的名称、参数列表和返回值
//(2)重写方法不能比被重写方法有更严格的访问权限
public void printName() {
super.printName();//想继续调用父类被重写的方法
System.out.println("子类name=" + name); //方法的实现改了,也是重写啊,别看就改了一点
}
public void printAddress(){
System.out.println("想用你的私有方法");
}
//如果这里用的是private,那下面的stu1.printAdd就会报错
//注意:如果父类方法权限是private,子类不能用private去重写这个方法
//这对于子类来说,父类是不可见的,是看不到父类的方法的
//所以这对于子类来说,就是构造了一种新的方法,既不是方法重写也不是方法重载!
//是不是重写,就概念的东西,初学,也不必争辩,知道这么用就行
}
public class Demo1 {
public static void main(String[] args){
Student stu1 = new Student();
stu1.name = "ajie";
stu1.printName();
stu1.printAddress();
}
}
三、Object类常见方法
toString()
package com.ajie.learn;
class Person
{
String name;
}
public class Demo1 {
public static void main(String[] args) {
Person p = new Person();
p.name = "huatianzhu";
System.out.println(p.toString());
}
}
常把toString()方法重写后应用
package com.ajie.learn;
class Person
{
String name;
String address;
public String toString() {
// TODO Auto-generated method stub
return ("Person message:" +name +address);
}
}
public class Demo1 {
public static void main(String[] args) {
Person p = new Person();
p.name = "ajie";
p.address = "zaijia";
System.out.println(p.toString());
}
}
equals()
package com.ajie.learn;
class Person
{
String name;
String address;
}
public class Demo1 {
public static void main(String[] args) {
Person p = new Person();
p.name = "ajie";
p.address = "zaijia";
Person p2 = new Person();
p.name = "ajie";
p.address = "zaijia";
System.out.println(p.equals(p2));
}
}
package com.ajie.learn;
class Person
{
String name;
String address;
public boolean equals(Person p) {
if(this.address == p.address && this.name == p.name)
return true;
else
return false;
}
}
public class Demo1 {
public static void main(String[] args) {
Person p = new Person();
p.name = "ajie";
p.address = "zaijia";
Person p2 = new Person();
p2.name = "ajie";
p2.address = "zaijia";
System.out.println(p.equals(p2));
}
}
四、继承实例
class Wapon
{
String name;
void waponAttack()
{
System.out.println("武器攻击");
}
}
class K98 extends Wapon
{
void waponAttack()//方法重写是多态机制的前奏
{
System.out.println("98k攻击");
}
}
class KouShui extends Wapon
{
void waponAttack()
{
System.out.println("口水攻击");
}
}
class Play
{
String name;
String duanwei;
Wapon wapon;
int id;
void attack()
{
System.out.println("玩家攻击");
wapon.waponAttack();
}
}
public class Chiji {
public static void main(String[] args) {
Play p1 = new Play();
p1.name = "玩家一";
p1.duanwei = "青铜";
p1.wapon = new KouShui();//多态
p1.attack();
p1.wapon = new K98();//多态
p1.attack();
}
}
评论(0)
您还未登录,请登录后发表或查看评论