包
包:区分名字相同的类;管理很多的类;控制访问范围
package com.hspedu(包名字)
包的本质:创建文件夹来保存类文件
常用的包
java.lang 默认的 不需要import
java.util
java.net
java.awt
import java.util.Scanner; //只引入Scanner类
import java.util.*; //引入util包下所有的类
package import 位置:
package com.edu.pkg;
import java.util.Scanner;
public class detail {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
}
}
访问修饰符
四种,用于控制方法和属性的访问权限
public 同类 同包 子类 不同包
protected 同类 同包 子类
默认 同类 同包
private 同类
封装encapsulation
步骤:
1.将属性private(不能直接修改属性)
2.提供一个public set方法,对属性判断并赋值,如判断是不是合理的年龄
3.提供一个public get方法,获取属性的值,因为不在同一个类获取不到private属性
[alt+insert] getter and setter
package com.edu.encap;
public class Encap01 {
public static void main(String[] args) {
Person person = new Person();
// person.name = "jack";
// person.age = 3000; //private只能访问同一个class
person.setName("jackkkkkk");
person.setAge(30);
person.setSalary(30000);
System.out.println(person.info());
}
}
class Person{
public String name;
private int age;
private double salary;
public String getName() {
return name;
}
public void setName(String name) {
if(name.length() >= 2 && name.length() <= 6){
this.name = name;
} else{
System.out.println("需要2-6");
this.name = "无名";
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age >= 1 && age <=120){
this.age = age;
} else{
System.out.println("年龄需要在1-120");
this.age = 18;
}
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String info(){
return "信息为 name=" + name + " age=" + age + " 薪水=" + salary;
}
}
在构造器中仍能使用set判断的方法:
public Person(String name, int age, double salary) {
// this.name = name;
// this.age = age;
// this.salary = salary;
setName(name);
setAge(age);
setSalary(salary);
}
继承extends
两个类的属性很多是相同的,解决代码复用的问题(比如小学生类有年龄姓名等属性,大学生类也有年龄姓名的属性)
抽象出父类,在父类中定义
public class Pupil extends Student
子类不能访问父类private的属性和方法,需要在父类用public中转才可以调用
public class Base {
private int n = 10;
public int getN() {
return n;
}
private void test40(){
System.out.println("test40");
}
public void callTest40(){
test40();
}
}
public class Sub extends Base{
}
public class ExtendDetail{
public static void main(String[] args) {
Sub sub = new Sub();
int cur = sub.getN();
System.out.println(cur);
sub.callTest40();
}
}
子类必须调用父类的构造器
public class Base {
public Base(){
//父类构造器
}
}
public class Sub extends Base{
public Sub(){
//子类构造器
}
}
public class ExtendDetail{
public static void main(String[] args) {
Sub sub = new Sub(); //调用父类构造器 + 子类构造器
}
父类不能没有无参构造器,如果没有,用super指定一个别的构造器;
如果想调用别的构造器,用super指定
public class Base {
public Base(){
//父类构造器
}
public Base(String name){
//父类有参构造器
}
}
public class Sub extends Base{
public Sub(){
//子类构造器
super("smith");
}
}
Object类是所有类的父类(ctrl + h)
super关键字
super----父类的引用,访问父类的属性,方法,构造器(private不行)
子类B: 方法sum() -----调用cal()------3种方法
cal(); 从子类开始查找,往父类继续查
this.cal(); 等价于cal();
super.cal(); 从父类开始查找
父类 A 方法cal()