JavaOOP—封装/继承 encapsulation—封装 what? 封装:将类的某些信息【隐藏在类内部】,不允许外部程序【直接访问】,而是通过该类提供的方法来实现对隐藏信息的操作和访问
why?
良好的封装能够减少耦合(【松耦合】)
类内部的结构阔以自由修改
阔以对成员变量进行更精准的控制
隐藏信息,实现细节
how? 使用private访问修饰符修饰类的属性和方法
两大原则:
1、把属性隐藏起来
2、把尽可能多的东西隐藏起来,对外提供便捷的接口
实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 Dog.javapublic class Dog { private String name = "无名氏" ; private int health = 100 ; private int love = 0 ; private String strain = "拉布拉多" ; 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<0 || health>100 ){ System.out.println("你输入的健康值违规,已默认重置为60" ); this .health = 60 ; return ; } this .health = health; } public int getLove () { return love; } public void setLove (int love) { if (love<0 || love>100 ){ System.out.println("你输入的亲密度值违规,已默认重置为60" ); this .love = 60 ; return ; } this .love = love; } public String getStrain () { return strain; } public void setStrain (String strain) { this .strain = strain; } public void print () { System.out.println("我的名字叫做:" + name+ ",健康值为:" +health +",你和我的亲密度为:" + love + ",我的品种为:" + strain ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 Penguin.java public class Penguin { private String name = "无名氏" ; private int health = 100 ; private int love = 0 ; private String gender = "Q仔" ; 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<0 || health>100 ){ System.out.println("你输入的健康值违规,已默认重置为60" ); this .health = 60 ; return ; } this .health = health; } public int getLove () { return love; } public void setLove (int love) { if (love<0 || love>100 ){ System.out.println("你输入的亲密度值违规,已默认重置为60" ); this .love = 60 ; return ; } this .love = love; } public String getGender () { return gender; } public void setGender (String gender) { this .gender = gender; } public void print () { System.out.println("我的名字叫做:" + name+ ",健康值为:" +health +",你和我的亲密度为:" + love + ",我的性别为:" + gender ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 Test.java import java.util.Scanner;public class Test { public static void main (String[] args) { Scanner input = new Scanner(System.in); System.out.println("欢迎光临洋群满满宠物店!" ); System.out.print("请输入你想要领养宠物的类型:1:狗狗 2:企鹅 :" ); int strain = input.nextInt(); switch (strain){ case 1 : System.out.print("请输入你想要领养狗狗的名字:" ); String name = input.next(); System.out.print("请输入你想要领养狗狗的健康值:" ); int health = input.nextInt(); System.out.print("请输入你想要领养狗狗的亲密度:" ); int love = input.nextInt(); System.out.print("请输入你想要领养狗狗的品种:" ); String type = input.next(); Dog dog = new Dog(); dog.setName(name) ; dog.setHealth(health); dog.setLove(love); dog.setStrain(type); dog.print(); return ; case 2 : System.out.print("请输入你想要领养企鹅的名字:" ); String name1 = input.next(); System.out.print("请输入你想要领养企鹅的健康值:" ); int health1 = input.nextInt(); System.out.print("请输入你想要领养企鹅的亲密度:" ); int love1 = input.nextInt(); System.out.print("请输入你想要领养企鹅的性别:" ); String type1 = input.next(); Penguin penguin = new Penguin(); penguin.setName(name1) ; penguin.setHealth(health1); penguin.setLove(love1); penguin.setGender(type1); penguin.print(); return ; } } }
Package—包 what? package是一个为了方便管理组织java文件的目录结构,并防止不同的java文件之间发生命名冲突而存在的一个java特性。不同的package中的类的名称阔以相同,只是在使用时需要带上package的名称加以区分;
why? 防止不同的java文件之间发生命名冲突而存在的一个java特性;
how? 包的命名规范:
1:包名由【小写字母】组成,不能以圆点开头或结尾
package mypackage;
2:包名之前最好加上唯一的前缀,通常使用组织导致的网络域名(【域名倒置】)
package.net.javagroup.mypackage;
3:包名后续部分依不同机构内部的活泛不同而不同
package net.javagroup.reaerch.powerproject;
使用顺序:package(只能有一句)—import(阔以有多句)—class
eg: JDK提供基本包
java.lang :虚拟机自动引入
java.util :提供一些实用类
java.io :输入、输出
private/default/protected/public—访问权限控制
修饰符
类包
同包[子类]
异包子类
异包非子类
PRIVATE
√
关注
关注
DEFAULT
√
√
关注
PROTECTED
√
√
√
PUBLIC
√
√
√
√
1 2 3 4 5 6 7 oop1.Person.javaclass Person { }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 oop1.Student.java public class Student { private int age; String name; protected String address; public String gender; public void m1 () { System.out.println(this .age); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 oop1.Test.java public class Test { public static void main (String[] args) { Student student = new Student(); System.out.println(student.name); System.out.println(student.address); System.out.println(student.gender); Person person = new Person(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 oop2.Test.java public class Test { public static void main (String[] args) { Student student = new Student(); System.out.println(student.gender); } }
Static—静态 what? 在java程序中static修饰的任何变量都是在编译时有系统【自动分配内存来储存】的,而所谓的静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间;
why?
优点:
当一个方法或者变量需要初始化加载,或者【经常被调用】的时候阔以加上static;因为用static修饰的方法阔以直接使用类名直接调用,不一定需要县实例化对 象,很大程度上简化了开发;
缺点:
初始化加载,比较占内存,所以【不经常使用】的方法,不建议加static
how? static修饰的变量: 1 2 3 4 5 6 7 8 9 Person.java public class Person { String name; int age; static char gender; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 Test.java public class Test { public static void main (String[] args) { Person p = new Person(); p.age = 16 ; p.name = "洋群满满" ; p.gender = '男' ; Person.gender = '男' ; } }
static修饰的方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 Person.java public class Person { String name; int age; static char gender; public void m1 () { System.out.println(this .age); System.out.println(gender); m2(); m3(); } public void m2 () { System.out.println("实例方法m2" ); } public static void m3 () { System.out.println(gender); Person.m4(); System.out.println("静态方法m3" ); } public static void m4 () { System.out.println("静态方法m4" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 Test.java public class Test { public static void main (String[] args) { Person p = new Person(); p.age = 16 ; p.name = "洋群满满" ; Person.gender = '男' ; p.m1(); Person.m3(); Math.random(); } }
static 修饰的代码块 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 Test.javapublic class Test { static int num = 100 ; static { num += 100 ; System.out.println(num); } static { num += 100 ; System.out.println(num); } public static void main (String[] args) { Test t1 = new Test(); Test t2 = new Test(); System.out.println(Test.num); } }
Extends—继承 what? 继承是面向对象重要的基石,原因他允许创建分等级层次的类;
why? 提高代码的【复用性】;
how? 普通的父子类继承代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 Dog.java public class Dog extends Pet { private String strain = "拉布拉多" ; public String getStrain () { return strain; } public void setStrain (String strain) { this .strain = strain; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Penguin.java public class Penguin extends Pet { private String gender = "Q仔" ; public String getGender () { return gender; } public void setGender (String gender) { this .gender = gender; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 Pet.java public class Pet { private String name; private int health; private int love; public Pet () { } public Pet (String name, int health, int love) { this .name = name; this .health = health; this .love = love; } public String getName () { return name; } public void setName (String name) { this .name = name; } public int getHealth () { return health; } public void setHealth (int health) { this .health = health; } public int getLove () { return love; } public void setLove (int love) { this .love = love; } public void print () { System.out.println("我的名字叫做:" + name+ ",健康值为:" +health +",你和我的亲密度为:" + love ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 Test.java import java.util.Scanner;public class Test { public static void main (String[] args) { Scanner input = new Scanner(System.in); System.out.println("欢迎光临洋群满满宠物店!" ); System.out.print("请输入你想要领养宠物的类型:1:狗狗 2:企鹅 :" ); int strain = input.nextInt(); switch (strain){ case 1 : System.out.print("请输入你想要领养狗狗的名字:" ); String name = input.next(); System.out.print("请输入你想要领养狗狗的健康值:" ); int health = input.nextInt(); System.out.print("请输入你想要领养狗狗的亲密度:" ); int love = input.nextInt(); System.out.print("请输入你想要领养狗狗的品种:" ); String type = input.next(); Dog dog = new Dog(); dog.setName(name) ; dog.setHealth(health); dog.setLove(love); dog.setStrain(type); dog.print(); return ; case 2 : System.out.print("请输入你想要领养企鹅的名字:" ); String name1 = input.next(); System.out.print("请输入你想要领养企鹅的健康值:" ); int health1 = input.nextInt(); System.out.print("请输入你想要领养企鹅的亲密度:" ); int love1 = input.nextInt(); System.out.print("请输入你想要领养企鹅的性别:" ); String type1 = input.next(); Penguin penguin = new Penguin(); penguin.setName(name1) ; penguin.setHealth(health1); penguin.setLove(love1); penguin.setGender(type1); penguin.print(); return ; } } }
使用修饰控制访问权限的父子类继承代码如下: 1 2 3 4 5 6 7 8 9 10 oop1.Person.java public class Person { private int age; protected String name; char gender; public String address; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 oop1.Student.java public class Student extends Person { public void m1 () { System.out.println(name); System.out.println(address); System.out.println(gender); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 oop2.Teacher.java public class Teacher extends Person { public void m1 () { System.out.println(name); System.out.println(address); } }