一.继承的概念和用法
- 继承需要符合的关系:is-a;父类更抽象,子类更具体
- 继承背后的思想是:基于已存在的类来构建新类
- 当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类来应对需求
- 约定:从其他的类导出的类叫子类,被导出的类叫父类
- 在Java中,除了Objiect类外,所有的类都是子类都只有唯一的父类
- 继承在OOP中不可或缺,
- 创建一个类时,总是在继承
- 继承的意义:
代码重用 ,体现不同抽象层次 - 父子类关系:父类更抽象更一般。子类更具体更特殊
- 父类初始化先于子类,等所有父类创建后,才创建子类
二.super关键字
- super跟this关键字的特点类似,super代表的是父类对象的引用
- 当子父类成员重名时。可以通过super区分
- 子类构造方法中,通过super关键字调用父类的构造方法
- 强调:当构造一个子类对象时,一定要调用父类的构造方法来构造父类的对象。构造父类对象的语句必须是子类构造方法语句中的第一条。
package newbao;
class mathstudent extends Student{
mathstudent(){
super();
}
}
public class testbao {
public static void main(String[] args) {
mathstudent p = new mathstudent();
System.out.println("age = "+p.name);
}
}
三.Java继承之私有权限
- 子类对象必须同过构造方法,才能间接访问父类的私有属性成员或方法。
四.Java继承之方法重写-override
4.1什么是方法重写?
- 方法重写是指根据需要,对从父类继承来的方法进行改写,是多态机制的前奏
4.2方法重载的注意点
- 重写方法和被重写方法,必须具有相同的方法名称,参数列表和返回值。
- 重写方法不能比被重写方法更严格的权限
- 父类的私有方法不能被重写
- 在子类的重写方法中,继续调用父类被重写的方法可以使用super.方法名
4.3注意
- 子类方法重写后,调用方法会优先调用子类重写方法
- 方法重写不能缩小权限,否则重写无效
- 方法重写可以扩大权限
- 私有方法无法被重写,否则相当于新加了一个方法
五.Object常见方法(祖传的函数)
- Java中,所有类都直接或间接继承自Java.lang.Objiect类,可以说Object是Java所有类的祖先即根类
- Java中任何类都继承了Object类中的方法,主要有:
1. toString()
2. equals()
3. hashcode()
4. clone()
5. getClass()
6. finalize()
5.1 String toString()
- 返回该对象的字符串描述信息。默认输出格式:类名【字段值,字段值。。。】
- 只要对象与一个字符串通过”+“连接,系统就会自动调用toString获得对象的字符串描述符
- 常被改写,可以根据用户的需求,对齐进行重写
5.2 Boolean equals()
- object类原始功能是判断两个对象是否具有相同的引用,要求判断两个对象状态的相等性
六.继承练习
package learn.zengtiejiang;
class Wapon{
String name;
String color;
String attack;
int damage;
int range;
Player attack(int prange,Player p){
if(prange <= this.range){
System.out.println(color+name+"cause"+"damage"+damage);
p.blood = p.blood-damage;
if(p.blood <= 0){
p.status = "die";
System.out.println(p.name+p.status);
}
}
return p;
}
}
class sword extends Wapon{
sword(){
super();
this.name ="sword1";
this.color ="black";
this.attack = "thorn";
this.damage = 10;
this.range = 50;
}
Player attack(int range,Player p){
if(range <= this.range){
if(p.blood > 0){
System.out.println(p.name+" blood -1");
p.blood = p.blood-damage;
if(p.blood == 0){
p.status = "die";
System.out.println(p.name+" "+p.status);
}
}else if(p.blood <= 0){
System.out.println(p.name+" has die ,attack no effect");
}
}else{
System.out.println("no effect attack");
}
return p;
}
}
class Player{
String name;
String rank;
Wapon wapon;
int blood;
String status;
void attack(int range,Wapon pwapon,Player p){
pwapon.attack(range,p);
}
Player(String pname){
Wapon pwapon = new sword();
this.name = pname;
this.rank = "青铜";
this.wapon = pwapon;
this.blood = 100;
this.status = "alive";
}
}
public class demo1 {
public static void main(String[] args) {
Player laowang = new Player("laoiwang");
Player yasuo = new Player("yasuo");
Wapon newwapon = new sword();
laowang.wapon = newwapon;
yasuo.wapon = newwapon;
int range = 10;
int i = 11;
while(i>0){
yasuo.attack(range, yasuo.wapon,laowang);
i--;
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
}
while(true){
if(yasuo.blood == 0){
System.out.println("laowang win");
return;
}else if(laowang.blood == 0){
System.out.println("yasuo win");
return;
}
}
}
}
package learn.zengtiejiang;
class fruits{
String name;
String characteristic;
void handle(){
System.out.println("all fruits delicious");
}
public fruits(String name){
System.out.println("fruits created");
}
}
class Apple extends fruits{
Apple(String name){
super(name);
this.name =name;
}
void handle(){
System.out.println("Apple delicious");
}
}
class banana extends fruits{
banana(String name){
super(name);
this.name =name;
}
void handle(){
System.out.println("Banana delicious");
}
}
public class factoryyyyy {
public static void main(String[] args) {
Apple apple1 = new Apple("apple1");
Apple apple2 = new Apple("apple2");
banana banana1 = new banana("banana1");
apple1.handle();
apple2.handle();
banana1.handle();
System.out.println("apple1's name = "+apple1.name);
System.out.println("apple2's name = "+apple2.name);
System.out.println("banana1's name = "+banana1.name);
}
}