面向对象的编程基础
定义
public class person {
String name;
int age;
char sex;
person(String name,int age,char sex)
{
this.age=age;
this.name=name;
this.sex=sex;
}
person()
{}
}
public class Main {
public static void main(String[] args) {
person p1 = new person(); //这两个变量分别引用的是不同的两个对象
person p2 = new person();
person p3=p1;
System.out.println(p1 == p3);
System.out.println(p1 == p2); //如果两个变量存放的是不同对象的引用,那么肯定就是不一样的了
}
}
true
false
public class Main {
public static void main(String[] args) {
person p1 = new person(); //这两个变量分别引用的是不同的两个对象
p1.setName("coleak");
System.out.println(p1.getName());
}
}
public class person {
String name;
int age;
char sex;
person(String name,int age,char sex)
{
this.age=age;
this.name=name;
this.sex=sex;
}
person()
{}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
这里输入set和get可以自动将函数补全,传参初始化在构造属性之后
方法重载
int sum(int a, int b){
return a + b;
}
double sum(double a, double b){ //为了支持小数加法,我们可以进行一次重载
return a + b;
}
执行顺序
public class Main {
public static void main(String[] args) {
person p1 = new person("coleak",19,'n');
System.out.println(p1.name);
}
}
public class person {
String name="cc";
int age=1;
char sex='n';
person(String name,int age,char sex)
{
System.out.println(this.name);
this.age=age;
this.name=name;
this.sex=sex;
}
{
System.out.println(this.name);
this.name="ccccc";
}
}
cc
ccccc
coleak
这里说明先构造属性,再执行代码块,再初始化
静态变量和方法
public class Main {
public static void main(String[] args) {
person p1 = new person("coleak",19,'n');
for(int i=0;i<3;i++) {
person p = new person();
}
System.out.println(person.num);
person.test();
}
}
public class person {
String name="cc";
int age=1;
char sex='n';
static int num=0;
person()
{
num++;
}
person(String name,int age,char sex)
{
this.age=age;
this.name=name;
this.sex=sex;
num++;
}
static void test()
{
System.out.println(num);
//System.out.println(age);不能调用非static的成员变量和方法
}
static {
System.out.println("静态代码块");
}
}
静态代码块
4
4
加载顺序
public class person {
String name = test();
int age;
String sex;
{
System.out.println("我是普通代码块");
}
person(){
System.out.println("我是构造方法");
}
String test(){
System.out.println("我是成员变量初始化");
return "小明";
}
static String info = init();
static {
System.out.println("我是静态代码块");
}
static String init(){
System.out.println("我是静态变量初始化");
return "test";
}
}
public class Main {
public static void main(String[] args) {
person p=new person();
}
}
我是静态变量初始化
我是静态代码块
我是成员变量初始化
我是普通代码块
我是构造方法
包和访问控制
package com.test;
import com.test.entity.*;
public class Main {
public static void main(String[] args) {
person p=new person();
p.name="coleak";
java.lang.System.out.println(p.name);
}
}
package com.test.entity;
public class person {
public String name; //这里我们用test方法的返回值作为变量的初始值,便于观察
int age;
String sex;
public person(){
System.out.println("我是构造方法");
}
}
类的封装
快速构造,点击生成,构造函数,全选即可。
package com.test;
import com.test.entity.*;
public class Main {
public static void main(String[] args) {
person p=new person("coleak",18,"nan");
java.lang.System.out.println(p.getName());
p.setName("xax");
System.out.println(p.getName());
p.setName("cc");
System.out.println(p.getName());
}
}
package com.test.entity;
public class person {
private String name; //这里我们用test方法的返回值作为变量的初始值,便于观察
private int age;
private String sex;
public person()
{
System.out.println("我是构造方法");
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
if (name.contains("a")) return;
this.name = name;
}
public String getSex() {
return sex;
}
public person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
}
coleak
coleak
cc
类的继承
package com.test.entity;
public class student extends worker{
public student(String name, int age, String sex) {
super(name, age, sex);
}
public void stu(){
System.out.println("stu");
}
}
package com.test.entity;
public class person {
protected String name; //这里我们用test方法的返回值作为变量的初始值,便于观察
int age;
String sex;
public void per()
{
System.out.println("person");
}
person(){}
public person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
}
package com.test.entity;
public class worker extends person {
public worker(String name, int age, String sex) {
super(name, age, sex);
}
public void wor()
{
System.out.println("worker");
}
public worker(){}
}
package com.test;
import com.test.entity.*;
public class Main {
public static void main(String[] args) {
student s1=new student("coleak",19,"nan");
s1.wor();
s1.stu();
s1.per();
person w1=new worker();//以父之名,只能访问父类的内容
w1.per();
worker w2=(worker) w1;//强制类型转换,原本就是worker的情况
w2.wor();
w2.per();
if(w1 instanceof worker&&w1 instanceof person)//对应类型或者是其继承类
{
System.out.println("YES");
}
}
}
worker
stu
person
person
worker
person
YES
与父类同名属性,就近原则使用本身的属性值。
访问父类时加上super.name
object类
package com.test;
import com.test.entity.*;
public class Main {
public static void main(String[] args) {
student s1=new student("coleak",19,"nan");
student s2=s1;
student s3=new student("coleak",19,"nan");
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s1);//默认调用tostring
}
}
true
false
com.test.entity.student@3ac3fd8b
方法重写
final 无法重写,无法重新赋值,无法继承
子类无法低于父类的可见性
package com.test.entity;
public class person {
protected String name; //这里我们用test方法的返回值作为变量的初始值,便于观察
int age;
String sex;
person() {
}
;
public person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof person) { //只有是当前类型的对象,才能进行比较,要是都不是这个类型还比什么
person person = (person) obj; //先转换为当前类型,接着我们对三个属性挨个进行比较
return this.name.equals(person.name) && //字符串内容的比较,不能使用==,必须使用equals方法
this.age == person.age && //基本类型的比较跟之前一样,直接==
this.sex.equals(person.sex);
}
return false;
}
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
package com.test;
import com.test.entity.*;
public class Main {
public static void main(String[] args) {
student s1=new student("coleak",19,"nan");
student s2=s1;
student s3=new student("coleak",19,"nan");
System.out.println(s1.equals(s3));//调用重写后的函数,实际对象是student
System.out.println(s1);
}
}
true
person{name=‘coleak’, age=19, sex=‘nan’}
抽象类
子类如果不是抽象类则不实现父类的抽象方法会报错
无法直接调用抽象类的实例方法去构造对象
package com.test.entity;
public abstract class person {
protected String name; //这里我们用test方法的返回值作为变量的初始值,便于观察
int age;
String sex;
public person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
protected abstract void eaxm();
}
package com.test.entity;
public class student extends worker{
public student(String name, int age, String sex) {
super(name, age, sex);
}
@Override
public void learn() {
System.out.println("学生学习");
}
public void stu(){
System.out.println("stu");
}
}
package com.test.entity;
public abstract class worker extends person {
public worker(String name, int age, String sex) {
super(name, age, sex);
}
@Override
protected void eaxm() {
}
protected abstract void learn();
}
package com.test;
import com.test.entity.*;
public class Main {
public static void main(String[] args) {
student s1=new student("coleak",19,"nan");
s1.learn();
}
}
接口
继承只能单继承,但是可以连接多个接口
接口可以继承,且继承父类的全部方法,因此子接口被引用时,类需要实现其父接口的所有方法
package com.test;
import com.test.entity.*;
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Study s1=new student("coleak",19,"nan");
s1.study();
student s2=(student) s1;
s2.test();
s2.test2();
System.out.println(Study.a);
System.out.println(s1.a);
System.out.println(s2.a);
System.out.println(student.a);
//s1.test2();报错,只能使用接口内定义的方法
student clone= (student) s2.clone();
System.out.println(clone==s2);
}
}
package com.test.entity;
public class student extends worker implements Study,Cloneable{
public student(String name, int age, String sex) {
super(name, age, sex);
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public void study() {
System.out.println("stu");
}
public void test2()
{
System.out.println("test2");
}
}
package com.test.entity;
public interface Study {
void study();
//设置默认实现,子类可以不重写
default void test()
{
System.out.println("默认实现");
}
public static final int a=10;//默认就是这个
}
stu
默认实现
test2
10
10
10
10
false文章来源:https://www.toymoban.com/news/detail-414749.html
枚举类
package com.test.entity;
public class student {
private Status status;
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
}
package com.test.entity;
public enum Status {
RUNNING("睡觉"), STUDY("学习"), SLEEP("睡觉"); //无参构造方法被覆盖,创建枚举需要添加参数(本质就是调用的构造方法)
private final String name; //枚举的成员变量
Status(String name){ //覆盖原有构造方法(默认private,只能内部使用!)
this.name = name;
}
public String getName() { //获取封装的成员变量
return name;
}
}
package com.test.entity;
public class Main {
public static void main(String[] args) {
student s1=new student();
s1.setStatus(Status.SLEEP);
System.out.println(s1.getStatus().name());
System.out.println(s1.getStatus().getName());
// System.out.println(s1.);
}
}
SLEEP
睡觉文章来源地址https://www.toymoban.com/news/detail-414749.html
到了这里,关于【java】面向对象的编程基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!