一、类的访问修饰符
1、public修饰符:公有访问级别
同包中可直接访问,不同包中导入类所在的包即可访问
同包中:
不同包中:
2、默认修饰符:包级私有访问级别
同包中:
不同包中:
二、类成员访问修饰符及作用域
1、private:只能在同一个类中访问
2、默认修饰符:同一类或同一个包中可以访问,同一包中的子类也可以访问
不同包无法访问:
在同一个包的子类可以访问:
不同包中的子类无法访问:
3、protected:在同一类或同一包中以及同一包中的子类可以访问
同一包中的子类:
不同包中的子类无法访问:
4、public:任何地方都可以进行访问
三、static静态修饰符
一)、static可用来修饰
1、成员变量:静态变量,可以直接通过类名访问
2、成员方法:静态方法,可以直接通过类名访问
3、代码块:静态代码,当java虚拟机加载类时,就会执行代码块
二)、类的成员变量
1、类变量(静态变量)
A、被static修饰的变量
B、在内存中只有一个拷贝
C、类内部,可以在任何方法内直接访问静态变量
D、其它类中,可直接通过类名访问
2、实例变量
A、没有被static修饰的变量
B、每创一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响
3、static方法
A、静态方法:可直接通过类名访问
a、静态方法中不能使用this和super
b、不能直接访问所属类的实例变量和实例方法
c、可直接访问类的静态变量和静态方法
B、实使方法:通过实例访问
可直接访问所属类的静态变量、静态方法、实例变量和实例方法
C、静态方法必须被实现
三)、代码块
1、如果对象不创建,则普通代码块不能够被执行,当然,普通方法也无法调用;
2、如果对象不创建,静态代码块依然能够被执行,而且,静态方法可直接通过类调用;
3、说明,普通属性、方法、代码块是对象级别的;
静态属性、方法、代码块是类级别的;
PS:
JVM加载静态代码块时,如果有多个静态代码块时,会按顺序执行,但静态代码码只会被执行一次
四、继承
一)、继承是代码重用的一种方式:将子类共有的属性和行为放到父类中
1、可以使用super关键字,super代表父类
2、在子类构造 方法中调用且必须是第一句
3、不可以访问父类中定义为private的属性和方法
4、super关键字来访部父类的成员
二)、子类继承父类的什么
1、继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里
2、不在同一个包中,父类中被默认权限修饰符的属性和方法无法被继承
3、父类中被private修饰的成员、以及父类构造方法无法被继承
作业:
1、使用继承方法实现宠物店(狗、企鹅、猫)
宠物类:
package com.java_1_18_lianxi; public class Pet { private String name;//名字 private int health;//健康值 private int macy;//亲密度 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHealth() { return health; } public void setHealth(int health) { if(health>100||health<0) { this.health = 60; System.out.println("健康值在0到100之间,您的输入有误,默认60!"); }else { this.health = health; } } public int getMacy() { return macy; } public void setMacy(int macy) { if(macy>100||macy<0) { this.macy = 60; System.out.println("亲密度在0到100之间,您的输入有误,默认60!"); }else { this.macy = macy; } } public void print() { System.out.println("宠物的自白:"); System.out.println("我的名字是:"+this.name+",健康值是:"+this.health+",和主人的亲密度是:"+this.macy); } }
狗类:
package com.java_1_18_lianxi; public class Dog extends Pet{ private String strain; //品种 public String getStrain() { return strain; } public void setStrain(String strain) { this.strain = strain; } public void print() { super.print(); System.out.println("我是:"+this.strain); } }
企鹅类:
package com.java_1_18_lianxi; public class Penguin extends Pet { private String sex;//性别 public String getSex() { return sex; } public void setSex(int sex) { if(sex==1) { this.sex = "Q仔"; }else { this.sex = "Q妹"; } } public void print() { super.print(); System.out.println("我的性别是:"+this.sex); } }
猫类:
package com.java_1_18_lianxi; public class Cat extends Pet { private String colour;//颜色 public String getColour() { return colour; } public void setColour(String colour) { this.colour = colour; } public void print() { super.print(); System.out.println("我的毛色是:"+this.colour+"色!"); } }
主程序:
package com.java_1_18_lianxi; import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner cxj = new Scanner(System.in); Penguin p = new Penguin(); Dog d = new Dog(); Cat c = new Cat(); System.out.println("欢迎来到宠物店!"); System.out.print("请输入要领养宠物的名字:"); String name = cxj.next(); System.out.print("请输入您要领养宠的类型(1、狗 2、企鹅 3、猫):"); int select = cxj.nextInt(); switch(select) { case 1: d.setName(name); System.out.print("请选择狗狗的健康值:"); d.setHealth(cxj.nextInt()); System.out.print("请输入狗狗的亲密度:"); d.setMacy(cxj.nextInt()); System.out.print("请输入狗狗的品种:"); d.setStrain(cxj.next()); d.print(); break; case 2: p.setName(name); System.out.print("请选择企鹅的健康值:"); p.setHealth(cxj.nextInt()); System.out.print("请输入企鹅的亲密度:"); p.setMacy(cxj.nextInt()); System.out.print("请选择企鹅的性别(1、Q仔 2、Q妹):"); p.setSex(cxj.nextInt()); p.print(); break; case 3: c.setName(name); System.out.print("请选择猫猫的健康值:"); c.setHealth(cxj.nextInt()); System.out.print("请输入猫猫的亲密度:"); c.setMacy(cxj.nextInt()); System.out.print("请选择猫猫的毛色:"); c.setColour(cxj.next()); c.print(); break; default: System.out.println("您的输入有误!"); } } }
结果: