面对对象进阶
static
工具类:
工具类的构造要求
工具类练习一:
工具类:
public class ArrayUtil {
//私有化构造方法
private ArrayUtil() {
}
//静态方法,方便调用
public static String printArr(int[] arr){
String result = "";
result = result+"[";
for (int i = 0; i < arr.length; i++) {
//最后一个不需要加逗号
if (i==arr.length-1){
result += arr[i];
}else {
result += arr[i] + ", ";
}
}
result = result+"]";
return result;
}
public static double getAerage(double[] arr){
double sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
double avg;
avg = sum/arr.length;
return avg;
}
}
测试类:
public class TestDemo {
public static void main(String[] args) {
//生成一个数组
int[] arr = {1,2,3,4,5,6,7,8,9,10};
//调用静态方法进行验证
System.out.println(ArrayUtil.printArr(arr));
double[] arr2 = {1.1,2.2,3.3,4.4,55,66};
System.out.println(ArrayUtil.getAerage(arr2));
}
}
工具类练习二:
学生类:
//使用插件生成的javaBean类(Ptg插件)
public class Student {
private String name;
private int age;
private String gender;
public Student() {
}
public Student(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
/**
* 获取
* @return gender
*/
public String getGender() {
return gender;
}
/**
* 设置
* @param gender
*/
public void setGender(String gender) {
this.gender = gender;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + ", gender = " + gender + "}";
}
}
学生工具类:
public class StudentUtil {
private StudentUtil() {
}
//工具类中的方法
public static int MaxAge(ArrayList<Student> arr){
int maxage = 0;
//循环获取学生对象的年龄
for (int i = 0; i < arr.size(); i++) {
if (maxage < arr.get(i).getAge()){
maxage = arr.get(i).getAge();
}
}
return maxage;
}
}
测试类:
public class TestDemo2 {
public static void main(String[] args) {
//创建学生对象并赋值给学生集合
// Student[] arr = new Student[3];
ArrayList<Student> arr = new ArrayList<>();
Student s1 = new Student("张三",20,"男");
Student s2 = new Student("李四",25,"男");
Student s3 = new Student("娜娜",21,"女");
arr.add(s1);
arr.add(s2);
arr.add(s3);
//调用方法
int i = StudentUtil.MaxAge(arr);
System.out.println(i);
}
}
static的注意事项:
static小结:
重识main方法
选择编辑按钮。
public class Test {
public static void main(String[] args) {
//String 数组的类型
//[] 表示这是数组
// args 数组名称
// 在低版本的java中用于接受键盘的输入
System.out.println(args.length);
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
}
运行结果:
3
hello
world
java
表明数组有三个String字符串组成
继承
面对对象三大特征:
封装,继承,多态。
封装:
继承
继承的学习要点
- 如何自己写继承(自己设计)
- 如何使用别人写的继承
什么时间用继承
继承的小结:
继承的特点
继承的特点小结
注意事项:
- 子类只能继承父类中非私有的成员。
练习:继承练习(自己设计一个继承体系)
public class Animal {
public void eat(){
System.out.println("吃饭");
}
public void drink(){
System.out.println("喝水");
}
}
public class Cat extends Animal{
public void catch_mice(){
System.out.println("抓老鼠");
}
}
public class Dog extends Animal {
public void special(){
System.out.println("看家");
}
}
public class Ragdoll extends Cat{
}
public class Dragon_Li extends Cat {
}
public class Huskies extends Dog{
public void destruction(){
System.out.println("拆家");
}
}
public class Teddy extends Dog{
public void coquetry(){
System.out.println("蹭一蹭");
}
}
public class Test {
public static void main(String[] args) {
Ragdoll r = new Ragdoll();
r.eat();
r.drink();
r.catch_mice();
System.out.println("====================================");
Huskies h = new Huskies();
h.destruction();
h.drink();
h.eat();
h.special();
}
}
子类可以继承的东西
继承的内存图
成员方法是否被继承
成员方法的继承的内存图
成员变量的访问特点:
public class Test {
public static void main(String[] args) {
zi z = new zi();
z.show();
}
}
class Fu{
String name = "FU";
String hobby = "喝茶";
}
class zi extends Fu{
String name = "zi";
String game = "吃鸡";
public void show(){
//打印zi
System.out.println(this.name);
//打印吃鸡
System.out.println(game);
//打印FU
System.out.println(super.name);
//打印喝茶
System.out.println(hobby);
}
}
成员方法的访问特点:
方法的重写
方法重写的本质
修改了虚方法表中的方法,如果方式重写,就会覆盖虚方法表中的方法
重写的注意事项
练习:利用方法的重写设计继承结构
public class Dog {
public void special(){
System.out.println("看家");
}
public void eat(){
System.out.println("吃饭");
}
public void drink(){
System.out.println("喝水");
}
}
public class Huskies extends Dog {
public void destruction(){
System.out.println("拆家");
}
@Override
public void eat(){
System.out.println("吃狗粮");
}
}
public class ShaPiDog extends Dog{
@Override
public void eat(){
System.out.println("吃狗粮,吃骨头");
}
}
public class tianYuanDog extends Dog{
@Override
public void eat(){
System.out.println("吃剩饭");
}
}
public class Test {
public static void main(String[] args) {
Demo.ChongXieTest.Huskies r = new Demo.ChongXieTest.Huskies();
r.eat();
r.drink();
r.eat();
r.destruction();
System.out.println("====================================");
tianYuanDog h = new tianYuanDog();
h.drink();
h.eat();
h.special();
System.out.println("====================================");
ShaPiDog s = new ShaPiDog();
s.drink();
s.eat();
s.special();
}
}
方法重写的总结:
继承中构造方法的访问特点:
public class fuClass {
public String name;
public int age;
public fuClass() {
System.out.println("父类的无参构造");
}
public fuClass(String name, int age) {
this.name = name;
this.age = age;
System.out.println("调用父类的有参构造");
}
}
public class ziClass extends fuClass{
public ziClass() {
super();
System.out.println("调用子类无参构造");
}
public ziClass(String name, int age) {
super(name, age);
System.out.println("调用子类有参构造");
}
}
public class test {
public static void main(String[] args) {
ziClass z = new ziClass();
ziClass z1 = new ziClass("小李",20);
}
}
this和super总结
练习:带有继承结构的标准javaBean
package Test.Test1;
public class Empyee {
private String id;
private String name;
private int price;
public void work(){
System.out.println("员工正在工作");
}
public void eat(){
System.out.println("员工正在吃饭");
}
@Override
public String toString() {
return "Empyee{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", price=" + price +
'}';
}
public Empyee() {
}
public Empyee(String id, String name, int price) {
this.id = id;
this.name = name;
this.price = price;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
package Test.Test1;
public class JinLi extends Empyee {
private int parc;
public JinLi() {}
public JinLi(String id, String name, int price, int parc) {
super(id, name, price);
this.parc = parc;
}
@Override
public void work() {
System.out.println("管理他人");
}
@Override
public String toString() {
return "JinLi{" +
"parc=" + parc +
'}';
}
}
package Test.Test1;
public class Cook extends Empyee{
public Cook() {
}
public Cook(String id, String name, int price) {
super(id, name, price);
}
@Override
public void work() {
System.out.println("炒菜");
}
}
package Test.Test1;
public class Test2 {
public static void main(String[] args) {
JinLi j = new JinLi("heima001","小赵",12000,8000);
j.work();
j.eat();
System.out.println("“========================”");
Cook c = new Cook();
c.setId("www");
c.setName("小王");
c.setPrice(18888);
c.work();
c.eat();
}
}
练习二:
public class Employee {
private String name;
private String id;
public void work(){
System.out.println("工作");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Employee() {
}
public Employee(String name, String id) {
this.name = name;
this.id = id;
}
}
package Test.Test2;
public class Teacher extends Employee{
public Teacher() {
}
public Teacher(String name, String id) {
super(name, id);
}
}
package Test.Test2;
public class AdminStaff extends Employee{
public AdminStaff() {
}
public AdminStaff(String name, String id) {
super(name, id);
}
}
package Test.Test2;
public class Lectuer extends Teacher{
@Override
public void work() {
System.out.println("讲师工作");
}
public Lectuer() {
}
public Lectuer(String name, String id) {
super(name, id);
}
}
package Test.Test2;
public class Tutor extends Teacher{
@Override
public void work() {
System.out.println("助教工作");
}
public Tutor() {
}
public Tutor(String name, String id) {
super(name, id);
}
}
package Test.Test2;
public class Maintainer extends AdminStaff{
@Override
public void work() {
System.out.println("维护专员工作");
}
public Maintainer() {
}
public Maintainer(String name, String id) {
super(name, id);
}
}
package Test.Test2;
public class Buyer extends AdminStaff{
@Override
public void work() {
System.out.println("采购专管员工作");
}
public Buyer() {
}
public Buyer(String name, String id) {
super(name, id);
}
}
package Test.Test2;
public class Test {
public static void main(String[] args) {
Lectuer l = new Lectuer("小李","heima111");
l.work();
Maintainer m = new Maintainer();
m.work();
}
}
课后练习
第一题
第一题:
需求:
在黑马程序员中有很多员工(Employee)。
按照工作内容不同分教研部员工(Teacher)和行政部员工(AdminStaff)
教研部根据教学的方式不同又分为讲师(Lecturer)和助教(Tutor)
行政部根据负责事项不同,又分为维护专员(Maintainer),采购专员(Buyer)
公司的每一个员工都编号,姓名和其负责的工作
每个员工都有工作的功能,但是具体的工作内容又不一样。
答案同上。
第二题:
第二题:
需求:
在传智教育的tlias教学资源管理系统中,存在学生、老师角色会进入系统。
分析:
学生信息和行为(名称,年龄,所在班级,查看课表,填写听课反馈fillForm)
老师信息和行为(名称,年龄,部门名称,查看课表,发布问题publishForm)
定义角色类作为父类包含属性(名称,年龄),行为(查看课表)
定义子类:学生类包含属性(所在班级),行为(填写听课反馈)
定义子类:老师类包含属性(部门名称),行为(发布问题)
package Test.workTest2;
public class User {
private String name;
private int age;
public void look(){
System.out.println("查看课表");
}
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 User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
class Teacher extends User{
//部门名称
private String workname;
public void work(){
System.out.println("发布问题");
}
public String getWorkname() {
return workname;
}
public void setWorkname(String workname) {
this.workname = workname;
}
public Teacher(String workname) {
this.workname = workname;
}
public Teacher(String name, int age, String workname) {
super(name, age);
this.workname = workname;
}
}
class student extends User{
private String classname;
public void leanclass(){
System.out.println("填写上课反馈");
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
public student(String classname) {
this.classname = classname;
}
public student(String name, int age, String classname) {
super(name, age);
this.classname = classname;
}
}
package Test.workTest2;
public class Test {
public static void main(String[] args) {
student s = new student("小李",18,"后端一期");
System.out.println(s.getClassname());
s.leanclass();
s.look();
System.out.println("====================");
Teacher t = new Teacher("老王",40,"教学部");
System.out.println(t.getWorkname());
t.look();
t.work();
}
}
第三题:
第三题:
需求:
完成代码(按照标准格式写),然后在测试类中测试。
1.手机类Phone
属性:品牌brand,价格price
无参构造,有参构造
行为:打电话call,发短信sendMessage,玩游戏playGame
2.测试类
创建Phone类对象,调用Phone类中的方法
思考:
假设所有的手机都有属性屏幕的尺寸(int size),而且假设所有手机的屏幕尺寸为6,应该如何实现?
提示:
可以把size定义为静态
package Test.Test3;
public class Phone {
private String brand;
private int price;
public static int size;
public void call(){
System.out.println("打电话");
}
public void sendMessage(){
System.out.println("发短信");
}
public void playGame(){
System.out.println("玩游戏");
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public Phone(String brand, int price) {
this.brand = brand;
this.price = price;
this.size = 6;
}
public Phone() {
this.size = 6;
}
public static int getSize() {
return size;
}
public static void setSize(int size) {
Phone.size = size;
}
@Override
public String toString() {
return "Phone{" +
"brand='" + brand + '\'' +
", price=" + price + "xiae:"+
size+
'}';
}
}
package Test.Test3;
public class Test {
public static void main(String[] args) {
Phone p = new Phone();
System.out.println(p);
p.call();
p.sendMessage();
p.playGame();
}
}