1.包
(一)包的命名规范
(二)常用包
(三)导入包
(四)Package
一个类最多只有一个package语句,即一个类最多只有一个所属包,并且这个语句要放在整个类的最上边
2.访问修饰符
(1)4种访问修饰符
3.面向对象的三大特征:封装,继承,多态
(一)封装(encapsulation)
封装的作用是可以为变量初始化设置判断条件
例如:Account类用来为变量设置初始值并加判断条件,AccountTest类用来测试
//file:Account.java
package com.xylearn;
public class Account {
String name;
double extra;
String password;
//构造器
public Account(String name, double extra, String password) {
setName(name);
setExtra(extra);
setPassword(password);
}
public String getName() {
return name;
}
public void setName(String name) {
if(name.length()==2||name.length()==3||name.length()==4){
this.name = name;
}else{
System.out.println("Invalid name!");
this.name = "无名氏";
}
}
public double getExtra() {
return extra;
}
public void setExtra(double extra) {
if(extra>20){
this.extra = extra;
}else{
System.out.println("Invalid extra!");
this.extra = 0;
}
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
int len=password.length();
if(len==6){
this.password = password;
}else{
System.out.println("Invalid password!");
this.password = "xxxxxx";
}
}
public void info(){
System.out.println("Name: "+name);
System.out.println("Extra: "+extra);
System.out.println("Password: "+password);
}
}
//file:AccountTest.java
package com.xylearn;
public class AccountTest {
public static void main(String[] args) {
Account myAccount=new Account("shaw",350.2,"1234567");
myAccount.info();
}
}
(二)继承(extend)
继承的主要作用是代码复用 ,子类继承父类的属性和方法
(1)
父类—基类—超类
子类—派生类
继承语法
class 子类 extend 父类(){}
(2)继承使用细节
细节一
这里“要通过父类提供公共的方法去访问”意思是指:
…需要在父类的方法中将其return,这样就能访问到私有属性;
…需要在父类的方法a()中调用私有方法b(),这样就能通过调用a()来实现调用父类私有方法;
细节二
在创建子类对象时,会先调用父类的无参构造器,再调用子类的无参构造器;
细节三
细节四
注意点:构造器的第一行,在没有this()的情况下,都会默认有一个super()方法,会去找父类的无参构造器;若有this(),则一定没有super();
因为this()和super()都必须默认在构造器的第一行
细节五
细节六
(1)java是单继承制,子类最多只能继承一个父类,如果想让A同时继承B类和C类,可以让A继承B,然后B继承C,这样A就能间接继承C了;
(三)继承的内存布局
son—>father—>grandpa,当new son()时,内存中的变化情况:
(四)super()方法的注意事项
即父类(广义)中有同名属性。会按照:爸爸—>爷爷—>太爷爷的顺序去找;
(五)super()和this()的区别
易错题:super()方法和this()构造器只能放在方法的第一行,所以第一行有this()时,就默认没有super()了
(六)方法重写
(七)方法重载和重写的区别
(八)多态
(1)对象多态是多态的核心
举个例子:
(2)多态细节
向上转型:
向下转型
向上/下转型的案例:
**Person类:父类
public class Test {
public static void main(String[] args) {
//向上转型
Person person=new Student();
person.run();//方法按照运行类型找,运行类型没有才会去父类找
person.eat();
//向下转型:向下转型的前提是内存中的对象必须真的为子类型
Student student=(Student)person;
student.study();
}
}
**Student类:子类
public class Student extends Person {
public void study(){
System.out.println("Student is studying");
}
public void run(){
System.out.println("Student is running");
}
}
**Test类:测试类
public class Test {
public static void main(String[] args) {
//向上转型
Person person=new Student();
person.run();//方法按照运行类型找,运行类型没有才会去父类找---Student is running
person.eat();---Person is eating
//向下转型:向下转型的前提是内存中的对象必须真的为子类型
Student student=(Student)person;
student.study();---Student is studying
}
}
(3)属性的重写
Animal animal=new Dog();
System.out.println(animal.name);这里的name去Animal类里面找-编译类型
animal.eat();这里的eat()方法去Dog类里找-运行类型
属性的重写要看类的编译类型(等号左侧),方法的重写看类的运行类型(等号右侧)
(九)java的动态绑定机制
4.object类
(一)equal()方法
Object对象的equal()方法是用来比较引用类型,即判断两对象的地址是否相同;String和Integer这些类重写父类Object的equal()方法,使得equal()方法可以比较值而不是引用;
(二)hashCode()方法
(三)toString()方法
可以“alt+insert”去重写toString()方法
(四)finalize()方法
Object的默认处理不会做任何释放资源的操作;
5.debug技巧
(1)shift+F7:逐行执行代码,alt+shift+F7可以强制进入封装好的系统给的方法中;
(2)shift+F8是跳出当前方法,继续执行;
(3)shift+F9是直接跳到下一个断点;
(4)可以在debug的过程中动态下断点;