面向对象(2)
类属性
-
当一个属性被static修饰的时候,就叫做类属性,又叫做静态属性,当一个属性被声明成类属性,那么所有的对象,都共享一个值
-
不同对象的对象属性的值都可能不一样;但是所有对象的类属性的值,都是一样的
package charactor; public class Hero { public String name; //实例属性,对象属性,非静态属性 protected float hp; static String copyright;//类属性,静态属性 public static void main(String[] args) { Hero garen = new Hero(); garen.name = "盖伦"; Hero.copyright = "版权由Riot Games公司所有"; System.out.println(garen.name); //System.out.println(garen.copyright); System.out.println(Hero.copyright); Hero teemo = new Hero(); teemo.name = "提莫"; System.out.println(teemo.name); System.out.println(teemo.copyright); } }
-
-
访问类属性:
对象.类属性
或者类.类属性
(推荐后者) -
如果一个属性,不同的对象不一样,比如name,这样的属性就应该设计为对象属性,因为它是跟着对象走的
-
如果一个属性,所有的对象都共享,那么就应该设计为类属性。类属性不会因为对象的不同而取不同的值。 这样的属性,就适合设计为类属性
类方法
-
类方法: 又叫做静态方法;对象方法: 又叫实例方法,非静态方法
-
访问一个对象方法,必须建立在有一个对象的前提的基础上;访问类方法,不需要对象的存在,直接就访问
package charactor; public class Hero { public String name; protected float hp; //实例方法,对象方法,非静态方法 //必须有对象才能够调用 public void die(){ hp = 0; } //类方法,静态方法 //通过类就可以直接调用 public static void battleWin(){ System.out.println("battle win"); } public static void main(String[] args) { Hero garen = new Hero(); garen.name = "盖伦"; //必须有一个对象才能调用对象方法 garen.die(); Hero teemo = new Hero(); teemo.name = "提莫"; //无需对象,直接通过类调用 Hero.battleWin(); //teemo.battlewin(); } }
-
调用类方法:
对象.类方法
或者类.类方法
(推荐后者) -
如果在某一个方法里,调用了对象属性,那么这个方法,就必须设计为对象方法
-
如果一个方法,没有调用任何对象属性,那么就可以考虑设计为类方法
-
类方法(静态方法)不能直接访问非静态属性,因为在内存中是现有静态内容后有非静态内容
-
静态方法中不能用this关键字,因为this代表当前对象,通过谁调用的方法谁就是对象
静态代码块
-
静态代码块格式:
static{``}
-
静态代码块的特点:当第一次用到本类时,静态代码块执行唯一一次
静态内容总优先于非静态,所以静态代码块比构造方法先执行
package charactor; public class Hero { //静态代码块 static{ System.out.println("静态代码块执行"); } public Hero{ System.out.println("构造方法执行"); } public static void main(String[] args) { Hero one = new Hero();//静态代码块和构造方法均执行 Hero two = new Hero();//仅有构造方法执行 } }
-
静态代码块的用途:用来一次性地对静态成员变量进行赋值
抽象方法和抽象类
-
在类中声明一个方法,这个方法没有实现体,是一个“空”方法,这样的方法就叫抽象方法,使用修饰符
abstract
-
抽象方法所在的类必须是抽象类,同样用
abstract
修饰- 抽象类可以没有抽象方法,只要保证抽象方法所在的类是抽象类即可
- 没有抽象方法的抽象类也不能直接创建对象,在一些特殊场景下有用途
-
抽象类不能直接创建对象,必须用一个子类继承抽象父类
-
子类必须覆盖重写抽象父类中的所有抽象方法
覆盖重写:子类去掉抽象方法的 abstract关键字,然后补上方法体大括号
//抽象父类 public abstract class Hero { String name; //姓名 float hp;//血量 int moveSpeed; //移动速度 //定义抽象方法 public abstract void attack(); } //////////////////////////////////// //抽象子类 public class ADHero extends Hero { @Override//覆盖重写 public void attack(){ System.out.println("进行物理攻击"); } public static void main(String[] args){ ADHero h1 = new ADHero(); h1.attack(); } }
-
当子类没有重写覆盖抽象父类的所有方法,则该子类也应该为抽象类
//抽象父类 public abstract class Hero { //String name; //姓名 float hp;//血量 int moveSpeed; //移动速度 //定义抽象方法 public abstract void attack(); public abstract void rename(String name); } //////////////////////////// //子类也是抽象类 public abstract class ADHero extends Hero { @Override//覆盖重写 public void attack(){ System.out.println("进行物理攻击"); } // public abstract void rename(String name);未进行覆盖重写 } ///////////////////////////// public class H1 extends ADHero{ @Override public void rename(String name){ System.out.println("姓名是" + name); } public static void main(String[] args){ // ADHero garen = new ADHero;//ADhero仍为抽象类不能直接创建,会报错 H1 garen = new H1(); garen.attack(); garen.rename("garen"); } }
ArrayList 集合
-
ArrayList是针对对象数组的一个包,即对象可存放于数组中
-
ArrayList<E>
中代表泛型,即在集合中的所有元素都是统一类型,泛型只能是引用类型不能是基本类型 -
对于ArrayList合集,直接打印得到的是[内容],而不是地址值
-
若希望向ArrayList合集中存储基本数据类型,必须使用基本类型对应的包装类
byte-->Byte short-->Short int-->Integer long-->Long
float-->Float double-->Double char-->Character boolean-->Boolen
package arrayList; import java.util.ArrayList; import java.util.Random; public class DemoArrayList { public static void main(String[] args){ //创建一个ArrayList合集 //集合名称为listB,集合内部都是int类型的数据 //利用包装类导入基本类型 ArrayList<Integer> listB = new ArrayList<>(); for (int i=1; i <= 6; i++){ Random random = new Random(); int num = random.nextInt(33) + 1;//产生1-33随机数 listB.add(num); } System.out.println(listB); } }
-
-
常用方法:
-
.add(E)
:向集合内添加一些数据,参数类型与泛型一致 -
.get(index)
:从集合中获取元素,参数是索引编号,返回值是对应位置的元素 -
.remove(index)
:从集合中删除元素,参数是索引编号,返回值是被删掉的元素 -
.size()
:获取集合尺寸长度,返回值是集合中包含的元素个数
-
package arrayList;
public class Hero {
String name; //姓名
private float hp;//血量
int moveSpeed; //移动速度
public Hero(String name, float hp, int moveSpeed){
this.name = name;
this.hp = hp;
this.moveSpeed = moveSpeed;
}
public void setName(String name){
this.name = name;
}
public void setHp(float num){
if(num < 0)
System.out.println("数据不合理");
else
hp = num;
}
public void setMoveSpeed(int num){
if(num < 0)
System.out.println("数据不合理");
else
moveSpeed = num;
}
public String getName(){
return name;
}
public float getMoveSpeed(){
return moveSpeed;
}
public float getHp(){
return hp;
}
}
//////////////////////////////////////////////
package arrayList;
import java.util.ArrayList;
public class HeroList {
//将对象存入集合中
public static void main(String[] args){
ArrayList<Hero> list = new ArrayList<>();
Hero garen = new Hero("garen", 50, 100);
Hero temmo = new Hero("temmo", 40, 80);
list.add(garen);
list.add(temmo);
//遍历集合
for (int i=0; i < list.size(); i++){
Hero hero = list.get(i);
System.out.println("名字是" + hero.getName() +
"血量为" + hero.getHp() + "移动速度是" + hero.getMoveSpeed());
}
}
}