定义了一个类
成员变量:
成员方法:setXXX()/GetXXX()
study(),sleep()...
构造方法:
有参构造方法/无参构造方法
例如一个学生类
public class Student {
//成员变量
private String name ;//姓名
private int age ;//年龄
private String gender;//性别
//无参构造方法:
public Student() {
}
有参构造方法
public Student(String name, int age, String gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
//SetXXX()getXXX():公共的访问方法
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 String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
//学习的方法
public void study(String name) {
System.out.println(name+"...");
}
public void sleep() {
System.out.println("...");
}
测试类
public class StudentTest {
public static void main(String[] args) {
//创建学生类对象
//方式1:无参构造+setXXX()进行赋值
Student student = new Student() ;
System.out.println(student);//wesetos.org.demo1.Student@70dea4e
student.setName("哈哈");
student.setAge(27);
student.setGender("男");
System.out.println(student.getName()+"---"
+student.getAge()+"---"
+student.getGender());
//调用成员方法
student.study("刚刚");
student.sleep();
//方式2:直接有参构造进行赋值
Student student2 = new Student("诗诗", 28, "女") ;
System.out.println(student2.getName()+"---"
+student2.getAge()+"---"
+student2.getGender());
student2.study("诗诗");
student2.sleep();
1)成员变量
2)构造方法: 无参构造方法/有参构造方法
3)成员方法
//自定义一个类
class Demo{
//成员变量
private int num ;
//构造方法:方法名和类名一样,没具体的返回值并且连void都没有
//在一个类中如果没有给出无参构造方法,系统默认给定,给出了无参构造方法,系统不会默认给出了!
//构造方法的作用就是给对象进行初始化的!
//当我们开发这只要给定有参构造方法,系统不会再提供无参构造方法
public Demo() {
System.out.println("调用了无参构造方法");
}
成员方法分类
是否有返回值
有返回值类型的方法
没有返回值类型的方法,void方法
是否有参数进行划分
有参数的方法
无参数的方法
在Java语言,用{}括起来的内容,简称为代码块!
代码块的分类:
局部代码块
书写的位置,是在方法中定义的{代码...}
作用:限定变量的生命周期的
构造代码块
在类的成员位置,每次在执行构造方法之前,如果当前类中有构造代码块,优先执行构造代码块,在执行构造方法
作用:如果多个类的构造方法中有共有的内容,可以将抽取到构造代码块中
静态代码块
在类的成员位置,在{} 外面被static,静态代码块
优先于对象存在!
静态代码块只执行一次,优先执行
静态代码块>构造代码块>构造方法
//自定义类:Code
class Code{
//Code类的成员位置
//构造代码块
{
int x = 100;
System.out.println(x);
}
//无参构造方法
public Code() {
System.out.println("code...");
}
//静态代码块
static {
int x = 1000 ;
System.out.println(x);
}
//有参构造方法
public Code(int a) {
System.out.println("code...");
}
//构造代码块
{
int y = 200 ;
System.out.println(y);
}
static {
int y = 2000;
System.out.println(y);
}
}
1)在静态方法中,是没有this关键字
被静态修饰的是随着类的加载而加载,this随着对象的创建而存在
静态优先于对象存在!
被静态修饰的内容一般称为:类成员
2)访问的问题
在静态方法中,
针对成员变量:只能访问静态的成员变量
针对成员方法:只能访问静态的成员方法
在非静态方法中
成员变量:既可以访问静态成员变量,也可以访问非静态的成员变量
成员方法:既可以访问静态的成员方法,也可以访问非静态的成员方法
格式:
class 子类名(派生类) extends 父类名(超类){
}
继承的好处:
1)提高代码的复用性
2)后期利于维护
3)继承关系是多态的前提
Java中的开发原则:
任何java的设计原则都要遵循当前开发原则:
低耦合,高内聚
耦合:类和类之间的关系
内聚:完成功能的执行能力
继承的特点:
在Java语言中,只支持单继承,不支持多继承
但是,可以支持多层继承!
举例
class Son extends 父类1{
}
//多继承 ,java不支持,但是其他语言有这种写法.
class Son extends 父类1,父类2...{
}
class GrandFather{
public void method() {
System.out.println("我是爷爷...");
}
}
class Father extends GrandFather{
public void show() {
System.out.println("我是爸爸...");
}
}
//class Mother{
//
//
//}
//支持单继承
class Son extends Father{
public void function() {
System.out.println("functon Son....");
}
}
//class Son extends Father,Monther{ //不支持多继承
//}
//测试类
public class ExtendsDemo {
public static void main(String[] args) {
//创建Son类对象
Son s = new Son() ;
s.function();
s.method();
s.show();
}
}
继承的注意事项:
1)子类继承父类,只能继承父类的非私有的(成员变量和成员方法)
2)子类不能继承父类的构造方法,只能通过super(等会讲)间接的去访问父类的构造方法
3)继承的使用:不要了部分功能去使用继承!
举例:
class A{
public void show(){}
public void show2(){}
}
class B{
public void show2(){}
public void show3() {}
}
直接使用继承可以了
B类改进一下
class B extends A{
public void show3() {}
}
虽然可以使用继承,但是B类虽然继承A类,拿到了show2()方法,但是同时也讲show()方法,而show()可能需要.
什么时候使用继承!
如果A类是B类的一种,这种并且能体现出是一种"is a"的关系,就使用继承!
举例:
人
学生
老师
水果
西瓜
苹果
class Fu{
private int num = 10 ;
public int num2 = 50 ;
//私有的
private void method() {
System.out.println(num);
System.out.println(num2);
}
public void function() {
System.out.println("function fu");
}
}
//子类
class Zi extends Fu{
public void show() {
// System.out.println(num);//num私有的
System.out.println(num2);
}
}
//测试类
public class ExtendsDemo2 {
public static void main(String[] args) {
Zi z = new Zi();
z.function();
// z.method() ; //私有的
System.out.println(z.num2);
// System.out.println(z.num);
z.show();
}
}
子类继承父类的时候,如果子类的成员变量名称和父类成员变量名称不一致的情况,分别输出即可!
如果子类继承父类的时候,子类中的变量名称如果和父类名称一致的情况
1)先在子类的局部位置找是否有这个变量,有,就输出
2)如果在类的局部位置找不到,再去子类的成员位置找,是否有这个变量名,有就输出
3)如果在子类的成员位置中找不到,直接就去父类的成员位置中找,有就输出
4)如果还找不到,直接报错!
class Father2{
public int num = 10 ;
/*public void method() {
int num = 200;
System.out.println(num);
}*/
}
class Son2 extends Father2{
// public int num2 = 20 ;
// int num = 20; //子类成员变量
public Son2() {
}
public void show() {
// int num = 30 ;//子类的局部变量
System.out.println(num);
// System.out.println(num2);
}
}
//测试类
public class ExtendsDemo3 {
public static void main(String[] args) {
Son2 s = new Son2() ;
s.show();
}
}
子类继承父类的时候,super可以间接父类的构造方法
this:当前类的对象
super:代表父类对象(父类空间标识)
子类继承父类的时候,子类的所有的构造方法,都默认访问父类的无参构造方法
class Father3{
public Father3(){
System.out.println("这是父类的无参构造方法");
}
}
class Son3 extends Father3{
public Son3() {
//隐藏语句
super() ;
System.out.println("这是子类的无参构造");
}
public Son3(String name) {
super() ;
System.out.println("这是子类的有参构造");
}
}
public class ExtendsDemo4 {
public static void main(String[] args) {
Son3 s = new Son3(); //创建子类对象
//构造方法的作用:给对象进行初始化的
//继承关系:先让父类初始化,然后再是子类数据初始化
Son3 s2 = new Son3("hello") ;
}
}