方法(函数)重载
- 方法名一样,参数不一样,与返回值无关
- 参数的个数不一样
- 参数的类型不一样
- 如果参数个数一样,类型也一样,但是顺序要不一样
- 普通方法和构造方法都能重载
java内存(了解)
- java的内存包含栈、堆、方法区、寄存器
- 栈:先进后出,局部变量、方法都在栈中
- 堆:new出来的对象就在堆
- 两个引用(变量)指向同一个对象:Student s = new Student(); Student s2 = s;
封装(Encapsulation)
- 将代码通过方法的形式将一些代码细节包装起来,防止外部代码的随机访问
- 要访问这些数据就必须通过调用函数来完成
- 三大特征都是为了少写代码、少修改代码
- 好处:提高了代码的阅读性、提高了代码的可维护性
- 体现:方法、对象、private get/set
- get/set和构造方法都可以对成员变量进行赋值
继承(inherit)
- java中的继承:两个类之间通过extends关键字来描述父子关系,子类便可拥有父类的非私有成员
- 生活中的继承:子承父业
- 解决问题:提高了代码复用性、代码的维护性更高
- 语法:
public class 父类 {
}
public class 子类 extends 父类 {
} - 注意事项:
- 如果一个类不继承任何类,默认继承Object, Object是java中的祖宗类
- Java是单继承(一个类只能继承于一个类);多层继承,一个父类可以有多个子类
- 创建本类对象之前会先初始化父类对象
- 子类不能继承父类的private成员(属性,方法)
public class Car {
String color;
String brand;
int wheel;
/**构造方法定义和普通方法有区别
* 没有返回值
* 方法名和类名相同*/
public Car(){
System.out.println("Car无参构造");
}
/**方法重载:方法名一样,参数列表不一样(个数、类型)
* 普通方法和构造方法都可以使用*/
public Car(String color, String brand, int wheel){
System.out.println("Car有参构造");
//比如截取字符串函数substring
//substring(int start)
//substring(int start, int end)
//局部变量和成员变量同名,就近原则(先从方法内部找变量,找不到再去类中找)
//用this关键字解决问题,this.变量,强行去类中找变量
this.color = color;
this.brand = brand;
this.wheel = wheel;
}
public void start(){
System.out.println("启动");
}
public void stop(){
System.out.println("停止");
}
}
public class CarTest {
public static void main(String[] args) {
//创建对象
//这里Car()调用的无参构造方法,用来创建对象(初始化、实例化)
//构造方法特点:一个类中没有写构造方法时,java会提供一个默认的无参构造方法
//如果写了任意构造方法,java就不提供
//构造方法不能手动调用,只有new的时候才可以调用,一调用就创建了一个对象
//普通方法可以反复调用,用来实现业务逻辑,构造方法用来创建对象
Car c1 = new Car();
//调用对象的属性
c1.brand = "特斯拉";
c1.color = "黑色";
c1.wheel = 4;
System.out.println(c1.brand);
System.out.println(c1.color);
System.out.println(c1.wheel);
//调用对象的方法
c1.start();
c1.stop();
//调用时通过方法名+参数确定唯一的方法
Car c2 = new Car("白色", "保时捷", 4);
System.out.println(c2.brand);
System.out.println(c2.color);
System.out.println(c2.wheel);
c2.start();
c2.stop();
}
}
public class TwoObject {
public static void main(String[] args) {
//两个对象指向同一个地址值
Car c1 = new Car("白色", "保时捷", 4);
System.out.println(c1.brand);
System.out.println(c1.color);
System.out.println(c1.wheel);
System.out.println("---------");
// int a = 10;
// int b = a; 基本数据类型
//把c1的地址值赋值给c2,c1和c2两个对象指向同一个地址值
Car c2 = c1;
c2.brand = "法拉利";
c2.color = "红色";
System.out.println(c2.brand);
System.out.println(c2.color);
System.out.println(c1.brand);
System.out.println(c1.color);
System.out.println("---------");
System.out.println(c1);
System.out.println(c2);
System.out.println(c1 == c2);
}
}
public class Student {
/**private,私有,只能本类内访问*/
private int age;
String name;
/**利用get、set方法给private赋值*/
public void setAge(int age){
if(age >= 0 && age <= 120){
//年龄有效,可以赋值
this.age = age;
}else{
System.out.println("输入年龄无效");
}
}
public int getAge(){
return age;
}
public void study(){
//可以访问age
System.out.println(age);
}
}
public class EncapsulationDemo {
public static void main(String[] args) {
//封装
Student s1 = new Student();
s1.name = "张三";
//age为private,不能通过 s1.age = 19 赋值或取值
//s1.age = 19;
s1.setAge(19);
s1.setAge(-100);
System.out.println(s1.name);
System.out.println(s1.getAge());
}
}
public class Person {
String name;
int age;
int sex;
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("休息");
}
}
public class Teacher extends Person{
public void teach(){
System.out.println("教书育人");
}
}
public class InheritDemo {
public static void main(String[] args) {
//创建Teacher对象
//当一个类继承父类,无条件使用父类非私有成员
Teacher t = new Teacher();
t.name = "语文老师";
t.age = 50;
t.eat();
System.out.println(t.name);
System.out.println(t.age);
t.teach();
}
}